| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 | ## 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.#include(CMakeParseArguments)include(AbseilConfigureCopts)include(AbseilDll)include(AbseilInstallDirs)# The IDE folder for Abseil that will be used if Abseil is included in a CMake# project that sets#    set_property(GLOBAL PROPERTY USE_FOLDERS ON)# For example, Visual Studio supports folders.set(ABSL_IDE_FOLDER Abseil)# absl_cc_library()## CMake function to imitate Bazel's cc_library rule.## Parameters:# NAME: name of target (see Note)# HDRS: List of public header files for the library# SRCS: List of source files for the library# DEPS: List of other libraries to be linked in to the binary targets# COPTS: List of private compile options# DEFINES: List of public defines# LINKOPTS: List of link options# PUBLIC: Add this so that this library will be exported under absl::# Also in IDE, target will appear in Abseil folder while non PUBLIC will be in Abseil/internal.# TESTONLY: When added, this target will only be built if user passes -DABSL_RUN_TESTS=ON to CMake.## Note:# By default, absl_cc_library will always create a library named absl_${NAME},# and alias target absl::${NAME}.  The absl:: form should always be used.# This is to reduce namespace pollution.## absl_cc_library(#   NAME#     awesome#   HDRS#     "a.h"#   SRCS#     "a.cc"# )# absl_cc_library(#   NAME#     fantastic_lib#   SRCS#     "b.cc"#   DEPS#     absl::awesome # not "awesome" !#   PUBLIC# )## absl_cc_library(#   NAME#     main_lib#   ...#   DEPS#     absl::fantastic_lib# )## TODO: Implement "ALWAYSLINK"function(absl_cc_library)  cmake_parse_arguments(ABSL_CC_LIB    "DISABLE_INSTALL;PUBLIC;TESTONLY"    "NAME"    "HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DEPS"    ${ARGN}  )  if(ABSL_CC_LIB_TESTONLY AND NOT ABSL_RUN_TESTS)    return()  endif()  if(ABSL_ENABLE_INSTALL)    set(_NAME "${ABSL_CC_LIB_NAME}")  else()    set(_NAME "absl_${ABSL_CC_LIB_NAME}")  endif()  # Check if this is a header-only library  # Note that as of February 2019, many popular OS's (for example, Ubuntu  # 16.04 LTS) only come with cmake 3.5 by default.  For this reason, we can't  # use list(FILTER...)  set(ABSL_CC_SRCS "${ABSL_CC_LIB_SRCS}")  foreach(src_file IN LISTS ABSL_CC_SRCS)    if(${src_file} MATCHES ".*\\.(h|inc)")      list(REMOVE_ITEM ABSL_CC_SRCS "${src_file}")    endif()  endforeach()  if("${ABSL_CC_SRCS}" STREQUAL "")    set(ABSL_CC_LIB_IS_INTERFACE 1)  else()    set(ABSL_CC_LIB_IS_INTERFACE 0)  endif()  # Determine this build target's relationship to the DLL. It's one of four things:  # 1. "dll"     -- This target is part of the DLL  # 2. "dll_dep" -- This target is not part of the DLL, but depends on the DLL.  #                 Note that we assume any target not in the DLL depends on the  #                 DLL. This is not a technical necessity but a convenience  #                 which happens to be true, because nearly every target is  #                 part of the DLL.  # 3. "shared"  -- This is a shared library, perhaps on a non-windows platform  #                 where DLL doesn't make sense.  # 4. "static"  -- This target does not depend on the DLL and should be built  #                 statically.  if (${ABSL_BUILD_DLL})    absl_internal_dll_contains(TARGET ${_NAME} OUTPUT _in_dll)    if (${_in_dll})      # This target should be replaced by the DLL      set(_build_type "dll")      set(ABSL_CC_LIB_IS_INTERFACE 1)    else()      # Building a DLL, but this target is not part of the DLL      set(_build_type "dll_dep")    endif()  elseif(BUILD_SHARED_LIBS)    set(_build_type "shared")  else()    set(_build_type "static")  endif()  if(NOT ABSL_CC_LIB_IS_INTERFACE)    if(${_build_type} STREQUAL "dll_dep")      # This target depends on the DLL. When adding dependencies to this target,      # any depended-on-target which is contained inside the DLL is replaced      # with a dependency on the DLL.      add_library(${_NAME} STATIC "")      target_sources(${_NAME} PRIVATE ${ABSL_CC_LIB_SRCS} ${ABSL_CC_LIB_HDRS})      absl_internal_dll_targets(        DEPS ${ABSL_CC_LIB_DEPS}        OUTPUT _dll_deps      )      target_link_libraries(${_NAME}        PUBLIC ${_dll_deps}        PRIVATE          ${ABSL_CC_LIB_LINKOPTS}          ${ABSL_DEFAULT_LINKOPTS}      )      if (ABSL_CC_LIB_TESTONLY)        set(_gtest_link_define "GTEST_LINKED_AS_SHARED_LIBRARY=1")      else()        set(_gtest_link_define)      endif()      target_compile_definitions(${_NAME}        PUBLIC          ABSL_CONSUME_DLL          "${_gtest_link_define}"      )    elseif(${_build_type} STREQUAL "static" OR ${_build_type} STREQUAL "shared")      add_library(${_NAME} "")      target_sources(${_NAME} PRIVATE ${ABSL_CC_LIB_SRCS} ${ABSL_CC_LIB_HDRS})      target_link_libraries(${_NAME}      PUBLIC ${ABSL_CC_LIB_DEPS}      PRIVATE        ${ABSL_CC_LIB_LINKOPTS}        ${ABSL_DEFAULT_LINKOPTS}      )    else()      message(FATAL_ERROR "Invalid build type: ${_build_type}")    endif()    # Linker language can be inferred from sources, but in the case of DLLs we    # don't have any .cc files so it would be ambiguous. We could set it    # explicitly only in the case of DLLs but, because "CXX" is always the    # correct linker language for static or for shared libraries, we set it    # unconditionally.    set_property(TARGET ${_NAME} PROPERTY LINKER_LANGUAGE "CXX")    target_include_directories(${_NAME}      PUBLIC        "$<BUILD_INTERFACE:${ABSL_COMMON_INCLUDE_DIRS}>"        $<INSTALL_INTERFACE:${ABSL_INSTALL_INCLUDEDIR}>    )    target_compile_options(${_NAME}      PRIVATE ${ABSL_CC_LIB_COPTS})    target_compile_definitions(${_NAME} PUBLIC ${ABSL_CC_LIB_DEFINES})    # Add all Abseil targets to a a folder in the IDE for organization.    if(ABSL_CC_LIB_PUBLIC)      set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER})    elseif(ABSL_CC_LIB_TESTONLY)      set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/test)    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)    # When being installed, we lose the absl_ prefix.  We want to put it back    # to have properly named lib files.  This is a no-op when we are not being    # installed.    if(ABSL_ENABLE_INSTALL)      set_target_properties(${_NAME} PROPERTIES        OUTPUT_NAME "absl_${_NAME}"      )    endif()  else()    # Generating header-only library    add_library(${_NAME} INTERFACE)    target_include_directories(${_NAME}      INTERFACE        "$<BUILD_INTERFACE:${ABSL_COMMON_INCLUDE_DIRS}>"        $<INSTALL_INTERFACE:${ABSL_INSTALL_INCLUDEDIR}>      )    if (${_build_type} STREQUAL "dll")        set(ABSL_CC_LIB_DEPS abseil_dll)    endif()    target_link_libraries(${_NAME}      INTERFACE        ${ABSL_CC_LIB_DEPS}        ${ABSL_CC_LIB_LINKOPTS}        ${ABSL_DEFAULT_LINKOPTS}    )    target_compile_definitions(${_NAME} INTERFACE ${ABSL_CC_LIB_DEFINES})  endif()  # TODO currently we don't install googletest alongside abseil sources, so  # installed abseil can't be tested.  if(NOT ABSL_CC_LIB_TESTONLY AND ABSL_ENABLE_INSTALL)    install(TARGETS ${_NAME} EXPORT ${PROJECT_NAME}Targets          RUNTIME DESTINATION ${ABSL_INSTALL_BINDIR}          LIBRARY DESTINATION ${ABSL_INSTALL_LIBDIR}          ARCHIVE DESTINATION ${ABSL_INSTALL_LIBDIR}    )  endif()    add_library(absl::${ABSL_CC_LIB_NAME} ALIAS ${_NAME})endfunction()# absl_cc_test()## CMake function to imitate Bazel's cc_test rule.## Parameters:# NAME: name of target (see Usage below)# SRCS: List of source files for the binary# DEPS: List of other libraries to be linked in to the binary targets# COPTS: List of private compile options# DEFINES: List of public defines# LINKOPTS: List of link options## Note:# By default, absl_cc_test will always create a binary named absl_${NAME}.# This will also add it to ctest list as absl_${NAME}.## Usage:# absl_cc_library(#   NAME#     awesome#   HDRS#     "a.h"#   SRCS#     "a.cc"#   PUBLIC# )## absl_cc_test(#   NAME#     awesome_test#   SRCS#     "awesome_test.cc"#   DEPS#     absl::awesome#     gmock#     gtest_main# )function(absl_cc_test)  if(NOT ABSL_RUN_TESTS)    return()  endif()  cmake_parse_arguments(ABSL_CC_TEST    ""    "NAME"    "SRCS;COPTS;DEFINES;LINKOPTS;DEPS"    ${ARGN}  )  set(_NAME "absl_${ABSL_CC_TEST_NAME}")  add_executable(${_NAME} "")  target_sources(${_NAME} PRIVATE ${ABSL_CC_TEST_SRCS})  target_include_directories(${_NAME}    PUBLIC ${ABSL_COMMON_INCLUDE_DIRS}    PRIVATE ${GMOCK_INCLUDE_DIRS} ${GTEST_INCLUDE_DIRS}  )  if (${ABSL_BUILD_DLL})    target_compile_definitions(${_NAME}      PUBLIC        ${ABSL_CC_TEST_DEFINES}        ABSL_CONSUME_DLL        GTEST_LINKED_AS_SHARED_LIBRARY=1    )    # Replace dependencies on targets inside the DLL with abseil_dll itself.    absl_internal_dll_targets(      DEPS ${ABSL_CC_TEST_DEPS}      OUTPUT ABSL_CC_TEST_DEPS    )  else()    target_compile_definitions(${_NAME}      PUBLIC        ${ABSL_CC_TEST_DEFINES}    )  endif()  target_compile_options(${_NAME}    PRIVATE ${ABSL_CC_TEST_COPTS}  )  target_link_libraries(${_NAME}    PUBLIC ${ABSL_CC_TEST_DEPS}    PRIVATE ${ABSL_CC_TEST_LINKOPTS}  )  # Add all Abseil targets to 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()function(check_target my_target)  if(NOT TARGET ${my_target})    message(FATAL_ERROR " ABSL: compiling absl requires a ${my_target} CMake target in your project,                   see CMake/README.md for more details")  endif(NOT TARGET ${my_target})endfunction()
 |