Skip to content

Commit

Permalink
Add a cc_library to the CMake build (#670)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
wilhuff committed Jan 17, 2018
1 parent c366497 commit 6a3379d
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 89 deletions.
13 changes: 6 additions & 7 deletions Firestore/core/src/firebase/firestore/remote/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
92 changes: 42 additions & 50 deletions Firestore/core/src/firebase/firestore/util/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
9 changes: 4 additions & 5 deletions Firestore/core/test/firebase/firestore/remote/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
35 changes: 16 additions & 19 deletions Firestore/core/test/firebase/firestore/util/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
80 changes: 72 additions & 8 deletions cmake/utils.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit 6a3379d

Please sign in to comment.