From e5a4003af5dcc176fa52419470f644f779a00a84 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Tue, 19 Sep 2023 00:29:50 -0700 Subject: [PATCH] Breaking: Use C++ 20 (#1382) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1382 X-link: https://github.com/facebook/react-native/pull/39437 Have been running into places where C++ 20 makes life easier for use like `std::bit_cast` (that one is easy to polyfill), in-class member initializer support for bitfields, designated initializers, defaulted comparison operator, concepts instead of SFINAE, and probably more. Our other infra is in the process of making this jump, or already has. This tests it out everywhere, across the various reference builds, to see if we have any issues. This is a bit more aggressive than I had previously communicated, but n - 1 is going to be a better long term place than n - 2. If we wanted to use `std::bit_cast` we would need one of: 1. GCC 11+ (~2.5 years old) 1. Clang 14 (~2.5 years old) 1. VS 16.11 (~2 years old) For mobile this means: 1. NDK 26 (still in Beta 😭) 1. XCode 14.3.0 (~6 months old) https://en.cppreference.com/w/cpp/compiler_support/20 That isn't quite doable yet, but we can start taking advantage of language features in the meantime. More of these will be supported in older toolchains. Anyone needing support for older C++ versions can lag behind on more recent changes. E.g. Yoga 2.0 supports C++ 14. bypass-github-export-checks Changelog: [Internal] Reviewed By: cortinico Differential Revision: D49261607 fbshipit-source-id: 38301204d56b7bc8410c2dda9c291da1b8d61ec1 --- Package.swift | 2 +- README.md | 2 +- Yoga.podspec | 2 +- build.gradle | 4 ++-- cmake/project-defaults.cmake | 2 +- java/build.gradle.kts | 6 +++--- javascript/CMakeLists.txt | 2 +- yoga/bits/BitCast.h | 1 + 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Package.swift b/Package.swift index 4c8d846f..15f94268 100644 --- a/Package.swift +++ b/Package.swift @@ -28,5 +28,5 @@ let package = Package( ] ) ], - cxxLanguageStandard: CXXLanguageStandard(rawValue: "c++17") + cxxLanguageStandard: CXXLanguageStandard(rawValue: "c++20") ) diff --git a/README.md b/README.md index 3fc4aeee..00972de2 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Yoga is an embeddable and performant flexbox layout engine with bindings for mul ## Building -Yoga's main implementation targets C++ 17 with accompanying build logic in CMake. A wrapper is provided to build the main library and run unit tests. +Yoga's main implementation targets C++ 20 with accompanying build logic in CMake. A wrapper is provided to build the main library and run unit tests. ```sh ./unit_tests diff --git a/Yoga.podspec b/Yoga.podspec index 847b3773..d2e48494 100644 --- a/Yoga.podspec +++ b/Yoga.podspec @@ -33,7 +33,7 @@ Pod::Spec.new do |spec| '-Werror', '-Wextra', '-Wconversion', - '-std=c++17', + '-std=c++20', '-fPIC' ] diff --git a/build.gradle b/build.gradle index f2787996..c553dd8f 100644 --- a/build.gradle +++ b/build.gradle @@ -6,8 +6,8 @@ */ plugins { - id("com.android.library") version "8.0.1" apply false - id("com.android.application") version "8.0.1" apply false + id("com.android.library") version "8.1.1" apply false + id("com.android.application") version "8.1.1" apply false id("io.github.gradle-nexus.publish-plugin") version "1.3.0" } diff --git a/cmake/project-defaults.cmake b/cmake/project-defaults.cmake index 8868ce93..08f50a4e 100644 --- a/cmake/project-defaults.cmake +++ b/cmake/project-defaults.cmake @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_POSITION_INDEPENDENT_CODE ON) diff --git a/java/build.gradle.kts b/java/build.gradle.kts index 5e2ee5d2..39575931 100644 --- a/java/build.gradle.kts +++ b/java/build.gradle.kts @@ -21,9 +21,9 @@ val ndkVersionProperty: String by rootProject.extra android { namespace = "com.facebook.yoga" - compileSdk = 33 - buildToolsVersion = "33.0.0" - ndkVersion = "23.1.7779620" + compileSdk = 34 + buildToolsVersion = "34.0.0" + ndkVersion = "25.1.8937393" defaultConfig { minSdk = 21 diff --git a/javascript/CMakeLists.txt b/javascript/CMakeLists.txt index 96400b70..44cbfceb 100644 --- a/javascript/CMakeLists.txt +++ b/javascript/CMakeLists.txt @@ -14,7 +14,7 @@ file(GLOB SOURCES CONFIGURE_DEPENDS include_directories(..) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) add_compile_definitions( EMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0) diff --git a/yoga/bits/BitCast.h b/yoga/bits/BitCast.h index eaca348c..13fb0e41 100644 --- a/yoga/bits/BitCast.h +++ b/yoga/bits/BitCast.h @@ -14,6 +14,7 @@ namespace facebook::yoga { // Polyfill for std::bit_cast() from C++20, to allow safe type punning // https://en.cppreference.com/w/cpp/numeric/bit_cast +// TODO: Remove when we upgrade to NDK 26+ template std::enable_if_t< sizeof(To) == sizeof(From) && std::is_trivially_copyable_v && -- 2.50.1.windows.1