diff options
author | Michael Lehenbauer <mikelehen@google.com> | 2018-01-09 12:57:21 -0800 |
---|---|---|
committer | Michael Lehenbauer <mikelehen@google.com> | 2018-01-09 12:57:21 -0800 |
commit | aa00c7444982de08b21604965a708d1cad5188f7 (patch) | |
tree | 166325a14805321cbf5045fdd4a52dd634747218 /cmake | |
parent | 2c6682c66ea7b86b3b7cb52e623086b4184d500a (diff) | |
parent | c18af34fca72b5721cab4e3b26da7469df8fcc6b (diff) |
Merge branch 'master' into mikelehen/merge-master-to-firestore-api-changes
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/FindFirebaseCore.cmake | 56 | ||||
-rw-r--r-- | cmake/FindLevelDB.cmake | 55 | ||||
-rw-r--r-- | cmake/external/FirebaseCore.cmake (renamed from cmake/external/abseil-cpp.cmake) | 28 | ||||
-rw-r--r-- | cmake/external/firestore.cmake | 2 | ||||
-rw-r--r-- | cmake/external/googletest.cmake | 5 | ||||
-rw-r--r-- | cmake/external/leveldb.cmake | 63 | ||||
-rw-r--r-- | cmake/xcodebuild.cmake | 90 |
7 files changed, 275 insertions, 24 deletions
diff --git a/cmake/FindFirebaseCore.cmake b/cmake/FindFirebaseCore.cmake new file mode 100644 index 0000000..eec29dd --- /dev/null +++ b/cmake/FindFirebaseCore.cmake @@ -0,0 +1,56 @@ +# Copyright 2017 Google +# +# 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 +# +# http://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. + +find_library( + FIREBASECORE_LIBRARY + FirebaseCore + PATHS ${FIREBASE_INSTALL_DIR}/Frameworks +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + FirebaseCore + DEFAULT_MSG + FIREBASECORE_LIBRARY +) + +if(FIREBASECORE_FOUND) + # Emulate CocoaPods behavior which makes all headers available unqualified. + set( + FIREBASECORE_INCLUDE_DIRS + ${FIREBASECORE_LIBRARY}/Headers + ${FIREBASECORE_LIBRARY}/PrivateHeaders + ) + + set( + FIREBASECORE_LIBRARIES + ${FIREBASECORE_LIBRARY} + "-framework Foundation" + ) + + if(NOT TARGET FirebaseCore) + # Add frameworks as INTERFACE libraries rather than IMPORTED so that + # framework behavior is preserved. + add_library(FirebaseCore INTERFACE) + + set_property( + TARGET FirebaseCore APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${FIREBASECORE_INCLUDE_DIRS} + ) + set_property( + TARGET FirebaseCore APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${FIREBASECORE_LIBRARIES} + ) + endif() +endif(FIREBASECORE_FOUND) diff --git a/cmake/FindLevelDB.cmake b/cmake/FindLevelDB.cmake new file mode 100644 index 0000000..386a298 --- /dev/null +++ b/cmake/FindLevelDB.cmake @@ -0,0 +1,55 @@ +# Copyright 2017 Google +# +# 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 +# +# http://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. + +set(binary_dir ${FIREBASE_INSTALL_DIR}/third_party/leveldb/src/leveldb) + +find_path( + LEVELDB_INCLUDE_DIR leveldb/db.h + HINTS + $ENV{LEVELDB_ROOT}/include + ${LEVELDB_ROOT}/include + ${binary_dir}/include + PATH_SUFFIXES leveldb +) + +find_library( + LEVELDB_LIBRARY + NAMES leveldb + HINTS + $ENV{LEVELDB_ROOT}/lib + ${LEVELDB_ROOT}/lib + ${binary_dir}/out-static +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + LevelDB + DEFAULT_MSG + LEVELDB_INCLUDE_DIR + LEVELDB_LIBRARY +) + +if(LEVELDB_FOUND) + set(LEVELDB_INCLUDE_DIRS ${LEVELDB_INCLUDE_DIR}) + set(LEVELDB_LIBRARIES ${LEVELDB_LIBRARY}) + + if (NOT TARGET LevelDB::LevelDB) + add_library(LevelDB::LevelDB UNKNOWN IMPORTED) + set_target_properties( + LevelDB::LevelDB PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${LEVELDB_INCLUDE_DIR} + IMPORTED_LOCATION ${LEVELDB_LIBRARY} + ) + endif() +endif(LEVELDB_FOUND) diff --git a/cmake/external/abseil-cpp.cmake b/cmake/external/FirebaseCore.cmake index d29b7d5..8be6969 100644 --- a/cmake/external/abseil-cpp.cmake +++ b/cmake/external/FirebaseCore.cmake @@ -12,24 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -include(ExternalProject) +include(xcodebuild) -set(source_dir ${PROJECT_SOURCE_DIR}/Firestore/third_party/abseil-cpp) -set(binary_dir ${PROJECT_BINARY_DIR}/Firestore/third_party/abseil-cpp) - -ExternalProject_Add( - abseil-cpp - DEPENDS googletest - - PREFIX "${binary_dir}" - SOURCE_DIR "${source_dir}" - BINARY_DIR "${binary_dir}" - - INSTALL_DIR "${FIREBASE_INSTALL_DIR}" - INSTALL_COMMAND "" - TEST_BEFORE_INSTALL ON - - CMAKE_ARGS - -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -) +if(APPLE) + # FirebaseCore is only available as a CocoaPod build. + xcodebuild(FirebaseCore) +else() + # On non-Apple platforms, there's no way to build FirebaseCore. + add_custom_target(FirebaseCore) +endif() diff --git a/cmake/external/firestore.cmake b/cmake/external/firestore.cmake index dd37b51..1abb629 100644 --- a/cmake/external/firestore.cmake +++ b/cmake/external/firestore.cmake @@ -19,7 +19,7 @@ set(binary_dir ${PROJECT_BINARY_DIR}/Firestore) ExternalProject_Add( Firestore - DEPENDS googletest abseil-cpp + DEPENDS FirebaseCore googletest leveldb # Lay the binary directory out as if this were a subproject. This makes it # possible to build and test in it directly. diff --git a/cmake/external/googletest.cmake b/cmake/external/googletest.cmake index a956e9f..128f849 100644 --- a/cmake/external/googletest.cmake +++ b/cmake/external/googletest.cmake @@ -17,12 +17,11 @@ include(ExternalProject) ExternalProject_Add( googletest - URL "https://github.com/google/googletest/archive/release-1.8.0.tar.gz" - URL_HASH "SHA256=58a6f4277ca2bc8565222b3bbd58a177609e9c488e8a72649359ba51450db7d8" + GIT_REPOSITORY "https://github.com/google/googletest.git" + GIT_TAG "release-1.8.0" PREFIX ${PROJECT_BINARY_DIR}/third_party/googletest - DOWNLOAD_DIR ${FIREBASE_DOWNLOAD_DIR} INSTALL_DIR ${FIREBASE_INSTALL_DIR} TEST_COMMAND "" diff --git a/cmake/external/leveldb.cmake b/cmake/external/leveldb.cmake new file mode 100644 index 0000000..b3b3fe1 --- /dev/null +++ b/cmake/external/leveldb.cmake @@ -0,0 +1,63 @@ +# Copyright 2017 Google +# +# 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 +# +# http://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(ExternalProject) + +if(WIN32 OR LEVELDB_ROOT) + # If the user has supplied a LEVELDB_ROOT then just use it. Add an empty + # custom target so that the superbuild depdendencies don't all have to be + # conditional. + # + # Also, unfortunately, LevelDB does not build on Windows (yet) + # See: + # https://github.com/google/leveldb/issues/363 + # https://github.com/google/leveldb/issues/466 + add_custom_target(leveldb) + +else() + # Clean up warning output to reduce noise in the build + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") + set( + LEVELDB_CXX_FLAGS "\ + -Wno-deprecated-declarations" + ) + endif() + + # Map CMake compiler configuration down onto the leveldb Makefile + set( + LEVELDB_OPT "\ + $<$<CONFIG:Debug>:${CMAKE_CXX_FLAGS_DEBUG}> \ + $<$<CONFIG:Release>:${CMAKE_CXX_FLAGS_RELEASE}>" + ) + + ExternalProject_Add( + leveldb + + GIT_REPOSITORY "https://github.com/google/leveldb.git" + GIT_TAG "v1.20" + + PREFIX ${PROJECT_BINARY_DIR}/third_party/leveldb + + CONFIGURE_COMMAND "" + BUILD_ALWAYS ON + BUILD_IN_SOURCE ON + BUILD_COMMAND + env CXXFLAGS=${LEVELDB_CXX_FLAGS} OPT=${LEVELDB_OPT} make -j all + + INSTALL_DIR ${FIREBASE_INSTALL_DIR} + + INSTALL_COMMAND "" + TEST_COMMAND "" + ) +endif(WIN32 OR LEVELDB_ROOT) diff --git a/cmake/xcodebuild.cmake b/cmake/xcodebuild.cmake new file mode 100644 index 0000000..8312f6d --- /dev/null +++ b/cmake/xcodebuild.cmake @@ -0,0 +1,90 @@ +# Copyright 2017 Google +# +# 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 +# +# http://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(ExternalProject) + +# Builds an existing Xcode project or workspace as an external project in CMake. +# +# xcodebuild(<framework> [<option>...]) +# +# Options: +# ``DEPENDS <projects>...`` +# Targets on which the project depends +# ``SCHEME <scheme>`` +# The scheme to build in the workspace, defaults to <framework>-<platform>, +# where <platform> is always "macOS". +# ``WORKSPACE <workspace>`` +# Location of the xcworkspace file containing the target to build. Defaults to +# Example/Firebase.xcworkspace. +function(xcodebuild framework) + # Parse arguments + set(options "") + set(single_value SCHEME WORKSPACE) + set(multi_value DEPENDS) + cmake_parse_arguments(xcb "${options}" "${single_value}" "${multi_value}") + + if(NOT xcb_WORKSPACE) + set(xcb_WORKSPACE ${PROJECT_SOURCE_DIR}/Example/Firebase.xcworkspace) + endif() + + # TODO(mcg): Investigate supporting non-macOS platforms + # The canonical way to build and test for iOS is via Xcode and CocoaPods so + # it's not super important to make this work here + set(platform macOS) + set(destination "platform=macOS,arch=x86_64") + set(scheme "${framework}-${platform}") + + set(binary_dir ${PROJECT_BINARY_DIR}/${scheme}) + + # CMake has a variety of release types, but Xcode has just one by default. + if(CMAKE_BUILD_TYPE STREQUAL Debug) + set(configuration Debug) + else() + set(configuration Release) + endif() + + # Pipe build output through xcpretty if it's available + find_program(xcpretty_cmd xcpretty) + if(xcpretty_cmd) + set(pipe_xcpretty "|" ${xcpretty_cmd}) + endif() + + ExternalProject_Add( + ${framework} + DEPENDS ${xcb_DEPENDS} + + PREFIX ${binary_dir} + + # The source directory doesn't actually matter + SOURCE_DIR ${PROJECT_SOURCE_DIR} + BINARY_DIR ${binary_dir} + + CONFIGURE_COMMAND "" + + BUILD_COMMAND + xcodebuild + -workspace ${xcb_WORKSPACE} + -scheme ${scheme} + -configuration ${configuration} + -destination ${destination} + CONFIGURATION_BUILD_DIR=${FIREBASE_INSTALL_DIR}/Frameworks + build + ${pipe_xcpretty} + BUILD_ALWAYS ${BUILD_PODS} + + INSTALL_COMMAND "" + TEST_COMMAND "" + ) +endfunction() |