From ac533e18db2c8952255f89449ee278d876d20785 Mon Sep 17 00:00:00 2001 From: Loo Rong Jie Date: Fri, 29 Jun 2018 08:45:27 +0800 Subject: [PATCH] [CMake] Implement absl_cc_library as Bazel's cc_library cc_library --- CMake/AbseilHelpers.cmake | 107 ++++++++++++++++++++++++++++ absl/base/CMakeLists.txt | 31 ++++---- absl/strings/CMakeLists.txt | 136 ++++++++++++++++-------------------- 3 files changed, 179 insertions(+), 95 deletions(-) diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake index 0c9341747..1bb270feb 100644 --- a/CMake/AbseilHelpers.cmake +++ b/CMake/AbseilHelpers.cmake @@ -62,7 +62,114 @@ function(absl_library) endif() endfunction() +# +# 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 +# VISIBILITY_PUBLIC: Add this so that this library will be exported under absl:: (see Note). +# TESTONLY: When added, this target will only be built if user passes -DBUILD_TESTING=ON to CMake. +# +# Note: +# +# By default, absl_cc_library will always create a library named absl_${NAME}, +# which means other targets can only depend this library as absl_${NAME}, not ${NAME}. +# This is to reduce namespace pollution. +# +# absl_cc_library( +# NAME +# awesome_lib +# HDRS +# "a.h" +# SRCS +# "a.cc" +# ) +# absl_cc_library( +# NAME +# fantastic_lib +# SRCS +# "b.cc" +# DEPS +# absl_awesome_lib # not "awesome_lib"! +# ) +# +# If VISIBILITY_PUBLIC is set, absl_cc_library will also create an alias absl::${NAME} +# for public use. +# +# absl_cc_library( +# NAME +# main_lib +# ... +# VISIBILITY_PUBLIC +# ) +# +# User can then use the library as absl::main_lib (although absl_main_lib is defined too). +# +# TODO: Implement "ALWAYSLINK" +function(absl_cc_library) + cmake_parse_arguments(ABSL_CC_LIB + "DISABLE_INSTALL;VISIBILITY_PUBLIC;TESTONLY" + "NAME" + "HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DEPS" + ${ARGN} + ) + + if (NOT ABSL_CC_LIB_TESTONLY OR BUILD_TESTING) + set(_NAME "absl_${ABSL_CC_LIB_NAME}") + string(TOUPPER ${_NAME} _UPPER_NAME) + + # Check if this is a header-only library + if (ABSL_CC_LIB_SRCS) + set(_SRCS ${ABSL_CC_LIB_SRCS}) + list(FILTER _SRCS INCLUDE REGEX "\.cc$") + list(LENGTH _SRCS ABSL_CC_LIB_SRCS_LEN) + else() + set(ABSL_CC_LIB_SRCS_LEN 0) + endif() + + if(ABSL_CC_LIB_SRCS_LEN) + add_library(${_NAME} STATIC ${ABSL_CC_LIB_SRCS} ${ABSL_CC_LIB_HDRS}) + else() + set(__dummy_header_only_lib_file "${CMAKE_CURRENT_BINARY_DIR}/${_NAME}_header_only_dummy.cc") + + if(NOT EXISTS ${__dummy_header_only_lib_file}) + file(WRITE ${__dummy_header_only_lib_file} + "/* generated file for header-only cmake target */ + + namespace absl { + // single meaningless symbol + void ${_NAME}__header_fakesym() {} + } // namespace absl") + endif() + + add_library(${_NAME} ${__dummy_header_only_lib_file} ${ABSL_CC_LIB_HDRS}) + endif() + + target_compile_options(${_NAME} PRIVATE ${ABSL_COMPILE_CXXFLAGS} ${ABSL_CC_LIB_COPTS}) + target_link_libraries(${_NAME} + PUBLIC ${ABSL_CC_LIB_DEPS} + PRIVATE ${ABSL_CC_LIB_LINKOPTS} + ) + target_compile_definitions(${_NAME} PUBLIC ${ABSL_CC_LIB_DEFINES}) + + target_include_directories(${_NAME} + PUBLIC ${ABSL_COMMON_INCLUDE_DIRS} + ) + # Add all Abseil targets to a a folder in the IDE for organization. + set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}) + + if(ABSL_CC_LIB_VISIBILITY_PUBLIC) + add_library(absl::${ABSL_CC_LIB_NAME} ALIAS ${_NAME}) + endif() + endif() +endfunction() # # header only virtual target creation diff --git a/absl/base/CMakeLists.txt b/absl/base/CMakeLists.txt index 04a6eb319..a73ea359d 100644 --- a/absl/base/CMakeLists.txt +++ b/absl/base/CMakeLists.txt @@ -99,33 +99,26 @@ absl_library( throw_delegate ) -if(BUILD_TESTING) - # exception-safety testing library - set(EXCEPTION_SAFETY_TESTING_SRC + +# exception-safety testing library +absl_cc_library( + NAME + exception_safety_testing + HDRS "internal/exception_safety_testing.h" + SRCS "internal/exception_safety_testing.cc" - ) - set(EXCEPTION_SAFETY_TESTING_PUBLIC_LIBRARIES - ${ABSL_TEST_COMMON_LIBRARIES} + COPTS + ${ABSL_EXCEPTIONS_FLAG} + DEPS absl::base absl::memory absl::meta absl::strings absl::optional gtest - ) - -absl_library( - TARGET - absl_base_internal_exception_safety_testing - SOURCES - ${EXCEPTION_SAFETY_TESTING_SRC} - PUBLIC_LIBRARIES - ${EXCEPTION_SAFETY_TESTING_PUBLIC_LIBRARIES} - PRIVATE_COMPILE_FLAGS - ${ABSL_EXCEPTIONS_FLAG} + TESTONLY ) -endif() # dynamic_annotations library @@ -368,7 +361,7 @@ absl_test( set(EXCEPTION_SAFETY_TESTING_TEST_SRC "exception_safety_testing_test.cc") set(EXCEPTION_SAFETY_TESTING_TEST_PUBLIC_LIBRARIES absl::base - absl_base_internal_exception_safety_testing + absl_exception_safety_testing absl::memory absl::meta absl::strings diff --git a/absl/strings/CMakeLists.txt b/absl/strings/CMakeLists.txt index f3e416238..9fb96c7be 100644 --- a/absl/strings/CMakeLists.txt +++ b/absl/strings/CMakeLists.txt @@ -14,87 +14,71 @@ # limitations under the License. # - -list(APPEND STRINGS_PUBLIC_HEADERS - "ascii.h" - "charconv.h" - "escaping.h" - "match.h" - "numbers.h" - "str_cat.h" - "string_view.h" - "strip.h" - "str_join.h" - "str_replace.h" - "str_split.h" - "substitute.h" -) - - -list(APPEND STRINGS_INTERNAL_HEADERS - "internal/char_map.h" - "internal/charconv_bigint.h" - "internal/charconv_parse.h" - "internal/memutil.h" - "internal/ostringstream.h" - "internal/resize_uninitialized.h" - "internal/stl_type_traits.h" - "internal/str_join_internal.h" - "internal/str_split_internal.h" - "internal/utf8.h" -) - - - -# add string library -list(APPEND STRINGS_SRC - "ascii.cc" - "charconv.cc" - "escaping.cc" - "internal/charconv_bigint.cc" - "internal/charconv_parse.cc" - "internal/memutil.cc" - "internal/memutil.h" - "internal/utf8.cc" - "internal/ostringstream.cc" - "match.cc" - "numbers.cc" - "str_cat.cc" - "str_replace.cc" - "str_split.cc" - "string_view.cc" - "substitute.cc" - ${STRINGS_PUBLIC_HEADERS} - ${STRINGS_INTERNAL_HEADERS} -) -set(STRINGS_PUBLIC_LIBRARIES absl::base absl_throw_delegate) - -absl_library( - TARGET - absl_strings - SOURCES - ${STRINGS_SRC} - PUBLIC_LIBRARIES - ${STRINGS_PUBLIC_LIBRARIES} - EXPORT_NAME +absl_cc_library( + NAME strings + HDRS + "ascii.h" + "charconv.h" + "escaping.h" + "match.h" + "numbers.h" + "str_cat.h" + "string_view.h" + "strip.h" + "str_join.h" + "str_replace.h" + "str_split.h" + "substitute.h" + SRCS + "ascii.cc" + "charconv.cc" + "escaping.cc" + "internal/bits.h" + "internal/char_map.h" + "internal/charconv_bigint.cc" + "internal/charconv_bigint.h" + "internal/charconv_parse.cc" + "internal/charconv_parse.h" + "internal/memutil.cc" + "internal/memutil.h" + "internal/ostringstream.cc" + "internal/ostringstream.h" + "internal/resize_uninitialized.h" + "internal/stl_type_traits.h" + "internal/str_join_internal.h" + "internal/str_split_internal.h" + "internal/utf8.cc" + "internal/utf8.h" + "match.cc" + "numbers.cc" + "str_cat.cc" + "str_replace.cc" + "str_split.cc" + "string_view.cc" + "substitute.cc" + DEPS + absl::base + absl_throw_delegate + VISIBILITY_PUBLIC ) # add str_format library -absl_header_library( - TARGET - absl_str_format - PUBLIC_LIBRARIES - str_format_internal - EXPORT_NAME +absl_cc_library( + NAME str_format + HDRS + "str_format.h" + DEPS + absl_str_format_internal + VISIBILITY_PUBLIC ) # str_format_internal -absl_library( - TARGET +absl_cc_library( + NAME str_format_internal - SOURCES + SRCS "internal/str_format/arg.cc" "internal/str_format/bind.cc" "internal/str_format/extension.cc" @@ -108,7 +92,7 @@ absl_library( "internal/str_format/float_conversion.h" "internal/str_format/output.h" "internal/str_format/parser.h" - PUBLIC_LIBRARIES + DEPS str_format_extension_internal absl::strings absl::base @@ -415,7 +399,7 @@ absl_test( SOURCES "internal/str_format/bind_test.cc" PUBLIC_LIBRARIES - str_format_internal + absl_str_format_internal ) # test str_format_checker_test @@ -435,7 +419,7 @@ absl_test( SOURCES "internal/str_format/convert_test.cc" PUBLIC_LIBRARIES - str_format_internal + absl_str_format_internal absl::numeric ) @@ -456,7 +440,7 @@ absl_test( SOURCES "internal/str_format/parser_test.cc" PUBLIC_LIBRARIES - str_format_internal + absl_str_format_internal absl::base )