Commit ea882fb7 by Abseil Team Committed by Copybara-Service

CMake: installed artifacts reflect the compiled ABI

In a previous change, I forgot to fix the DLLs to
also set the target_compile_features() as needed.

Some amount of refactoring to expose the necessary
variables and functions in AbseilDll.cmake

Fixes #1116

PiperOrigin-RevId: 485101834
Change-Id: I5cd0eff9e20c0ddf48c364f917e40d66df0aac17
parent f5fd4cc7
...@@ -476,6 +476,35 @@ set(ABSL_INTERNAL_DLL_TARGETS ...@@ -476,6 +476,35 @@ set(ABSL_INTERNAL_DLL_TARGETS
"variant" "variant"
) )
function(_absl_target_compile_features_if_available TARGET TYPE FEATURE)
if(FEATURE IN_LIST CMAKE_CXX_COMPILE_FEATURES)
target_compile_features(${TARGET} ${TYPE} ${FEATURE})
else()
message(WARNING "Feature ${FEATURE} is unknown for the CXX compiler")
endif()
endfunction()
include(CheckCXXSourceCompiles)
check_cxx_source_compiles(
[==[
#ifdef _MSC_VER
# if _MSVC_LANG < 201700L
# error "The compiler defaults or is configured for C++ < 17"
# endif
#elif __cplusplus < 201700L
# 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)
set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_17)
else()
set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_14)
endif()
function(absl_internal_dll_contains) function(absl_internal_dll_contains)
cmake_parse_arguments(ABSL_INTERNAL_DLL cmake_parse_arguments(ABSL_INTERNAL_DLL
"" ""
...@@ -555,6 +584,25 @@ function(absl_make_dll) ...@@ -555,6 +584,25 @@ function(absl_make_dll)
${ABSL_CC_LIB_DEFINES} ${ABSL_CC_LIB_DEFINES}
ABSL_CONSUME_DLL ABSL_CONSUME_DLL
) )
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.
_absl_target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
else()
# Note: This is legacy (before CMake 3.8) behavior. Setting the
# target-level CXX_STANDARD property to ABSL_CXX_STANDARD (which is
# initialized by CMAKE_CXX_STANDARD) should have no real effect, since
# that is the default value anyway.
#
# CXX_STANDARD_REQUIRED does guard against the top-level CMake project
# not having enabled CMAKE_CXX_STANDARD_REQUIRED (which prevents
# "decaying" to an older standard if the requested one isn't available).
set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
endif()
install(TARGETS abseil_dll EXPORT ${PROJECT_NAME}Targets install(TARGETS abseil_dll EXPORT ${PROJECT_NAME}Targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
......
...@@ -32,35 +32,6 @@ else() ...@@ -32,35 +32,6 @@ else()
set(ABSL_INTERNAL_INCLUDE_WARNING_GUARD "") set(ABSL_INTERNAL_INCLUDE_WARNING_GUARD "")
endif() endif()
function(_absl_target_compile_features_if_available TARGET TYPE FEATURE)
if(FEATURE IN_LIST CMAKE_CXX_COMPILE_FEATURES)
target_compile_features(${TARGET} ${TYPE} ${FEATURE})
else()
message(WARNING "Feature ${FEATURE} is unknown for the CXX compiler")
endif()
endfunction()
include(CheckCXXSourceCompiles)
check_cxx_source_compiles(
[==[
#ifdef _MSC_VER
# if _MSVC_LANG < 201700L
# error "The compiler defaults or is configured for C++ < 17"
# endif
#elif __cplusplus < 201700L
# 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)
set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_17)
else()
set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_14)
endif()
# absl_cc_library() # absl_cc_library()
# #
# CMake function to imitate Bazel's cc_library rule. # CMake function to imitate Bazel's cc_library rule.
...@@ -297,9 +268,9 @@ Cflags: -I\${includedir}${PC_CFLAGS}\n") ...@@ -297,9 +268,9 @@ Cflags: -I\${includedir}${PC_CFLAGS}\n")
endif() endif()
if(ABSL_PROPAGATE_CXX_STD) if(ABSL_PROPAGATE_CXX_STD)
# Abseil libraries require C++14 as the current minimum standard. # Abseil libraries require C++14 as the current minimum standard. When
# Top-level application CMake projects should ensure a consistent C++ # compiled with C++17 (either because it is the compiler's default or
# standard for all compiled sources by setting CMAKE_CXX_STANDARD. # explicitly requested), then Abseil requires C++17.
_absl_target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) _absl_target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
else() else()
# Note: This is legacy (before CMake 3.8) behavior. Setting the # Note: This is legacy (before CMake 3.8) behavior. Setting the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment