summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Loo Rong Jie <loorongjie@gmail.com>2018-06-29 08:45:27 +0800
committerGravatar Loo Rong Jie <loorongjie@gmail.com>2018-10-09 23:33:44 +0800
commitac533e18db2c8952255f89449ee278d876d20785 (patch)
tree904cc2676e841e1bdd45248215d5ed5c7c74a43a
parent48cd2c3f351ff188bc85684b84a91b6e6d17d896 (diff)
[CMake] Implement absl_cc_library as Bazel's cc_library
cc_library
-rw-r--r--CMake/AbseilHelpers.cmake107
-rw-r--r--absl/base/CMakeLists.txt31
-rw-r--r--absl/strings/CMakeLists.txt136
3 files changed, 179 insertions, 95 deletions
diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake
index 0c934174..1bb270fe 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 04a6eb31..a73ea359 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 f3e41623..9fb96c7b 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
)