summaryrefslogtreecommitdiff
path: root/CMake
diff options
context:
space:
mode:
Diffstat (limited to 'CMake')
-rw-r--r--CMake/AbseilConfigureCopts.cmake145
-rw-r--r--CMake/AbseilHelpers.cmake42
2 files changed, 179 insertions, 8 deletions
diff --git a/CMake/AbseilConfigureCopts.cmake b/CMake/AbseilConfigureCopts.cmake
new file mode 100644
index 00000000..96e0390b
--- /dev/null
+++ b/CMake/AbseilConfigureCopts.cmake
@@ -0,0 +1,145 @@
+# Abseil-specific compiler flags. See absl/copts.bzl for description.
+# DO NOT CHANGE THIS FILE WITHOUT THE CORRESPONDING CHANGE TO absl/copts.bzl
+
+list(APPEND GCC_FLAGS
+ -Wall
+ -Wextra
+ -Wcast-qual
+ -Wconversion-null
+ -Wmissing-declarations
+ -Woverlength-strings
+ -Wpointer-arith
+ -Wunused-local-typedefs
+ -Wunused-result
+ -Wvarargs
+ -Wwrite-strings
+ -Wno-sign-compare
+)
+
+list(APPEND GCC_TEST_FLAGS
+ -Wno-conversion-null
+ -Wno-missing-declarations
+ -Wno-sign-compare
+ -Wno-unused-function
+ -Wno-unused-parameter
+ -Wno-unused-private-field
+)
+
+list(APPEND LLVM_FLAGS
+ -Wall
+ -Wextra
+ -Weverything
+ -Wno-c++98-compat-pedantic
+ -Wno-conversion
+ -Wno-covered-switch-default
+ -Wno-deprecated
+ -Wno-disabled-macro-expansion
+ -Wno-double-promotion
+ -Wno-comma
+ -Wno-extra-semi
+ -Wno-packed
+ -Wno-padded
+ -Wno-sign-compare
+ -Wno-float-conversion
+ -Wno-float-equal
+ -Wno-format-nonliteral
+ -Wno-gcc-compat
+ -Wno-global-constructors
+ -Wno-exit-time-destructors
+ -Wno-nested-anon-types
+ -Wno-non-modular-include-in-module
+ -Wno-old-style-cast
+ -Wno-range-loop-analysis
+ -Wno-reserved-id-macro
+ -Wno-shorten-64-to-32
+ -Wno-switch-enum
+ -Wno-thread-safety-negative
+ -Wno-undef
+ -Wno-unknown-warning-option
+ -Wno-unreachable-code
+ -Wno-unused-macros
+ -Wno-weak-vtables
+ -Wbitfield-enum-conversion
+ -Wbool-conversion
+ -Wconstant-conversion
+ -Wenum-conversion
+ -Wint-conversion
+ -Wliteral-conversion
+ -Wnon-literal-null-conversion
+ -Wnull-conversion
+ -Wobjc-literal-conversion
+ -Wno-sign-conversion
+ -Wstring-conversion
+)
+
+list(APPEND LLVM_TEST_FLAGS
+ -Wno-c99-extensions
+ -Wno-missing-noreturn
+ -Wno-missing-prototypes
+ -Wno-missing-variable-declarations
+ -Wno-null-conversion
+ -Wno-shadow
+ -Wno-shift-sign-overflow
+ -Wno-sign-compare
+ -Wno-unused-function
+ -Wno-unused-member-function
+ -Wno-unused-parameter
+ -Wno-unused-private-field
+ -Wno-unused-template
+ -Wno-used-but-marked-unused
+ -Wno-zero-as-null-pointer-constant
+ -Wno-gnu-zero-variadic-macro-arguments
+)
+
+list(APPEND MSVC_FLAGS
+ /W3
+ /wd4005
+ /wd4018
+ /wd4068
+ /wd4180
+ /wd4244
+ /wd4267
+ /wd4800
+ /DNOMINMAX
+ /DWIN32_LEAN_AND_MEAN
+ /D_CRT_SECURE_NO_WARNINGS
+ /D_SCL_SECURE_NO_WARNINGS
+ /D_ENABLE_EXTENDED_ALIGNED_STORAGE
+)
+
+list(APPEND MSVC_TEST_FLAGS
+ /wd4101
+ /wd4503
+)
+
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ set(ABSL_DEFAULT_COPTS "${GCC_FLAGS}")
+ set(ABSL_TEST_COPTS "${GCC_FLAGS};${GCC_TEST_FLAGS}")
+ set(ABSL_EXCEPTIONS_FLAG "-fexceptions")
+elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
+ # MATCHES so we get both Clang and AppleClang
+ set(ABSL_DEFAULT_COPTS "${LLVM_FLAGS}")
+ set(ABSL_TEST_COPTS "${LLVM_FLAGS};${LLVM_TEST_FLAGS}")
+ set(ABSL_EXCEPTIONS_FLAG "-fexceptions")
+elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+ set(ABSL_DEFAULT_COPTS "${MSVC_FLAGS}")
+ set(ABSL_TEST_COPTS "${MSVC_FLAGS};${MSVC_TEST_FLAGS}")
+ set(ABSL_EXCEPTIONS_FLAG "/U_HAS_EXCEPTIONS;/D_HAS_EXCEPTIONS=1;/EHsc")
+else()
+ message(WARNING "Unknown compiler: ${CMAKE_CXX_COMPILER}. Building with no default flags")
+ set(ABSL_DEFAULT_COPTS "")
+ set(ABSL_TEST_COPTS "")
+ set(ABSL_EXCEPTIONS_FLAG "")
+endif()
+
+# This flag is used internally for Bazel builds and is kept here for consistency
+set(ABSL_EXCEPTIONS_FLAG_LINKOPTS "")
+
+if("${CMAKE_CXX_STANDARD}" EQUAL 98)
+ message(FATAL_ERROR "Abseil requires at least C++11")
+elseif(NOT "${CMAKE_CXX_STANDARD}")
+ message(STATUS "No CMAKE_CXX_STANDARD set, assuming 11")
+ set(ABSL_CXX_STANDARD 11)
+else()
+ set(ABSL_CXX_STANDARD "${CMAKE_CXX_STANDARD}")
+endif()
diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake
index cc606ccb..5402bf51 100644
--- a/CMake/AbseilHelpers.cmake
+++ b/CMake/AbseilHelpers.cmake
@@ -15,6 +15,7 @@
#
include(CMakeParseArguments)
+include(AbseilConfigureCopts)
# The IDE folder for Abseil that will be used if Abseil is included in a CMake
# project that sets
@@ -48,7 +49,11 @@ function(absl_library)
add_library(${_NAME} STATIC ${ABSL_LIB_SOURCES})
- target_compile_options(${_NAME} PRIVATE ${ABSL_LIB_PRIVATE_COMPILE_FLAGS})
+ target_compile_options(${_NAME}
+ PRIVATE
+ ${ABSL_LIB_PRIVATE_COMPILE_FLAGS}
+ ${ABSL_DEFAULT_COPTS}
+ )
target_link_libraries(${_NAME} PUBLIC ${ABSL_LIB_PUBLIC_LIBRARIES})
target_include_directories(${_NAME}
PUBLIC ${ABSL_COMMON_INCLUDE_DIRS} ${ABSL_LIB_PUBLIC_INCLUDE_DIRS}
@@ -57,6 +62,9 @@ function(absl_library)
# Add all Abseil targets to a a folder in the IDE for organization.
set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER})
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
+
if(ABSL_LIB_EXPORT_NAME)
add_library(absl::${ABSL_LIB_EXPORT_NAME} ALIAS ${_NAME})
endif()
@@ -154,6 +162,10 @@ function(absl_cc_library)
else()
set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/internal)
endif()
+
+ # INTERFACE libraries can't have the CXX_STANDARD property set
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
else()
# Generating header-only library
add_library(${_NAME} INTERFACE)
@@ -164,6 +176,7 @@ function(absl_cc_library)
)
target_compile_definitions(${_NAME} INTERFACE ${ABSL_CC_LIB_DEFINES})
endif()
+
add_library(absl::${ABSL_CC_LIB_NAME} ALIAS ${_NAME})
endif()
endfunction()
@@ -237,6 +250,9 @@ function(absl_cc_test)
# Add all Abseil targets to a a folder in the IDE for organization.
set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/test)
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
+
add_test(NAME ${_NAME} COMMAND ${_NAME})
endfunction()
@@ -279,6 +295,9 @@ function(absl_header_library)
# Add all Abseil targets to a a folder in the IDE for organization.
set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER})
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
+
if(ABSL_HO_LIB_EXPORT_NAME)
add_library(absl::${ABSL_HO_LIB_EXPORT_NAME} ALIAS ${_NAME})
endif()
@@ -312,22 +331,29 @@ function(absl_test)
if(ABSL_RUN_TESTS)
- set(_NAME ${ABSL_TEST_TARGET})
+ set(_NAME "absl_${ABSL_TEST_TARGET}")
string(TOUPPER ${_NAME} _UPPER_NAME)
- add_executable(${_NAME}_bin ${ABSL_TEST_SOURCES})
+ add_executable(${_NAME} ${ABSL_TEST_SOURCES})
- target_compile_options(${_NAME}_bin PRIVATE ${ABSL_TEST_PRIVATE_COMPILE_FLAGS})
- target_link_libraries(${_NAME}_bin PUBLIC ${ABSL_TEST_PUBLIC_LIBRARIES} ${ABSL_TEST_COMMON_LIBRARIES})
- target_include_directories(${_NAME}_bin
+ target_compile_options(${_NAME}
+ PRIVATE
+ ${ABSL_TEST_PRIVATE_COMPILE_FLAGS}
+ ${ABSL_TEST_COPTS}
+ )
+ target_link_libraries(${_NAME} PUBLIC ${ABSL_TEST_PUBLIC_LIBRARIES} ${ABSL_TEST_COMMON_LIBRARIES})
+ target_include_directories(${_NAME}
PUBLIC ${ABSL_COMMON_INCLUDE_DIRS} ${ABSL_TEST_PUBLIC_INCLUDE_DIRS}
PRIVATE ${GMOCK_INCLUDE_DIRS} ${GTEST_INCLUDE_DIRS}
)
# Add all Abseil targets to a a folder in the IDE for organization.
- set_property(TARGET ${_NAME}_bin PROPERTY FOLDER ${ABSL_IDE_FOLDER})
+ set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER})
+
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
- add_test(${_NAME} ${_NAME}_bin)
+ add_test(NAME ${_NAME} COMMAND ${_NAME})
endif(ABSL_RUN_TESTS)
endfunction()