2024-03-30 09:54:35 +01:00
#
# Copyright 2017 The Abseil Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md
2024-08-14 20:41:00 +02:00
# As of 2024-07-01, CMake 3.16 is the minimum supported version.
cmake_minimum_required ( VERSION 3.16 )
2024-03-30 09:54:35 +01:00
# Allow the user to specify the CMAKE_MSVC_DEBUG_INFORMATION_FORMAT
if ( POLICY CMP0141 )
cmake_policy ( SET CMP0141 NEW )
endif ( POLICY CMP0141 )
project ( absl LANGUAGES CXX )
2024-08-14 20:41:00 +02:00
set ( ABSL_SOVERSION 0 )
2024-03-30 09:54:35 +01:00
include ( CTest )
# Output directory is correct by default for most build setups. However, when
# building Abseil as a DLL, it is important to have the DLL in the same
# directory as the executable using it. Thus, we put all executables in a single
# /bin directory.
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ CMAKE_BINARY_DIR } /bin )
# when absl is included as subproject (i.e. using add_subdirectory(abseil-cpp))
# in the source tree of a project that uses it, install rules are disabled.
if ( NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR )
option ( ABSL_ENABLE_INSTALL "Enable install rule" OFF )
else ( )
option ( ABSL_ENABLE_INSTALL "Enable install rule" ON )
endif ( )
2024-08-14 20:41:00 +02:00
set ( CMAKE_INSTALL_RPATH "$ORIGIN" )
set ( CMAKE_INSTALL_RPATH_USE_LINK_PATH ON )
set ( CMAKE_BUILD_RPATH_USE_ORIGIN ON )
2024-03-30 09:54:35 +01:00
option ( ABSL_PROPAGATE_CXX_STD
2025-04-29 08:03:15 +02:00
" U s e C M a k e C + + s t a n d a r d m e t a features ( e.g. cxx_std_17 ) t h a t p r o p a g a t e t o t a r g e t s t h a t l i n k t o A b s e i l "
O N )
2024-03-30 09:54:35 +01:00
option ( ABSL_USE_SYSTEM_INCLUDES
" S i l e n c e w a r n i n g s i n A b s e i l h e a d e r s b y m a r k i n g t h e m a s S Y S T E M i n c l u d e s "
O F F )
list ( APPEND CMAKE_MODULE_PATH
$ { C M A K E _ C U R R E N T _ L I S T _ D I R } / C M a k e
$ { C M A K E _ C U R R E N T _ L I S T _ D I R } / a b s l / c o p t s
)
2024-08-14 20:41:00 +02:00
option ( ABSL_MSVC_STATIC_RUNTIME
" L i n k s t a t i c r u n t i m e l i b r a r i e s "
O F F )
if ( ABSL_MSVC_STATIC_RUNTIME )
set ( CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" )
else ( )
set ( CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" )
endif ( )
2024-03-30 09:54:35 +01:00
include ( CMakePackageConfigHelpers )
include ( GNUInstallDirs )
include ( AbseilDll )
include ( AbseilHelpers )
##
## Using absl targets
##
## all public absl targets are
## exported with the absl:: prefix
##
## e.g absl::base absl::synchronization absl::strings ....
##
## DO NOT rely on the internal targets outside of the prefix
# include current path
list ( APPEND ABSL_COMMON_INCLUDE_DIRS ${ CMAKE_CURRENT_SOURCE_DIR } )
if ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
set ( ABSL_USING_CLANG ON )
else ( )
set ( ABSL_USING_CLANG OFF )
endif ( )
# find dependencies
## pthread
find_package ( Threads REQUIRED )
include ( CMakeDependentOption )
option ( ABSL_BUILD_TESTING
" I f O N , A b s e i l w i l l b u i l d a l l o f A b s e i l ' s o w n t e s t s . " O F F )
option ( ABSL_BUILD_TEST_HELPERS
" I f O N , A b s e i l w i l l b u i l d l i b r a r i e s t h a t y o u c a n u s e t o w r i t e t e s t s a g a i n s t A b s e i l c o d e . T h i s o p t i o n r e q u i r e s t h a t A b s e i l i s c o n f i g u r e d t o u s e G o o g l e T e s t . "
O F F )
option ( ABSL_USE_EXTERNAL_GOOGLETEST
" I f O N , A b s e i l w i l l a s s u m e t h a t t h e t a r g e t s f o r G o o g l e T e s t a r e a l r e a d y p r o v i d e d b y t h e i n c l u d i n g p r o j e c t . T h i s m a k e s s e n s e w h e n A b s e i l i s u s e d w i t h a d d _ s u b d i r e c t o r y . " O F F )
cmake_dependent_option ( ABSL_FIND_GOOGLETEST
" I f O N , A b s e i l w i l l u s e find_package ( GTest ) r a t h e r t h a n a s s u m i n g t h a t G o o g l e T e s t i s a l r e a d y p r o v i d e d b y t h e i n c l u d i n g p r o j e c t . "
O N
" A B S L _ U S E _ E X T E R N A L _ G O O G L E T E S T "
O F F )
option ( ABSL_USE_GOOGLETEST_HEAD
" I f O N , a b s e i l w i l l d o w n l o a d H E A D f r o m G o o g l e T e s t a t c o n f i g t i m e . " O F F )
set ( ABSL_GOOGLETEST_DOWNLOAD_URL "" CACHE STRING "If set, download GoogleTest from this URL" )
set ( ABSL_LOCAL_GOOGLETEST_DIR "/usr/src/googletest" CACHE PATH
" I f A B S L _ U S E _ G O O G L E T E S T _ H E A D i s O F F a n d A B S L _ G O O G L E T E S T _ U R L i s n o t s e t , s p e c i f i e s t h e d i r e c t o r y o f a l o c a l G o o g l e T e s t c h e c k o u t . "
)
2024-08-14 20:41:00 +02:00
option ( ABSL_BUILD_MONOLITHIC_SHARED_LIBS
" B u i l d A b s e i l a s a s i n g l e s h a r e d library ( always enabled for Windows ) "
O F F
)
if ( NOT BUILD_SHARED_LIBS AND ABSL_BUILD_MONOLITHIC_SHARED_LIBS )
message ( WARNING "Not building a shared library because BUILD_SHARED_LIBS is not set. Ignoring ABSL_BUILD_MONOLITHIC_SHARED_LIBS." )
endif ( )
2024-03-30 09:54:35 +01:00
if ( ( BUILD_TESTING AND ABSL_BUILD_TESTING ) OR ABSL_BUILD_TEST_HELPERS )
if ( ABSL_USE_EXTERNAL_GOOGLETEST )
if ( ABSL_FIND_GOOGLETEST )
find_package ( GTest REQUIRED )
elseif ( NOT TARGET GTest::gtest )
if ( TARGET gtest )
# When Google Test is included directly rather than through find_package, the aliases are missing.
add_library ( GTest::gtest ALIAS gtest )
add_library ( GTest::gtest_main ALIAS gtest_main )
add_library ( GTest::gmock ALIAS gmock )
add_library ( GTest::gmock_main ALIAS gmock_main )
else ( )
message ( FATAL_ERROR "ABSL_USE_EXTERNAL_GOOGLETEST is ON and ABSL_FIND_GOOGLETEST is OFF, which means that the top-level project must build the Google Test project. However, the target gtest was not found." )
endif ( )
endif ( )
else ( )
set ( absl_gtest_build_dir ${ CMAKE_BINARY_DIR } /googletest-build )
if ( ABSL_USE_GOOGLETEST_HEAD AND ABSL_GOOGLETEST_DOWNLOAD_URL )
message ( FATAL_ERROR "Do not set both ABSL_USE_GOOGLETEST_HEAD and ABSL_GOOGLETEST_DOWNLOAD_URL" )
endif ( )
if ( ABSL_USE_GOOGLETEST_HEAD )
set ( absl_gtest_download_url "https://github.com/google/googletest/archive/main.zip" )
elseif ( ABSL_GOOGLETEST_DOWNLOAD_URL )
set ( absl_gtest_download_url ${ ABSL_GOOGLETEST_DOWNLOAD_URL } )
endif ( )
if ( absl_gtest_download_url )
set ( absl_gtest_src_dir ${ CMAKE_BINARY_DIR } /googletest-src )
else ( )
set ( absl_gtest_src_dir ${ ABSL_LOCAL_GOOGLETEST_DIR } )
endif ( )
include ( CMake/Googletest/DownloadGTest.cmake )
endif ( )
endif ( )
add_subdirectory ( absl )
if ( ABSL_ENABLE_INSTALL )
# absl:lts-remove-begin(system installation is supported for LTS releases)
# We don't support system-wide installation
list ( APPEND SYSTEM_INSTALL_DIRS "/usr/local" "/usr" "/opt/" "/opt/local" "c:/Program Files/${PROJECT_NAME}" )
if ( NOT DEFINED CMAKE_INSTALL_PREFIX OR CMAKE_INSTALL_PREFIX IN_LIST SYSTEM_INSTALL_DIRS )
message ( WARNING " \
T h e d e f a u l t a n d s y s t e m - l e v e l i n s t a l l d i r e c t o r i e s a r e u n s u p p o r t e d e x c e p t i n L T S \
r e l e a s e s o f A b s e i l . P l e a s e s e t C M A K E _ I N S T A L L _ P R E F I X t o i n s t a l l A b s e i l i n y o u r \
s o u r c e o r b u i l d t r e e d i r e c t l y . \
" )
endif ( )
# absl:lts-remove-end
# install as a subdirectory only
install ( EXPORT ${ PROJECT_NAME } Targets
N A M E S P A C E a b s l : :
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ L I B D I R } / c m a k e / $ { P R O J E C T _ N A M E } "
)
configure_package_config_file (
C M a k e / a b s l C o n f i g . c m a k e . i n
" $ { P R O J E C T _ B I N A R Y _ D I R } / $ { P R O J E C T _ N A M E } C o n f i g . c m a k e "
I N S T A L L _ D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ L I B D I R } / c m a k e / $ { P R O J E C T _ N A M E } "
)
install ( FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ L I B D I R } / c m a k e / $ { P R O J E C T _ N A M E } "
)
# Abseil only has a version in LTS releases. This mechanism is accomplished
# Abseil's internal Copybara (https://github.com/google/copybara) workflows and
# isn't visible in the CMake buildsystem itself.
if ( absl_VERSION )
write_basic_package_version_file (
" $ { P R O J E C T _ B I N A R Y _ D I R } / $ { P R O J E C T _ N A M E } C o n f i g V e r s i o n . c m a k e "
C O M P A T I B I L I T Y E x a c t V e r s i o n
)
install ( FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ L I B D I R } / c m a k e / $ { P R O J E C T _ N A M E } "
)
endif ( ) # absl_VERSION
2025-04-29 08:03:15 +02:00
# Install the headers except for "options.h" which is installed separately.
2024-03-30 09:54:35 +01:00
install ( DIRECTORY absl
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R }
F I L E S _ M A T C H I N G
P A T T E R N " * . i n c "
P A T T E R N " * . h "
2025-04-29 08:03:15 +02:00
P A T T E R N " o p t i o n s . h " E X C L U D E
2024-03-30 09:54:35 +01:00
P A T T E R N " c o p t s " E X C L U D E
P A T T E R N " t e s t d a t a " E X C L U D E
)
# Rewrite options.h to use the compiled ABI.
file ( READ "absl/base/options.h" ABSL_INTERNAL_OPTIONS_H_CONTENTS )
# 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"
A B S L _ I N T E R N A L _ O P T I O N S _ H _ P I N N E D
" $ { A B S L _ I N T E R N A L _ O P T I O N S _ H _ C O N T E N T S } " )
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"
A B S L _ I N T E R N A L _ O P T I O N S _ H _ P I N N E D
" $ { A B S L _ I N T E R N A L _ O P T I O N S _ H _ C O N T E N T S } " )
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"
A B S L _ I N T E R N A L _ O P T I O N S _ H _ P I N N E D
" $ { A B S L _ I N T E R N A L _ O P T I O N S _ H _ C O N T E N T S } " )
2025-04-29 08:03:15 +02:00
# If the file already exists, check if it matches the new contents.
# This avoids writing the file if it is already up-to-date when the CMake
# generation is triggered and triggering unnecessary rebuilds.
set ( ABSL_INTERNAL_OPTIONS_H_PINNED_NEEDS_UPDATE TRUE )
if ( EXISTS "${CMAKE_BINARY_DIR}/options-pinned.h" )
file ( READ "${CMAKE_BINARY_DIR}/options-pinned.h" ABSL_INTERNAL_OPTIONS_PINNED_H_CONTENTS )
if ( "${ABSL_INTERNAL_OPTIONS_H_PINNED}" STREQUAL "${ABSL_INTERNAL_OPTIONS_PINNED_H_CONTENTS}" )
set ( ABSL_INTERNAL_OPTIONS_H_PINNED_NEEDS_UPDATE FALSE )
endif ( )
endif ( )
# If the file needs an update, generate it.
if ( ABSL_INTERNAL_OPTIONS_H_PINNED_NEEDS_UPDATE )
file ( GENERATE OUTPUT "${CMAKE_BINARY_DIR}/options-pinned.h" CONTENT "${ABSL_INTERNAL_OPTIONS_H_PINNED}" )
endif ( )
2024-03-30 09:54:35 +01:00
install ( FILES "${CMAKE_BINARY_DIR}/options-pinned.h"
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } / a b s l / b a s e
R E N A M E " o p t i o n s . h " )
endif ( ) # ABSL_ENABLE_INSTALL