2022-02-11 19:01:25 +00: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.
#
# Most widely used distributions have cmake 3.5 or greater available as of March
# 2019. A notable exception is RHEL-7 (CentOS7). You can install a current
# version of CMake by first installing Extra Packages for Enterprise Linux
# (https://fedoraproject.org/wiki/EPEL#Extra_Packages_for_Enterprise_Linux_.28EPEL.29)
# and then issuing `yum install cmake3` on the command line.
cmake_minimum_required ( VERSION 3.5 )
# Compiler id for Apple Clang is now AppleClang.
if ( POLICY CMP0025 )
cmake_policy ( SET CMP0025 NEW )
endif ( POLICY CMP0025 )
# if command can use IN_LIST
if ( POLICY CMP0057 )
cmake_policy ( SET CMP0057 NEW )
endif ( POLICY CMP0057 )
# Project version variables are the empty string if version is unspecified
if ( POLICY CMP0048 )
cmake_policy ( SET CMP0048 NEW )
endif ( POLICY CMP0048 )
# option() honor variables
if ( POLICY CMP0077 )
cmake_policy ( SET CMP0077 NEW )
endif ( POLICY CMP0077 )
# Allow the user to specify the MSVC runtime
if ( POLICY CMP0091 )
cmake_policy ( SET CMP0091 NEW )
endif ( POLICY CMP0091 )
project ( absl LANGUAGES CXX )
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 ( )
option ( ABSL_PROPAGATE_CXX_STD
" 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_11 ) 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 F F ) # TODO: Default to ON for CMake 3.8 and greater.
if ( ( ${ CMAKE_VERSION } VERSION_GREATER_EQUAL 3.8 ) AND ( NOT ABSL_PROPAGATE_CXX_STD ) )
message ( WARNING "A future Abseil release will default ABSL_PROPAGATE_CXX_STD to ON for CMake 3.8 and up. We recommend enabling this option to ensure your project still builds correctly." )
endif ( )
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
)
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 )
2022-08-29 17:59:48 +00:00
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 )
2022-02-11 19:01:25 +00:00
option ( ABSL_USE_EXTERNAL_GOOGLETEST
2022-08-29 17:59:48 +00:00
" 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 )
2022-02-11 19:01:25 +00:00
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 . "
)
2022-08-29 17:59:48 +00:00
if ( BUILD_TESTING AND ABSL_BUILD_TESTING )
2022-02-11 19:01:25 +00:00
## check targets
if ( ABSL_USE_EXTERNAL_GOOGLETEST )
if ( ABSL_FIND_GOOGLETEST )
find_package ( GTest REQUIRED )
2022-08-29 17:59:48 +00:00
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 ( )
2022-02-11 19:01:25 +00:00
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 )
2022-08-29 17:59:48 +00:00
set ( absl_gtest_download_url "https://github.com/google/googletest/archive/main.zip" )
2022-02-11 19:01:25 +00:00
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 ( )
check_target ( GTest::gtest )
check_target ( GTest::gtest_main )
check_target ( GTest::gmock )
check_target ( GTest::gmock_main )
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
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 "
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
)
endif ( ) # ABSL_ENABLE_INSTALL