aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Mauro <dmauro@google.com>2024-01-10 08:32:46 -0800
committerCopybara-Service <copybara-worker@google.com>2024-01-10 08:33:52 -0800
commitbcce85ef8d9042794a50e4afbbd2c672121ab0d2 (patch)
treed9313345d2884610a965474092ecdd96d9932197
parentbddf28e9230364e45637a4a8725387d57fdfb79c (diff)
downloadabseil-cpp-bcce85ef8d9042794a50e4afbbd2c672121ab0d2.tar.gz
Fix CMake compiled ABI options after f845e60acd880dbf07788a5a2c0dbad0f9c57231.
f845e60acd880dbf07788a5a2c0dbad0f9c57231 added an option to use C++20's <ordering> header but the CMake install configured this as an alias in C++17 when it is not available. Fixes #1597 PiperOrigin-RevId: 597258569 Change-Id: I40277d55702601e1686370bee6af9b7491fd2000
-rw-r--r--CMake/AbseilDll.cmake25
-rw-r--r--CMake/AbseilHelpers.cmake4
-rw-r--r--CMakeLists.txt37
3 files changed, 51 insertions, 15 deletions
diff --git a/CMake/AbseilDll.cmake b/CMake/AbseilDll.cmake
index bf273ceb..47f3beeb 100644
--- a/CMake/AbseilDll.cmake
+++ b/CMake/AbseilDll.cmake
@@ -627,17 +627,32 @@ include(CheckCXXSourceCompiles)
check_cxx_source_compiles(
[==[
#ifdef _MSC_VER
-# if _MSVC_LANG < 201700L
+# if _MSVC_LANG < 201703L
# error "The compiler defaults or is configured for C++ < 17"
# endif
-#elif __cplusplus < 201700L
+#elif __cplusplus < 201703L
# error "The compiler defaults or is configured for C++ < 17"
#endif
int main() { return 0; }
]==]
ABSL_INTERNAL_AT_LEAST_CXX17)
-if(ABSL_INTERNAL_AT_LEAST_CXX17)
+check_cxx_source_compiles(
+ [==[
+#ifdef _MSC_VER
+# if _MSVC_LANG < 202002L
+# error "The compiler defaults or is configured for C++ < 20"
+# endif
+#elif __cplusplus < 202002L
+# error "The compiler defaults or is configured for C++ < 20"
+#endif
+int main() { return 0; }
+]==]
+ ABSL_INTERNAL_AT_LEAST_CXX20)
+
+if(ABSL_INTERNAL_AT_LEAST_CXX20)
+ set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_20)
+elseif(ABSL_INTERNAL_AT_LEAST_CXX17)
set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_17)
else()
set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_14)
@@ -807,8 +822,8 @@ Cflags: -I\${includedir}${PC_CFLAGS}\n")
if(ABSL_PROPAGATE_CXX_STD)
# Abseil libraries require C++14 as the current minimum standard. When
- # compiled with C++17 (either because it is the compiler's default or
- # explicitly requested), then Abseil requires C++17.
+ # compiled with a higher minimum (either because it is the compiler's
+ # default or explicitly requested), then Abseil requires that standard.
target_compile_features(${_dll} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
endif()
diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake
index 5a6c57fd..18fb75ff 100644
--- a/CMake/AbseilHelpers.cmake
+++ b/CMake/AbseilHelpers.cmake
@@ -287,8 +287,8 @@ Cflags: -I\${includedir}${PC_CFLAGS}\n")
if(ABSL_PROPAGATE_CXX_STD)
# Abseil libraries require C++14 as the current minimum standard. When
- # compiled with C++17 (either because it is the compiler's default or
- # explicitly requested), then Abseil requires C++17.
+ # compiled with a higher standard (either because it is the compiler's
+ # default or explicitly requested), then Abseil requires that standard.
target_compile_features(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
endif()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ca74b80d..87f8ae82 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -236,20 +236,41 @@ if(ABSL_ENABLE_INSTALL)
PATTERN "testdata" EXCLUDE
)
+ # Rewrite options.h to use the compiled ABI.
file(READ "absl/base/options.h" ABSL_INTERNAL_OPTIONS_H_CONTENTS)
- if (ABSL_INTERNAL_AT_LEAST_CXX17)
- string(REGEX REPLACE
- "#define ABSL_OPTION_USE_STD_([^ ]*) 2"
- "#define ABSL_OPTION_USE_STD_\\1 1"
+
+ # Handle features that require at least C++20.
+ if (ABSL_INTERNAL_AT_LEAST_CXX20)
+ foreach(FEATURE "ORDERING")
+ string(REPLACE
+ "#define ABSL_OPTION_USE_STD_${FEATURE} 2"
+ "#define ABSL_OPTION_USE_STD_${FEATURE} 1"
ABSL_INTERNAL_OPTIONS_H_PINNED
"${ABSL_INTERNAL_OPTIONS_H_CONTENTS}")
- else()
- string(REGEX REPLACE
- "#define ABSL_OPTION_USE_STD_([^ ]*) 2"
- "#define ABSL_OPTION_USE_STD_\\1 0"
+ set(ABSL_INTERNAL_OPTIONS_H_CONTENTS "${ABSL_INTERNAL_OPTIONS_H_PINNED}")
+ endforeach()
+ endif()
+
+ # Handle features that require at least C++17.
+ if (ABSL_INTERNAL_AT_LEAST_CXX17)
+ foreach(FEATURE "ANY" "OPTIONAL" "STRING_VIEW" "VARIANT")
+ string(REPLACE
+ "#define ABSL_OPTION_USE_STD_${FEATURE} 2"
+ "#define ABSL_OPTION_USE_STD_${FEATURE} 1"
ABSL_INTERNAL_OPTIONS_H_PINNED
"${ABSL_INTERNAL_OPTIONS_H_CONTENTS}")
+ set(ABSL_INTERNAL_OPTIONS_H_CONTENTS "${ABSL_INTERNAL_OPTIONS_H_PINNED}")
+ endforeach()
endif()
+
+ # Any feature that still has the value of 2 (because it was not handled above)
+ # should be set to 0.
+ string(REGEX REPLACE
+ "#define ABSL_OPTION_USE_STD_([^ ]*) 2"
+ "#define ABSL_OPTION_USE_STD_\\1 0"
+ ABSL_INTERNAL_OPTIONS_H_PINNED
+ "${ABSL_INTERNAL_OPTIONS_H_CONTENTS}")
+
file(WRITE "${CMAKE_BINARY_DIR}/options-pinned.h" "${ABSL_INTERNAL_OPTIONS_H_PINNED}")
install(FILES "${CMAKE_BINARY_DIR}/options-pinned.h"