aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmake
diff options
context:
space:
mode:
authorGravatar Michael Lehenbauer <mikelehen@google.com>2018-01-09 12:57:21 -0800
committerGravatar Michael Lehenbauer <mikelehen@google.com>2018-01-09 12:57:21 -0800
commitaa00c7444982de08b21604965a708d1cad5188f7 (patch)
tree166325a14805321cbf5045fdd4a52dd634747218 /cmake
parent2c6682c66ea7b86b3b7cb52e623086b4184d500a (diff)
parentc18af34fca72b5721cab4e3b26da7469df8fcc6b (diff)
Merge branch 'master' into mikelehen/merge-master-to-firestore-api-changes
Diffstat (limited to 'cmake')
-rw-r--r--cmake/FindFirebaseCore.cmake56
-rw-r--r--cmake/FindLevelDB.cmake55
-rw-r--r--cmake/external/FirebaseCore.cmake (renamed from cmake/external/abseil-cpp.cmake)28
-rw-r--r--cmake/external/firestore.cmake2
-rw-r--r--cmake/external/googletest.cmake5
-rw-r--r--cmake/external/leveldb.cmake63
-rw-r--r--cmake/xcodebuild.cmake90
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()