| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- # Copyright 2017 Google LLC
- #
- # 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.
- # Superbuild for Firebase
- cmake_minimum_required(VERSION 3.5.1)
- # Disallow mixing keyword and non-keyword forms of target_link_libraries
- if(POLICY CMP0023)
- cmake_policy(SET CMP0023 NEW)
- endif()
- # Report AppleClang separately from Clang. Their version numbers are different.
- # https://cmake.org/cmake/help/v3.0/policy/CMP0025.html
- if(POLICY CMP0025)
- cmake_policy(SET CMP0025 NEW)
- endif()
- # Enable rpath by default
- if(POLICY CMP0042)
- cmake_policy(SET CMP0042 NEW)
- endif()
- # Generate Ninja phony rules for unknown dependencies in the build tree and
- # don't complain about doing so. Our dependencies aren't good about declaring
- # BYPRODUCTS and we mix them all into a single superbuild so we can't enable
- # this policy until all dependencies are capable of doing so.
- if(POLICY CMP0058)
- cmake_policy(SET CMP0058 OLD)
- endif()
- # Enable the ccache compilation cache, if available.
- find_program(CCACHE_PROGRAM ccache)
- if(CCACHE_PROGRAM)
- message(STATUS "Found ccache: ${CCACHE_PROGRAM}")
- set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
- set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
- endif()
- # Defer enabling any languages.
- project(firebase NONE)
- if(WIN32)
- # On Windows, prefer cl over gcc if both are available. By default most of
- # the CMake generators prefer gcc, even on Windows.
- set(CMAKE_GENERATOR_CC cl)
- endif()
- enable_language(C)
- enable_language(CXX)
- set(
- FIREBASE_LD_EXECUTABLE
- ""
- CACHE
- STRING
- "The filename of the C/C++ linker to use. \
- For example, the default linker for clang and gcc is ld. \
- Using a fast linker, like mold (https://github.com/rui314/mold), \
- could be useful during development to reduce build/test cycle times."
- )
- if(NOT ("${FIREBASE_LD_EXECUTABLE}" STREQUAL ""))
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=${FIREBASE_LD_EXECUTABLE}")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=${FIREBASE_LD_EXECUTABLE}")
- endif()
- option(
- FIREBASE_IOS_BUILD_BENCHMARKS
- "Enable building of C++ and Objective-C benchmarks for this project"
- OFF
- )
- option(
- FIREBASE_IOS_BUILD_TESTS
- "Enable building of C++ and Objective-C tests for this project"
- ON
- )
- list(INSERT CMAKE_MODULE_PATH 0 ${PROJECT_SOURCE_DIR}/cmake)
- include(compiler_setup)
- include(sanitizer_options)
- include(fuzzing_options)
- # rules depend on properties and options set above
- include(external_rules)
- include(podspec_rules)
- include(cc_rules)
- set(FIREBASE_SOURCE_DIR ${PROJECT_SOURCE_DIR})
- set(FIREBASE_BINARY_DIR ${PROJECT_BINARY_DIR})
- set(FIREBASE_INSTALL_DIR ${PROJECT_BINARY_DIR}/opt)
- set(
- FIREBASE_DOWNLOAD_DIR
- ${PROJECT_BINARY_DIR}/downloads
- CACHE PATH "Where to store downloaded files"
- )
- set(
- FIREBASE_EXTERNAL_SOURCE_DIR
- ${FIREBASE_BINARY_DIR}/external/src
- CACHE PATH "Root directory of source code of the external dependencies"
- )
- download_external_sources()
- # Googletest
- if(FIREBASE_IOS_BUILD_TESTS)
- set(gtest_force_shared_crt ON CACHE BOOL "Use shared run-time")
- add_external_subdirectory(googletest)
- firebase_ios_add_alias(GTest::GTest gtest)
- firebase_ios_add_alias(GTest::Main gtest_main)
- firebase_ios_add_alias(GMock::GMock gmock)
- endif()
- # Benchmark
- if(FIREBASE_IOS_BUILD_BENCHMARKS)
- set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Firestore disabled")
- set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Firestore disabled")
- set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Firestore disabled")
- set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Firestore disabled")
- if(IOS)
- # benchmark uses CMake's try_run, which doesn't work out of the box when
- # compiling for iOS.
- set(HAVE_STD_REGEX ON CACHE BOOL "iOS has std::regex")
- set(HAVE_POSIX_REGEX ON CACHE BOOL "iOS has POSIX regex.h")
- set(HAVE_STEADY_CLOCK ON CACHE BOOL "iOS has std::chrono::steady_clock")
- endif()
- add_external_subdirectory(benchmark)
- endif()
- # gRPC
- # Force disable Abseil's tests, which don't compile under VS2017.
- set(ABSL_RUN_TESTS OFF CACHE BOOL "Disable Abseil tests" FORCE)
- # libcurl and c-ares conflict in their usage of this variable. Prevent
- # libcurl's setting of this variable from affecting the c-ares build that's
- # pulled in indirectly via gRPC.
- unset(RANDOM_FILE CACHE)
- set(CARES_INSTALL OFF CACHE BOOL "Disabled")
- set(protobuf_BUILD_TESTS OFF CACHE BOOL "Disabled")
- # See https://github.com/protocolbuffers/protobuf/issues/12185#issuecomment-1887892723
- set(protobuf_INSTALL OFF)
- set(utf8_range_ENABLE_INSTALL OFF)
- if(IOS OR ANDROID)
- # C-Ares includes a number of example binaries (e.g. `ahost`) that fail to
- # build when compiling for non-host targets.
- set(gRPC_CARES_PROVIDER none CACHE STRING "Don't use C-Ares")
- # protoc needs to be built for the host to be able to invoke it during the
- # build.
- set(protobuf_BUILD_PROTOC_BINARIES OFF CACHE BOOL "Disabled")
- endif()
- if(ANDROID OR IOS)
- set(OPENSSL_FOUND FALSE)
- else()
- find_package(OpenSSL QUIET)
- endif()
- if(OPENSSL_FOUND)
- set(gRPC_SSL_PROVIDER package CACHE STRING "Use external OpenSSL")
- else()
- set(BORINGSSL_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/boringssl/src)
- endif()
- find_package(ZLIB QUIET)
- if(ZLIB_FOUND)
- set(gRPC_ZLIB_PROVIDER package CACHE STRING "Use external ZLIB")
- else()
- set(ZLIB_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/zlib)
- endif()
- find_package(re2 QUIET)
- if(RE2_FOUND)
- set(gRPC_RE2_PROVIDER package CACHE STRING "Use external re2")
- else()
- set(RE2_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/re2)
- endif()
- set(gRPC_BUILD_TESTS OFF CACHE BOOL "Disable gRPC tests")
- set(gRPC_BUILD_CODEGEN OFF CACHE BOOL "Disable gRPC codegen")
- set(gRPC_BUILD_CSHARP_EXT OFF CACHE BOOL "Disable gRPC C# extensions")
- set(gRPC_INSTALL OFF CACHE BOOL "Disable gRPC installation")
- set(ABSL_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/abseil-cpp)
- set(CARES_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/cares)
- set(PROTOBUF_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/protobuf)
- add_external_subdirectory(grpc)
- # Fix up targets included by boringssl (ver: b9232f9e27e5668bc0414879dcdedb2a59ea75f2)
- # We might be able to remove this with newer versions.
- if(CXX_CLANG)
- if(TARGET crypto)
- target_compile_options(
- crypto PRIVATE
- -Wno-unused-but-set-variable
- )
- endif()
- endif()
- if(MSVC)
- # Disable warnings about unsafe use of std::copy
- target_compile_definitions(
- absl_strings PUBLIC
- _SCL_SECURE_NO_WARNINGS=1
- )
- endif()
- if(NOT OPENSSL_FOUND)
- # Not using outboard OpenSSL so set up BoringSSL to look like it.
- firebase_ios_add_alias(OpenSSL::Crypto crypto)
- target_include_directories(
- crypto INTERFACE
- $<BUILD_INTERFACE:${FIREBASE_EXTERNAL_SOURCE_DIR}/boringssl/src/include>
- )
- firebase_ios_add_alias(OpenSSL::SSL ssl)
- target_include_directories(
- ssl INTERFACE
- $<BUILD_INTERFACE:${FIREBASE_EXTERNAL_SOURCE_DIR}/boringssl/src/include>
- )
- endif()
- if(NOT ZLIB_FOUND)
- target_include_directories(
- zlibstatic INTERFACE
- $<BUILD_INTERFACE:${FIREBASE_EXTERNAL_SOURCE_DIR}/grpc/third_party/zlib>
- )
- endif()
- # Snappy
- set(SNAPPY_BUILD_TESTS OFF CACHE BOOL "Firestore disabled")
- set(SNAPPY_BUILD_BENCHMARKS OFF CACHE BOOL "Firestore disabled")
- add_external_subdirectory(snappy)
- firebase_ios_add_alias(Snappy::Snappy snappy)
- # LevelDB
- set(LEVELDB_BUILD_TESTS OFF CACHE BOOL "Firestore disabled")
- set(LEVELDB_BUILD_BENCHMARKS OFF CACHE BOOL "Firestore disabled")
- set(LEVELDB_INSTALL OFF CACHE BOOL "Firestore disabled")
- add_external_subdirectory(leveldb)
- firebase_ios_add_alias(LevelDB::LevelDB leveldb)
- # nanopb
- set(nanopb_BUILD_GENERATOR ON CACHE BOOL "Enable the nanopb generator")
- set(nanopb_MSVC_STATIC_RUNTIME OFF CACHE BOOL "Link static runtime libraries")
- add_external_subdirectory(nanopb)
- target_compile_definitions(
- protobuf-nanopb-static PUBLIC
- -DPB_FIELD_32BIT -DPB_ENABLE_MALLOC -DPB_NO_PACKED_STRUCTS=1
- )
- # Enable #include <nanopb/pb.h>
- target_include_directories(
- protobuf-nanopb-static INTERFACE
- $<BUILD_INTERFACE:${FIREBASE_EXTERNAL_SOURCE_DIR}/nanopb>
- )
- # XCTest
- if(APPLE)
- find_package(XCTest)
- endif()
- if(FIREBASE_IOS_BUILD_TESTS)
- enable_testing()
- endif()
- add_subdirectory(FirebaseAppCheck/Interop)
- add_subdirectory(FirebaseCore)
- add_subdirectory(Firestore)
- add_subdirectory(FirebaseAuth/Interop)
|