diff options
-rw-r--r-- | CMakeLists.txt | 15 | ||||
-rw-r--r-- | Firestore/CMakeLists.txt | 4 | ||||
-rw-r--r-- | Firestore/core/src/firebase/firestore/base/port.h | 2 | ||||
-rw-r--r-- | cmake/FindFirebaseCore.cmake | 57 | ||||
-rw-r--r-- | cmake/external/FirebaseCore.cmake | 23 | ||||
-rw-r--r-- | cmake/external/firestore.cmake | 2 | ||||
-rw-r--r-- | cmake/external/googletest.cmake | 5 | ||||
-rw-r--r-- | cmake/xcodebuild.cmake | 90 |
8 files changed, 189 insertions, 9 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 63e1a39..52a4376 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,15 +22,22 @@ if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif() +if(APPLE) + # When building on the apple platform certain Objective-C++ classes bridge + # back into other Firebase Cocoapods. This requires shelling out to xcodebuild + # to verify the built frameworks are up-to-date. You can disable this to speed + # up the build. + option(BUILD_PODS, "Always build dependent cocoapods." ON) +endif(APPLE) + list(INSERT CMAKE_MODULE_PATH 0 ${PROJECT_SOURCE_DIR}/cmake) -# External Projects install into this prefix and download into the source tree -# to avoid re-downloading repeatedly during development. -set(FIREBASE_INSTALL_DIR "${PROJECT_BINARY_DIR}/usr") -set(FIREBASE_DOWNLOAD_DIR "${PROJECT_SOURCE_DIR}/.downloads") +set(FIREBASE_INSTALL_DIR ${PROJECT_BINARY_DIR}) enable_testing() +include(external/FirebaseCore) + include(external/googletest) include(external/leveldb) include(external/abseil-cpp) diff --git a/Firestore/CMakeLists.txt b/Firestore/CMakeLists.txt index 906b6e4..ba9998d 100644 --- a/Firestore/CMakeLists.txt +++ b/Firestore/CMakeLists.txt @@ -24,6 +24,10 @@ include(utils) find_package(GTest REQUIRED) find_package(LevelDB REQUIRED) +if(APPLE) + find_package(FirebaseCore REQUIRED) +endif() + # We use C++11 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/Firestore/core/src/firebase/firestore/base/port.h b/Firestore/core/src/firebase/firestore/base/port.h index 37d1041..5e3959d 100644 --- a/Firestore/core/src/firebase/firestore/base/port.h +++ b/Firestore/core/src/firebase/firestore/base/port.h @@ -18,7 +18,7 @@ #define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_BASE_PORT_H_ #if defined(__APPLE__) -// On Apple platforms we support building via Cocoapods without CMake. When +// On Apple platforms we support building via CocoaPods without CMake. When // building this way we can't test the presence of features so predefine all // the platform-support feature macros to their expected values. diff --git a/cmake/FindFirebaseCore.cmake b/cmake/FindFirebaseCore.cmake new file mode 100644 index 0000000..e23d6db --- /dev/null +++ b/cmake/FindFirebaseCore.cmake @@ -0,0 +1,57 @@ +# 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_BINARY_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 + ) + + # TODO(mcg): on iOS this should depend on UIKit. + set( + FIREBASECORE_LIBRARIES + ${FIREBASECORE_LIBRARY} + "-framework AppKit" + ) + + 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/external/FirebaseCore.cmake b/cmake/external/FirebaseCore.cmake new file mode 100644 index 0000000..8be6969 --- /dev/null +++ b/cmake/external/FirebaseCore.cmake @@ -0,0 +1,23 @@ +# 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(xcodebuild) + +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 9fb673e..61f79f3 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 abseil-cpp googletest leveldb + DEPENDS abseil-cpp 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/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() |