1*6777b538SAndroid Build Coastguard Worker# 2*6777b538SAndroid Build Coastguard Worker# Copyright 2017 The Abseil Authors. 3*6777b538SAndroid Build Coastguard Worker# 4*6777b538SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 5*6777b538SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 6*6777b538SAndroid Build Coastguard Worker# You may obtain a copy of the License at 7*6777b538SAndroid Build Coastguard Worker# 8*6777b538SAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 9*6777b538SAndroid Build Coastguard Worker# 10*6777b538SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*6777b538SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 12*6777b538SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6777b538SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*6777b538SAndroid Build Coastguard Worker# limitations under the License. 15*6777b538SAndroid Build Coastguard Worker# 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Workerinclude(CMakeParseArguments) 18*6777b538SAndroid Build Coastguard Workerinclude(AbseilConfigureCopts) 19*6777b538SAndroid Build Coastguard Workerinclude(AbseilDll) 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker# The IDE folder for Abseil that will be used if Abseil is included in a CMake 22*6777b538SAndroid Build Coastguard Worker# project that sets 23*6777b538SAndroid Build Coastguard Worker# set_property(GLOBAL PROPERTY USE_FOLDERS ON) 24*6777b538SAndroid Build Coastguard Worker# For example, Visual Studio supports folders. 25*6777b538SAndroid Build Coastguard Workerif(NOT DEFINED ABSL_IDE_FOLDER) 26*6777b538SAndroid Build Coastguard Worker set(ABSL_IDE_FOLDER Abseil) 27*6777b538SAndroid Build Coastguard Workerendif() 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Workerif(ABSL_USE_SYSTEM_INCLUDES) 30*6777b538SAndroid Build Coastguard Worker set(ABSL_INTERNAL_INCLUDE_WARNING_GUARD SYSTEM) 31*6777b538SAndroid Build Coastguard Workerelse() 32*6777b538SAndroid Build Coastguard Worker set(ABSL_INTERNAL_INCLUDE_WARNING_GUARD "") 33*6777b538SAndroid Build Coastguard Workerendif() 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker# absl_cc_library() 36*6777b538SAndroid Build Coastguard Worker# 37*6777b538SAndroid Build Coastguard Worker# CMake function to imitate Bazel's cc_library rule. 38*6777b538SAndroid Build Coastguard Worker# 39*6777b538SAndroid Build Coastguard Worker# Parameters: 40*6777b538SAndroid Build Coastguard Worker# NAME: name of target (see Note) 41*6777b538SAndroid Build Coastguard Worker# HDRS: List of public header files for the library 42*6777b538SAndroid Build Coastguard Worker# SRCS: List of source files for the library 43*6777b538SAndroid Build Coastguard Worker# DEPS: List of other libraries to be linked in to the binary targets 44*6777b538SAndroid Build Coastguard Worker# COPTS: List of private compile options 45*6777b538SAndroid Build Coastguard Worker# DEFINES: List of public defines 46*6777b538SAndroid Build Coastguard Worker# LINKOPTS: List of link options 47*6777b538SAndroid Build Coastguard Worker# PUBLIC: Add this so that this library will be exported under absl:: 48*6777b538SAndroid Build Coastguard Worker# Also in IDE, target will appear in Abseil folder while non PUBLIC will be in Abseil/internal. 49*6777b538SAndroid Build Coastguard Worker# TESTONLY: When added, this target will only be built if both 50*6777b538SAndroid Build Coastguard Worker# BUILD_TESTING=ON and ABSL_BUILD_TESTING=ON. 51*6777b538SAndroid Build Coastguard Worker# 52*6777b538SAndroid Build Coastguard Worker# Note: 53*6777b538SAndroid Build Coastguard Worker# By default, absl_cc_library will always create a library named absl_${NAME}, 54*6777b538SAndroid Build Coastguard Worker# and alias target absl::${NAME}. The absl:: form should always be used. 55*6777b538SAndroid Build Coastguard Worker# This is to reduce namespace pollution. 56*6777b538SAndroid Build Coastguard Worker# 57*6777b538SAndroid Build Coastguard Worker# absl_cc_library( 58*6777b538SAndroid Build Coastguard Worker# NAME 59*6777b538SAndroid Build Coastguard Worker# awesome 60*6777b538SAndroid Build Coastguard Worker# HDRS 61*6777b538SAndroid Build Coastguard Worker# "a.h" 62*6777b538SAndroid Build Coastguard Worker# SRCS 63*6777b538SAndroid Build Coastguard Worker# "a.cc" 64*6777b538SAndroid Build Coastguard Worker# ) 65*6777b538SAndroid Build Coastguard Worker# absl_cc_library( 66*6777b538SAndroid Build Coastguard Worker# NAME 67*6777b538SAndroid Build Coastguard Worker# fantastic_lib 68*6777b538SAndroid Build Coastguard Worker# SRCS 69*6777b538SAndroid Build Coastguard Worker# "b.cc" 70*6777b538SAndroid Build Coastguard Worker# DEPS 71*6777b538SAndroid Build Coastguard Worker# absl::awesome # not "awesome" ! 72*6777b538SAndroid Build Coastguard Worker# PUBLIC 73*6777b538SAndroid Build Coastguard Worker# ) 74*6777b538SAndroid Build Coastguard Worker# 75*6777b538SAndroid Build Coastguard Worker# absl_cc_library( 76*6777b538SAndroid Build Coastguard Worker# NAME 77*6777b538SAndroid Build Coastguard Worker# main_lib 78*6777b538SAndroid Build Coastguard Worker# ... 79*6777b538SAndroid Build Coastguard Worker# DEPS 80*6777b538SAndroid Build Coastguard Worker# absl::fantastic_lib 81*6777b538SAndroid Build Coastguard Worker# ) 82*6777b538SAndroid Build Coastguard Worker# 83*6777b538SAndroid Build Coastguard Worker# TODO(b/320467376): Implement "ALWAYSLINK". 84*6777b538SAndroid Build Coastguard Workerfunction(absl_cc_library) 85*6777b538SAndroid Build Coastguard Worker cmake_parse_arguments(ABSL_CC_LIB 86*6777b538SAndroid Build Coastguard Worker "DISABLE_INSTALL;PUBLIC;TESTONLY" 87*6777b538SAndroid Build Coastguard Worker "NAME" 88*6777b538SAndroid Build Coastguard Worker "HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DEPS" 89*6777b538SAndroid Build Coastguard Worker ${ARGN} 90*6777b538SAndroid Build Coastguard Worker ) 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker if(ABSL_CC_LIB_TESTONLY AND 93*6777b538SAndroid Build Coastguard Worker NOT ((BUILD_TESTING AND ABSL_BUILD_TESTING) OR 94*6777b538SAndroid Build Coastguard Worker (ABSL_BUILD_TEST_HELPERS AND ABSL_CC_LIB_PUBLIC))) 95*6777b538SAndroid Build Coastguard Worker return() 96*6777b538SAndroid Build Coastguard Worker endif() 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker if(ABSL_ENABLE_INSTALL) 99*6777b538SAndroid Build Coastguard Worker set(_NAME "${ABSL_CC_LIB_NAME}") 100*6777b538SAndroid Build Coastguard Worker else() 101*6777b538SAndroid Build Coastguard Worker set(_NAME "absl_${ABSL_CC_LIB_NAME}") 102*6777b538SAndroid Build Coastguard Worker endif() 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker # Check if this is a header-only library 105*6777b538SAndroid Build Coastguard Worker # Note that as of February 2019, many popular OS's (for example, Ubuntu 106*6777b538SAndroid Build Coastguard Worker # 16.04 LTS) only come with cmake 3.5 by default. For this reason, we can't 107*6777b538SAndroid Build Coastguard Worker # use list(FILTER...) 108*6777b538SAndroid Build Coastguard Worker set(ABSL_CC_SRCS "${ABSL_CC_LIB_SRCS}") 109*6777b538SAndroid Build Coastguard Worker foreach(src_file IN LISTS ABSL_CC_SRCS) 110*6777b538SAndroid Build Coastguard Worker if(${src_file} MATCHES ".*\\.(h|inc)") 111*6777b538SAndroid Build Coastguard Worker list(REMOVE_ITEM ABSL_CC_SRCS "${src_file}") 112*6777b538SAndroid Build Coastguard Worker endif() 113*6777b538SAndroid Build Coastguard Worker endforeach() 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker if(ABSL_CC_SRCS STREQUAL "") 116*6777b538SAndroid Build Coastguard Worker set(ABSL_CC_LIB_IS_INTERFACE 1) 117*6777b538SAndroid Build Coastguard Worker else() 118*6777b538SAndroid Build Coastguard Worker set(ABSL_CC_LIB_IS_INTERFACE 0) 119*6777b538SAndroid Build Coastguard Worker endif() 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker # Determine this build target's relationship to the DLL. It's one of four things: 122*6777b538SAndroid Build Coastguard Worker # 1. "dll" -- This target is part of the DLL 123*6777b538SAndroid Build Coastguard Worker # 2. "dll_dep" -- This target is not part of the DLL, but depends on the DLL. 124*6777b538SAndroid Build Coastguard Worker # Note that we assume any target not in the DLL depends on the 125*6777b538SAndroid Build Coastguard Worker # DLL. This is not a technical necessity but a convenience 126*6777b538SAndroid Build Coastguard Worker # which happens to be true, because nearly every target is 127*6777b538SAndroid Build Coastguard Worker # part of the DLL. 128*6777b538SAndroid Build Coastguard Worker # 3. "shared" -- This is a shared library, perhaps on a non-windows platform 129*6777b538SAndroid Build Coastguard Worker # where DLL doesn't make sense. 130*6777b538SAndroid Build Coastguard Worker # 4. "static" -- This target does not depend on the DLL and should be built 131*6777b538SAndroid Build Coastguard Worker # statically. 132*6777b538SAndroid Build Coastguard Worker if (${ABSL_BUILD_DLL}) 133*6777b538SAndroid Build Coastguard Worker if(ABSL_ENABLE_INSTALL) 134*6777b538SAndroid Build Coastguard Worker absl_internal_dll_contains(TARGET ${_NAME} OUTPUT _in_dll) 135*6777b538SAndroid Build Coastguard Worker absl_internal_test_dll_contains(TARGET ${_NAME} OUTPUT _in_test_dll) 136*6777b538SAndroid Build Coastguard Worker else() 137*6777b538SAndroid Build Coastguard Worker absl_internal_dll_contains(TARGET ${ABSL_CC_LIB_NAME} OUTPUT _in_dll) 138*6777b538SAndroid Build Coastguard Worker absl_internal_test_dll_contains(TARGET ${ABSL_CC_LIB_NAME} OUTPUT _in_test_dll) 139*6777b538SAndroid Build Coastguard Worker endif() 140*6777b538SAndroid Build Coastguard Worker if (${_in_dll} OR ${_in_test_dll}) 141*6777b538SAndroid Build Coastguard Worker # This target should be replaced by the DLL 142*6777b538SAndroid Build Coastguard Worker set(_build_type "dll") 143*6777b538SAndroid Build Coastguard Worker set(ABSL_CC_LIB_IS_INTERFACE 1) 144*6777b538SAndroid Build Coastguard Worker else() 145*6777b538SAndroid Build Coastguard Worker # Building a DLL, but this target is not part of the DLL 146*6777b538SAndroid Build Coastguard Worker set(_build_type "dll_dep") 147*6777b538SAndroid Build Coastguard Worker endif() 148*6777b538SAndroid Build Coastguard Worker elseif(BUILD_SHARED_LIBS) 149*6777b538SAndroid Build Coastguard Worker set(_build_type "shared") 150*6777b538SAndroid Build Coastguard Worker else() 151*6777b538SAndroid Build Coastguard Worker set(_build_type "static") 152*6777b538SAndroid Build Coastguard Worker endif() 153*6777b538SAndroid Build Coastguard Worker 154*6777b538SAndroid Build Coastguard Worker # Generate a pkg-config file for every library: 155*6777b538SAndroid Build Coastguard Worker if(ABSL_ENABLE_INSTALL) 156*6777b538SAndroid Build Coastguard Worker if(absl_VERSION) 157*6777b538SAndroid Build Coastguard Worker set(PC_VERSION "${absl_VERSION}") 158*6777b538SAndroid Build Coastguard Worker else() 159*6777b538SAndroid Build Coastguard Worker set(PC_VERSION "head") 160*6777b538SAndroid Build Coastguard Worker endif() 161*6777b538SAndroid Build Coastguard Worker if(NOT _build_type STREQUAL "dll") 162*6777b538SAndroid Build Coastguard Worker set(LNK_LIB "${LNK_LIB} -labsl_${_NAME}") 163*6777b538SAndroid Build Coastguard Worker endif() 164*6777b538SAndroid Build Coastguard Worker foreach(dep ${ABSL_CC_LIB_DEPS}) 165*6777b538SAndroid Build Coastguard Worker if(${dep} MATCHES "^absl::(.*)") 166*6777b538SAndroid Build Coastguard Worker # for DLL builds many libs are not created, but add 167*6777b538SAndroid Build Coastguard Worker # the pkgconfigs nevertheless, pointing to the dll. 168*6777b538SAndroid Build Coastguard Worker if(_build_type STREQUAL "dll") 169*6777b538SAndroid Build Coastguard Worker # hide this MATCHES in an if-clause so it doesn't overwrite 170*6777b538SAndroid Build Coastguard Worker # the CMAKE_MATCH_1 from (${dep} MATCHES "^absl::(.*)") 171*6777b538SAndroid Build Coastguard Worker if(NOT PC_DEPS MATCHES "abseil_dll") 172*6777b538SAndroid Build Coastguard Worker # Join deps with commas. 173*6777b538SAndroid Build Coastguard Worker if(PC_DEPS) 174*6777b538SAndroid Build Coastguard Worker set(PC_DEPS "${PC_DEPS},") 175*6777b538SAndroid Build Coastguard Worker endif() 176*6777b538SAndroid Build Coastguard Worker # don't duplicate dll-dep if it exists already 177*6777b538SAndroid Build Coastguard Worker set(PC_DEPS "${PC_DEPS} abseil_dll = ${PC_VERSION}") 178*6777b538SAndroid Build Coastguard Worker set(LNK_LIB "${LNK_LIB} -labseil_dll") 179*6777b538SAndroid Build Coastguard Worker endif() 180*6777b538SAndroid Build Coastguard Worker else() 181*6777b538SAndroid Build Coastguard Worker # Join deps with commas. 182*6777b538SAndroid Build Coastguard Worker if(PC_DEPS) 183*6777b538SAndroid Build Coastguard Worker set(PC_DEPS "${PC_DEPS},") 184*6777b538SAndroid Build Coastguard Worker endif() 185*6777b538SAndroid Build Coastguard Worker set(PC_DEPS "${PC_DEPS} absl_${CMAKE_MATCH_1} = ${PC_VERSION}") 186*6777b538SAndroid Build Coastguard Worker endif() 187*6777b538SAndroid Build Coastguard Worker endif() 188*6777b538SAndroid Build Coastguard Worker endforeach() 189*6777b538SAndroid Build Coastguard Worker set(skip_next_cflag OFF) 190*6777b538SAndroid Build Coastguard Worker foreach(cflag ${ABSL_CC_LIB_COPTS}) 191*6777b538SAndroid Build Coastguard Worker if(skip_next_cflag) 192*6777b538SAndroid Build Coastguard Worker set(skip_next_cflag OFF) 193*6777b538SAndroid Build Coastguard Worker elseif(${cflag} MATCHES "^-Xarch_") 194*6777b538SAndroid Build Coastguard Worker # An -Xarch_ flag implies that its successor only applies to the 195*6777b538SAndroid Build Coastguard Worker # specified platform. Filter both of them out before the successor 196*6777b538SAndroid Build Coastguard Worker # reaches the "^-m" filter. 197*6777b538SAndroid Build Coastguard Worker set(skip_next_cflag ON) 198*6777b538SAndroid Build Coastguard Worker elseif(${cflag} MATCHES "^(-Wno|/wd)") 199*6777b538SAndroid Build Coastguard Worker # These flags are needed to suppress warnings that might fire in our headers. 200*6777b538SAndroid Build Coastguard Worker set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") 201*6777b538SAndroid Build Coastguard Worker elseif(${cflag} MATCHES "^(-W|/w[1234eo])") 202*6777b538SAndroid Build Coastguard Worker # Don't impose our warnings on others. 203*6777b538SAndroid Build Coastguard Worker elseif(${cflag} MATCHES "^-m") 204*6777b538SAndroid Build Coastguard Worker # Don't impose CPU instruction requirements on others, as 205*6777b538SAndroid Build Coastguard Worker # the code performs feature detection on runtime. 206*6777b538SAndroid Build Coastguard Worker else() 207*6777b538SAndroid Build Coastguard Worker set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") 208*6777b538SAndroid Build Coastguard Worker endif() 209*6777b538SAndroid Build Coastguard Worker endforeach() 210*6777b538SAndroid Build Coastguard Worker string(REPLACE ";" " " PC_LINKOPTS "${ABSL_CC_LIB_LINKOPTS}") 211*6777b538SAndroid Build Coastguard Worker FILE(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/lib/pkgconfig/absl_${_NAME}.pc" CONTENT "\ 212*6777b538SAndroid Build Coastguard Workerprefix=${CMAKE_INSTALL_PREFIX}\n\ 213*6777b538SAndroid Build Coastguard Workerexec_prefix=\${prefix}\n\ 214*6777b538SAndroid Build Coastguard Workerlibdir=${CMAKE_INSTALL_FULL_LIBDIR}\n\ 215*6777b538SAndroid Build Coastguard Workerincludedir=${CMAKE_INSTALL_FULL_INCLUDEDIR}\n\ 216*6777b538SAndroid Build Coastguard Worker\n\ 217*6777b538SAndroid Build Coastguard WorkerName: absl_${_NAME}\n\ 218*6777b538SAndroid Build Coastguard WorkerDescription: Abseil ${_NAME} library\n\ 219*6777b538SAndroid Build Coastguard WorkerURL: https://abseil.io/\n\ 220*6777b538SAndroid Build Coastguard WorkerVersion: ${PC_VERSION}\n\ 221*6777b538SAndroid Build Coastguard WorkerRequires:${PC_DEPS}\n\ 222*6777b538SAndroid Build Coastguard WorkerLibs: -L\${libdir} $<$<NOT:$<BOOL:${ABSL_CC_LIB_IS_INTERFACE}>>:${LNK_LIB}> ${PC_LINKOPTS}\n\ 223*6777b538SAndroid Build Coastguard WorkerCflags: -I\${includedir}${PC_CFLAGS}\n") 224*6777b538SAndroid Build Coastguard Worker INSTALL(FILES "${CMAKE_BINARY_DIR}/lib/pkgconfig/absl_${_NAME}.pc" 225*6777b538SAndroid Build Coastguard Worker DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 226*6777b538SAndroid Build Coastguard Worker endif() 227*6777b538SAndroid Build Coastguard Worker 228*6777b538SAndroid Build Coastguard Worker if(NOT ABSL_CC_LIB_IS_INTERFACE) 229*6777b538SAndroid Build Coastguard Worker if(_build_type STREQUAL "dll_dep") 230*6777b538SAndroid Build Coastguard Worker # This target depends on the DLL. When adding dependencies to this target, 231*6777b538SAndroid Build Coastguard Worker # any depended-on-target which is contained inside the DLL is replaced 232*6777b538SAndroid Build Coastguard Worker # with a dependency on the DLL. 233*6777b538SAndroid Build Coastguard Worker add_library(${_NAME} STATIC "") 234*6777b538SAndroid Build Coastguard Worker target_sources(${_NAME} PRIVATE ${ABSL_CC_LIB_SRCS} ${ABSL_CC_LIB_HDRS}) 235*6777b538SAndroid Build Coastguard Worker absl_internal_dll_targets( 236*6777b538SAndroid Build Coastguard Worker DEPS ${ABSL_CC_LIB_DEPS} 237*6777b538SAndroid Build Coastguard Worker OUTPUT _dll_deps 238*6777b538SAndroid Build Coastguard Worker ) 239*6777b538SAndroid Build Coastguard Worker target_link_libraries(${_NAME} 240*6777b538SAndroid Build Coastguard Worker PUBLIC ${_dll_deps} 241*6777b538SAndroid Build Coastguard Worker PRIVATE 242*6777b538SAndroid Build Coastguard Worker ${ABSL_CC_LIB_LINKOPTS} 243*6777b538SAndroid Build Coastguard Worker ${ABSL_DEFAULT_LINKOPTS} 244*6777b538SAndroid Build Coastguard Worker ) 245*6777b538SAndroid Build Coastguard Worker 246*6777b538SAndroid Build Coastguard Worker if (ABSL_CC_LIB_TESTONLY) 247*6777b538SAndroid Build Coastguard Worker set(_gtest_link_define "GTEST_LINKED_AS_SHARED_LIBRARY=1") 248*6777b538SAndroid Build Coastguard Worker else() 249*6777b538SAndroid Build Coastguard Worker set(_gtest_link_define) 250*6777b538SAndroid Build Coastguard Worker endif() 251*6777b538SAndroid Build Coastguard Worker 252*6777b538SAndroid Build Coastguard Worker target_compile_definitions(${_NAME} 253*6777b538SAndroid Build Coastguard Worker PUBLIC 254*6777b538SAndroid Build Coastguard Worker ABSL_CONSUME_DLL 255*6777b538SAndroid Build Coastguard Worker "${_gtest_link_define}" 256*6777b538SAndroid Build Coastguard Worker ) 257*6777b538SAndroid Build Coastguard Worker 258*6777b538SAndroid Build Coastguard Worker elseif(_build_type STREQUAL "static" OR _build_type STREQUAL "shared") 259*6777b538SAndroid Build Coastguard Worker add_library(${_NAME} "") 260*6777b538SAndroid Build Coastguard Worker target_sources(${_NAME} PRIVATE ${ABSL_CC_LIB_SRCS} ${ABSL_CC_LIB_HDRS}) 261*6777b538SAndroid Build Coastguard Worker target_link_libraries(${_NAME} 262*6777b538SAndroid Build Coastguard Worker PUBLIC ${ABSL_CC_LIB_DEPS} 263*6777b538SAndroid Build Coastguard Worker PRIVATE 264*6777b538SAndroid Build Coastguard Worker ${ABSL_CC_LIB_LINKOPTS} 265*6777b538SAndroid Build Coastguard Worker ${ABSL_DEFAULT_LINKOPTS} 266*6777b538SAndroid Build Coastguard Worker ) 267*6777b538SAndroid Build Coastguard Worker else() 268*6777b538SAndroid Build Coastguard Worker message(FATAL_ERROR "Invalid build type: ${_build_type}") 269*6777b538SAndroid Build Coastguard Worker endif() 270*6777b538SAndroid Build Coastguard Worker 271*6777b538SAndroid Build Coastguard Worker # Linker language can be inferred from sources, but in the case of DLLs we 272*6777b538SAndroid Build Coastguard Worker # don't have any .cc files so it would be ambiguous. We could set it 273*6777b538SAndroid Build Coastguard Worker # explicitly only in the case of DLLs but, because "CXX" is always the 274*6777b538SAndroid Build Coastguard Worker # correct linker language for static or for shared libraries, we set it 275*6777b538SAndroid Build Coastguard Worker # unconditionally. 276*6777b538SAndroid Build Coastguard Worker set_property(TARGET ${_NAME} PROPERTY LINKER_LANGUAGE "CXX") 277*6777b538SAndroid Build Coastguard Worker 278*6777b538SAndroid Build Coastguard Worker target_include_directories(${_NAME} ${ABSL_INTERNAL_INCLUDE_WARNING_GUARD} 279*6777b538SAndroid Build Coastguard Worker PUBLIC 280*6777b538SAndroid Build Coastguard Worker "$<BUILD_INTERFACE:${ABSL_COMMON_INCLUDE_DIRS}>" 281*6777b538SAndroid Build Coastguard Worker $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 282*6777b538SAndroid Build Coastguard Worker ) 283*6777b538SAndroid Build Coastguard Worker target_compile_options(${_NAME} 284*6777b538SAndroid Build Coastguard Worker PRIVATE ${ABSL_CC_LIB_COPTS}) 285*6777b538SAndroid Build Coastguard Worker target_compile_definitions(${_NAME} PUBLIC ${ABSL_CC_LIB_DEFINES}) 286*6777b538SAndroid Build Coastguard Worker 287*6777b538SAndroid Build Coastguard Worker # Add all Abseil targets to a a folder in the IDE for organization. 288*6777b538SAndroid Build Coastguard Worker if(ABSL_CC_LIB_PUBLIC) 289*6777b538SAndroid Build Coastguard Worker set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}) 290*6777b538SAndroid Build Coastguard Worker elseif(ABSL_CC_LIB_TESTONLY) 291*6777b538SAndroid Build Coastguard Worker set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/test) 292*6777b538SAndroid Build Coastguard Worker else() 293*6777b538SAndroid Build Coastguard Worker set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/internal) 294*6777b538SAndroid Build Coastguard Worker endif() 295*6777b538SAndroid Build Coastguard Worker 296*6777b538SAndroid Build Coastguard Worker if(ABSL_PROPAGATE_CXX_STD) 297*6777b538SAndroid Build Coastguard Worker # Abseil libraries require C++14 as the current minimum standard. When 298*6777b538SAndroid Build Coastguard Worker # compiled with a higher standard (either because it is the compiler's 299*6777b538SAndroid Build Coastguard Worker # default or explicitly requested), then Abseil requires that standard. 300*6777b538SAndroid Build Coastguard Worker target_compile_features(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) 301*6777b538SAndroid Build Coastguard Worker endif() 302*6777b538SAndroid Build Coastguard Worker 303*6777b538SAndroid Build Coastguard Worker # When being installed, we lose the absl_ prefix. We want to put it back 304*6777b538SAndroid Build Coastguard Worker # to have properly named lib files. This is a no-op when we are not being 305*6777b538SAndroid Build Coastguard Worker # installed. 306*6777b538SAndroid Build Coastguard Worker if(ABSL_ENABLE_INSTALL) 307*6777b538SAndroid Build Coastguard Worker set_target_properties(${_NAME} PROPERTIES 308*6777b538SAndroid Build Coastguard Worker OUTPUT_NAME "absl_${_NAME}" 309*6777b538SAndroid Build Coastguard Worker SOVERSION 0 310*6777b538SAndroid Build Coastguard Worker ) 311*6777b538SAndroid Build Coastguard Worker endif() 312*6777b538SAndroid Build Coastguard Worker else() 313*6777b538SAndroid Build Coastguard Worker # Generating header-only library 314*6777b538SAndroid Build Coastguard Worker add_library(${_NAME} INTERFACE) 315*6777b538SAndroid Build Coastguard Worker target_include_directories(${_NAME} ${ABSL_INTERNAL_INCLUDE_WARNING_GUARD} 316*6777b538SAndroid Build Coastguard Worker INTERFACE 317*6777b538SAndroid Build Coastguard Worker "$<BUILD_INTERFACE:${ABSL_COMMON_INCLUDE_DIRS}>" 318*6777b538SAndroid Build Coastguard Worker $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 319*6777b538SAndroid Build Coastguard Worker ) 320*6777b538SAndroid Build Coastguard Worker 321*6777b538SAndroid Build Coastguard Worker if (_build_type STREQUAL "dll") 322*6777b538SAndroid Build Coastguard Worker set(ABSL_CC_LIB_DEPS abseil_dll) 323*6777b538SAndroid Build Coastguard Worker endif() 324*6777b538SAndroid Build Coastguard Worker 325*6777b538SAndroid Build Coastguard Worker target_link_libraries(${_NAME} 326*6777b538SAndroid Build Coastguard Worker INTERFACE 327*6777b538SAndroid Build Coastguard Worker ${ABSL_CC_LIB_DEPS} 328*6777b538SAndroid Build Coastguard Worker ${ABSL_CC_LIB_LINKOPTS} 329*6777b538SAndroid Build Coastguard Worker ${ABSL_DEFAULT_LINKOPTS} 330*6777b538SAndroid Build Coastguard Worker ) 331*6777b538SAndroid Build Coastguard Worker target_compile_definitions(${_NAME} INTERFACE ${ABSL_CC_LIB_DEFINES}) 332*6777b538SAndroid Build Coastguard Worker 333*6777b538SAndroid Build Coastguard Worker if(ABSL_PROPAGATE_CXX_STD) 334*6777b538SAndroid Build Coastguard Worker # Abseil libraries require C++14 as the current minimum standard. 335*6777b538SAndroid Build Coastguard Worker # Top-level application CMake projects should ensure a consistent C++ 336*6777b538SAndroid Build Coastguard Worker # standard for all compiled sources by setting CMAKE_CXX_STANDARD. 337*6777b538SAndroid Build Coastguard Worker target_compile_features(${_NAME} INTERFACE ${ABSL_INTERNAL_CXX_STD_FEATURE}) 338*6777b538SAndroid Build Coastguard Worker endif() 339*6777b538SAndroid Build Coastguard Worker endif() 340*6777b538SAndroid Build Coastguard Worker 341*6777b538SAndroid Build Coastguard Worker if(ABSL_ENABLE_INSTALL) 342*6777b538SAndroid Build Coastguard Worker install(TARGETS ${_NAME} EXPORT ${PROJECT_NAME}Targets 343*6777b538SAndroid Build Coastguard Worker RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 344*6777b538SAndroid Build Coastguard Worker LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 345*6777b538SAndroid Build Coastguard Worker ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 346*6777b538SAndroid Build Coastguard Worker ) 347*6777b538SAndroid Build Coastguard Worker endif() 348*6777b538SAndroid Build Coastguard Worker 349*6777b538SAndroid Build Coastguard Worker add_library(absl::${ABSL_CC_LIB_NAME} ALIAS ${_NAME}) 350*6777b538SAndroid Build Coastguard Workerendfunction() 351*6777b538SAndroid Build Coastguard Worker 352*6777b538SAndroid Build Coastguard Worker# absl_cc_test() 353*6777b538SAndroid Build Coastguard Worker# 354*6777b538SAndroid Build Coastguard Worker# CMake function to imitate Bazel's cc_test rule. 355*6777b538SAndroid Build Coastguard Worker# 356*6777b538SAndroid Build Coastguard Worker# Parameters: 357*6777b538SAndroid Build Coastguard Worker# NAME: name of target (see Usage below) 358*6777b538SAndroid Build Coastguard Worker# SRCS: List of source files for the binary 359*6777b538SAndroid Build Coastguard Worker# DEPS: List of other libraries to be linked in to the binary targets 360*6777b538SAndroid Build Coastguard Worker# COPTS: List of private compile options 361*6777b538SAndroid Build Coastguard Worker# DEFINES: List of public defines 362*6777b538SAndroid Build Coastguard Worker# LINKOPTS: List of link options 363*6777b538SAndroid Build Coastguard Worker# 364*6777b538SAndroid Build Coastguard Worker# Note: 365*6777b538SAndroid Build Coastguard Worker# By default, absl_cc_test will always create a binary named absl_${NAME}. 366*6777b538SAndroid Build Coastguard Worker# This will also add it to ctest list as absl_${NAME}. 367*6777b538SAndroid Build Coastguard Worker# 368*6777b538SAndroid Build Coastguard Worker# Usage: 369*6777b538SAndroid Build Coastguard Worker# absl_cc_library( 370*6777b538SAndroid Build Coastguard Worker# NAME 371*6777b538SAndroid Build Coastguard Worker# awesome 372*6777b538SAndroid Build Coastguard Worker# HDRS 373*6777b538SAndroid Build Coastguard Worker# "a.h" 374*6777b538SAndroid Build Coastguard Worker# SRCS 375*6777b538SAndroid Build Coastguard Worker# "a.cc" 376*6777b538SAndroid Build Coastguard Worker# PUBLIC 377*6777b538SAndroid Build Coastguard Worker# ) 378*6777b538SAndroid Build Coastguard Worker# 379*6777b538SAndroid Build Coastguard Worker# absl_cc_test( 380*6777b538SAndroid Build Coastguard Worker# NAME 381*6777b538SAndroid Build Coastguard Worker# awesome_test 382*6777b538SAndroid Build Coastguard Worker# SRCS 383*6777b538SAndroid Build Coastguard Worker# "awesome_test.cc" 384*6777b538SAndroid Build Coastguard Worker# DEPS 385*6777b538SAndroid Build Coastguard Worker# absl::awesome 386*6777b538SAndroid Build Coastguard Worker# GTest::gmock 387*6777b538SAndroid Build Coastguard Worker# GTest::gtest_main 388*6777b538SAndroid Build Coastguard Worker# ) 389*6777b538SAndroid Build Coastguard Workerfunction(absl_cc_test) 390*6777b538SAndroid Build Coastguard Worker if(NOT (BUILD_TESTING AND ABSL_BUILD_TESTING)) 391*6777b538SAndroid Build Coastguard Worker return() 392*6777b538SAndroid Build Coastguard Worker endif() 393*6777b538SAndroid Build Coastguard Worker 394*6777b538SAndroid Build Coastguard Worker cmake_parse_arguments(ABSL_CC_TEST 395*6777b538SAndroid Build Coastguard Worker "" 396*6777b538SAndroid Build Coastguard Worker "NAME" 397*6777b538SAndroid Build Coastguard Worker "SRCS;COPTS;DEFINES;LINKOPTS;DEPS" 398*6777b538SAndroid Build Coastguard Worker ${ARGN} 399*6777b538SAndroid Build Coastguard Worker ) 400*6777b538SAndroid Build Coastguard Worker 401*6777b538SAndroid Build Coastguard Worker set(_NAME "absl_${ABSL_CC_TEST_NAME}") 402*6777b538SAndroid Build Coastguard Worker 403*6777b538SAndroid Build Coastguard Worker add_executable(${_NAME} "") 404*6777b538SAndroid Build Coastguard Worker target_sources(${_NAME} PRIVATE ${ABSL_CC_TEST_SRCS}) 405*6777b538SAndroid Build Coastguard Worker target_include_directories(${_NAME} 406*6777b538SAndroid Build Coastguard Worker PUBLIC ${ABSL_COMMON_INCLUDE_DIRS} 407*6777b538SAndroid Build Coastguard Worker PRIVATE ${absl_gtest_src_dir}/googletest/include ${absl_gtest_src_dir}/googlemock/include 408*6777b538SAndroid Build Coastguard Worker ) 409*6777b538SAndroid Build Coastguard Worker 410*6777b538SAndroid Build Coastguard Worker if (${ABSL_BUILD_DLL}) 411*6777b538SAndroid Build Coastguard Worker target_compile_definitions(${_NAME} 412*6777b538SAndroid Build Coastguard Worker PUBLIC 413*6777b538SAndroid Build Coastguard Worker ${ABSL_CC_TEST_DEFINES} 414*6777b538SAndroid Build Coastguard Worker ABSL_CONSUME_DLL 415*6777b538SAndroid Build Coastguard Worker ABSL_CONSUME_TEST_DLL 416*6777b538SAndroid Build Coastguard Worker GTEST_LINKED_AS_SHARED_LIBRARY=1 417*6777b538SAndroid Build Coastguard Worker ) 418*6777b538SAndroid Build Coastguard Worker 419*6777b538SAndroid Build Coastguard Worker # Replace dependencies on targets inside the DLL with abseil_dll itself. 420*6777b538SAndroid Build Coastguard Worker absl_internal_dll_targets( 421*6777b538SAndroid Build Coastguard Worker DEPS ${ABSL_CC_TEST_DEPS} 422*6777b538SAndroid Build Coastguard Worker OUTPUT ABSL_CC_TEST_DEPS 423*6777b538SAndroid Build Coastguard Worker ) 424*6777b538SAndroid Build Coastguard Worker absl_internal_dll_targets( 425*6777b538SAndroid Build Coastguard Worker DEPS ${ABSL_CC_TEST_LINKOPTS} 426*6777b538SAndroid Build Coastguard Worker OUTPUT ABSL_CC_TEST_LINKOPTS 427*6777b538SAndroid Build Coastguard Worker ) 428*6777b538SAndroid Build Coastguard Worker else() 429*6777b538SAndroid Build Coastguard Worker target_compile_definitions(${_NAME} 430*6777b538SAndroid Build Coastguard Worker PUBLIC 431*6777b538SAndroid Build Coastguard Worker ${ABSL_CC_TEST_DEFINES} 432*6777b538SAndroid Build Coastguard Worker ) 433*6777b538SAndroid Build Coastguard Worker endif() 434*6777b538SAndroid Build Coastguard Worker target_compile_options(${_NAME} 435*6777b538SAndroid Build Coastguard Worker PRIVATE ${ABSL_CC_TEST_COPTS} 436*6777b538SAndroid Build Coastguard Worker ) 437*6777b538SAndroid Build Coastguard Worker 438*6777b538SAndroid Build Coastguard Worker target_link_libraries(${_NAME} 439*6777b538SAndroid Build Coastguard Worker PUBLIC ${ABSL_CC_TEST_DEPS} 440*6777b538SAndroid Build Coastguard Worker PRIVATE ${ABSL_CC_TEST_LINKOPTS} 441*6777b538SAndroid Build Coastguard Worker ) 442*6777b538SAndroid Build Coastguard Worker # Add all Abseil targets to a folder in the IDE for organization. 443*6777b538SAndroid Build Coastguard Worker set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/test) 444*6777b538SAndroid Build Coastguard Worker 445*6777b538SAndroid Build Coastguard Worker if(ABSL_PROPAGATE_CXX_STD) 446*6777b538SAndroid Build Coastguard Worker # Abseil libraries require C++14 as the current minimum standard. 447*6777b538SAndroid Build Coastguard Worker # Top-level application CMake projects should ensure a consistent C++ 448*6777b538SAndroid Build Coastguard Worker # standard for all compiled sources by setting CMAKE_CXX_STANDARD. 449*6777b538SAndroid Build Coastguard Worker target_compile_features(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) 450*6777b538SAndroid Build Coastguard Worker endif() 451*6777b538SAndroid Build Coastguard Worker 452*6777b538SAndroid Build Coastguard Worker add_test(NAME ${_NAME} COMMAND ${_NAME}) 453*6777b538SAndroid Build Coastguard Workerendfunction() 454