aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gil <mcg@google.com>2018-01-17 10:24:27 -0800
committerGravatar GitHub <noreply@github.com>2018-01-17 10:24:27 -0800
commit6a3379db62ccbce7fc9a859032955614e78e68bb (patch)
treee50af3689dfcb0a55478bc92272821bbbc6a8f81
parentc3664973a94a2c715b9c57583f5953483caf2cce (diff)
Add a cc_library to the CMake build (#670)
* Rewrite cc_test to take named arguments Cut down on build file verbosity by having cc_test take SOURCES and DEPENDS. The separate invocation of target_link_libraries is no longer necessary. * Add a cc_library rule to parallel cc_test This cuts down on build file verbosity. * Automatically add OBJC_FLAGS to cc_libraries if applicable * Exclude platform-specific libraries from 'all' This is makes it possible to declare this kind of library unconditionally. Usage within a test or as a dependency will actually trigger building. * Restore secure_random_test.cc; clean-up comments
-rw-r--r--Firestore/core/src/firebase/firestore/remote/CMakeLists.txt13
-rw-r--r--Firestore/core/src/firebase/firestore/util/CMakeLists.txt92
-rw-r--r--Firestore/core/test/firebase/firestore/remote/CMakeLists.txt9
-rw-r--r--Firestore/core/test/firebase/firestore/util/CMakeLists.txt35
-rw-r--r--cmake/utils.cmake80
5 files changed, 140 insertions, 89 deletions
diff --git a/Firestore/core/src/firebase/firestore/remote/CMakeLists.txt b/Firestore/core/src/firebase/firestore/remote/CMakeLists.txt
index 74ad80b..43320ce 100644
--- a/Firestore/core/src/firebase/firestore/remote/CMakeLists.txt
+++ b/Firestore/core/src/firebase/firestore/remote/CMakeLists.txt
@@ -12,12 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-add_library(
+cc_library(
firebase_firestore_remote
- datastore.h
- datastore.cc
-)
-target_link_libraries(
- firebase_firestore_remote
- grpc::grpc
+ SOURCES
+ datastore.h
+ datastore.cc
+ DEPENDS
+ grpc::grpc
)
diff --git a/Firestore/core/src/firebase/firestore/util/CMakeLists.txt b/Firestore/core/src/firebase/firestore/util/CMakeLists.txt
index 3028a95..7283942 100644
--- a/Firestore/core/src/firebase/firestore/util/CMakeLists.txt
+++ b/Firestore/core/src/firebase/firestore/util/CMakeLists.txt
@@ -16,69 +16,61 @@
# libraries in here are an implementation detail of making this a
# mutli-platform build.
-add_library(
+cc_library(
firebase_firestore_util_base
- secure_random_arc4random.cc
- string_printf.cc
-)
-target_link_libraries(
- firebase_firestore_util_base
- PUBLIC
- absl_base
+ SOURCES
+ secure_random.h
+ secure_random_arc4random.cc
+ string_printf.cc
+ string_printf.h
+ DEPENDS
+ absl_base
)
-# stdio-dependent bits can be built and tested everywhere
-add_library(
- firebase_firestore_util_stdio
- assert_stdio.cc
- log_stdio.cc
-)
-target_link_libraries(
+## assert and log
+
+cc_library(
firebase_firestore_util_stdio
- PUBLIC
- firebase_firestore_util_base
+ SOURCES
+ assert_stdio.cc
+ log_stdio.cc
+ DEPENDS
+ firebase_firestore_util_base
+ absl_base
+ EXCLUDE_FROM_ALL
)
-# apple-dependent bits can only built and tested on apple plaforms
-if(APPLE)
- add_library(
- firebase_firestore_util_apple
+cc_library(
+ firebase_firestore_util_apple
+ SOURCES
assert_apple.mm
log_apple.mm
- )
- target_compile_options(
- firebase_firestore_util_apple
- PRIVATE
- ${OBJC_FLAGS}
- )
- target_link_libraries(
- firebase_firestore_util_apple
- PUBLIC
+ string_apple.h
+ DEPENDS
FirebaseCore
- )
-endif(APPLE)
-
-add_library(
- firebase_firestore_util
- autoid.cc
+ EXCLUDE_FROM_ALL
)
# Export a dependency on the correct logging library for this platform. All
# buildable libraries are built and tested but only the best fit is exported.
if(APPLE)
- target_link_libraries(
- firebase_firestore_util
- PUBLIC
- firebase_firestore_util_apple
- firebase_firestore_util_base
- )
+ list(APPEND UTIL_DEPENDS firebase_firestore_util_apple)
+else()
+ list(APPEND UTIL_DEPENDS firebase_firestore_util_stdio)
+endif()
-else(NOT APPLE)
- target_link_libraries(
- firebase_firestore_util
- PUBLIC
- firebase_firestore_util_stdio
- firebase_firestore_util_base
- )
-endif(APPLE)
+## main library
+
+cc_library(
+ firebase_firestore_util
+ SOURCES
+ autoid.cc
+ autoid.h
+ firebase_assert.h
+ log.h
+ DEPENDS
+ ${UTIL_DEPENDS}
+ firebase_firestore_util_base
+ absl_base
+)
diff --git a/Firestore/core/test/firebase/firestore/remote/CMakeLists.txt b/Firestore/core/test/firebase/firestore/remote/CMakeLists.txt
index f0731c3..7d99e6f 100644
--- a/Firestore/core/test/firebase/firestore/remote/CMakeLists.txt
+++ b/Firestore/core/test/firebase/firestore/remote/CMakeLists.txt
@@ -14,9 +14,8 @@
cc_test(
firebase_firestore_remote_test
- datastore_test.cc
-)
-target_link_libraries(
- firebase_firestore_remote_test
- firebase_firestore_remote
+ SOURCES
+ datastore_test.cc
+ DEPENDS
+ firebase_firestore_remote
)
diff --git a/Firestore/core/test/firebase/firestore/util/CMakeLists.txt b/Firestore/core/test/firebase/firestore/util/CMakeLists.txt
index e51bb51..7f0539c 100644
--- a/Firestore/core/test/firebase/firestore/util/CMakeLists.txt
+++ b/Firestore/core/test/firebase/firestore/util/CMakeLists.txt
@@ -14,33 +14,30 @@
cc_test(
firebase_firestore_util_test
- autoid_test.cc
- secure_random_test.cc
- string_printf_test.cc
-)
-target_link_libraries(
- firebase_firestore_util_test
- firebase_firestore_util
+ SOURCES
+ autoid_test.cc
+ secure_random_test.cc
+ string_printf_test.cc
+ DEPENDS
+ firebase_firestore_util
)
if(APPLE)
cc_test(
firebase_firestore_util_apple_test
- assert_test.cc
- log_test.cc
- )
- target_link_libraries(
- firebase_firestore_util_apple_test
- firebase_firestore_util_apple
+ SOURCES
+ assert_test.cc
+ log_test.cc
+ DEPENDS
+ firebase_firestore_util_apple
)
endif(APPLE)
cc_test(
firebase_firestore_util_stdio_test
- assert_test.cc
- log_test.cc
-)
-target_link_libraries(
- firebase_firestore_util_stdio_test
- firebase_firestore_util_stdio
+ SOURCES
+ assert_test.cc
+ log_test.cc
+ DEPENDS
+ firebase_firestore_util_stdio
)
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index 54044d6..1c3cbd6 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -12,16 +12,80 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# Defines a new test executable and does all the things we want done with
-# tests:
+include(CMakeParseArguments)
+
+# cc_library(
+# target
+# SOURCES sources...
+# DEPENDS libraries...
+# )
+#
+# Defines a new library target with the given target name, sources, and dependencies.
+function(cc_library name)
+ set(flag EXCLUDE_FROM_ALL)
+ set(multi DEPENDS SOURCES)
+ cmake_parse_arguments(ccl "${flag}" "" "${multi}" ${ARGN})
+
+ add_library(
+ ${name}
+ ${ccl_SOURCES}
+ )
+ add_objc_flags(${name} ccl)
+ target_link_libraries(
+ ${name}
+ PUBLIC
+ ${ccl_DEPENDS}
+ )
+
+ if(ccl_EXCLUDE_FROM_ALL)
+ set_property(
+ TARGET ${name}
+ PROPERTY EXCLUDE_FROM_ALL ON
+ )
+ endif()
+
+endfunction()
+
+# cc_test(
+# target
+# SOURCES sources...
+# DEPENDS libraries...
+# )
#
-# * add_executable (with the given arguments)
-# * add_Test - defines a test with the same name
-# * declares that the test links against gtest
-# * adds the executable as a dependency of the `check` target.
+# Defines a new test executable target with the given target name, sources, and
+# dependencies. Implicitly adds DEPENDS on GTest::GTest and GTest::Main.
function(cc_test name)
- add_executable(${name} ${ARGN})
+ set(multi DEPENDS SOURCES)
+ cmake_parse_arguments(cct "" "" "${multi}" ${ARGN})
+
+ list(APPEND cct_DEPENDS GTest::GTest GTest::Main)
+
+ add_executable(${name} ${cct_SOURCES})
+ add_objc_flags(${name} cct)
add_test(${name} ${name})
- target_link_libraries(${name} GTest::GTest GTest::Main)
+ target_link_libraries(${name} ${cct_DEPENDS})
+endfunction()
+
+# add_objc_flags(target sources...)
+#
+# Adds OBJC_FLAGS to the compile options of the given target if any of the
+# sources have filenames that indicate they are are Objective-C.
+function(add_objc_flags target)
+ set(_has_objc OFF)
+
+ foreach(source ${ARGN})
+ get_filename_component(ext ${source} EXT)
+ if((ext STREQUAL ".m") OR (ext STREQUAL ".mm"))
+ set(_has_objc ON)
+ endif()
+ endforeach()
+
+ if(_has_objc)
+ target_compile_options(
+ ${target}
+ PRIVATE
+ ${OBJC_FLAGS}
+ )
+ endif()
endfunction()