CMakeLists.txt 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. # Copyright 2017 Google LLC
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. # Superbuild for Firebase
  15. cmake_minimum_required(VERSION 3.5.1)
  16. # Disallow mixing keyword and non-keyword forms of target_link_libraries
  17. if(POLICY CMP0023)
  18. cmake_policy(SET CMP0023 NEW)
  19. endif()
  20. # Report AppleClang separately from Clang. Their version numbers are different.
  21. # https://cmake.org/cmake/help/v3.0/policy/CMP0025.html
  22. if(POLICY CMP0025)
  23. cmake_policy(SET CMP0025 NEW)
  24. endif()
  25. # Enable rpath by default
  26. if(POLICY CMP0042)
  27. cmake_policy(SET CMP0042 NEW)
  28. endif()
  29. # Generate Ninja phony rules for unknown dependencies in the build tree and
  30. # don't complain about doing so. Our dependencies aren't good about declaring
  31. # BYPRODUCTS and we mix them all into a single superbuild so we can't enable
  32. # this policy until all dependencies are capable of doing so.
  33. if(POLICY CMP0058)
  34. cmake_policy(SET CMP0058 OLD)
  35. endif()
  36. # Enable the ccache compilation cache, if available.
  37. find_program(CCACHE_PROGRAM ccache)
  38. if(CCACHE_PROGRAM)
  39. message(STATUS "Found ccache: ${CCACHE_PROGRAM}")
  40. set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  41. set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  42. endif()
  43. # Defer enabling any languages.
  44. project(firebase NONE)
  45. if(WIN32)
  46. # On Windows, prefer cl over gcc if both are available. By default most of
  47. # the CMake generators prefer gcc, even on Windows.
  48. set(CMAKE_GENERATOR_CC cl)
  49. endif()
  50. enable_language(C)
  51. enable_language(CXX)
  52. set(
  53. FIREBASE_LD_EXECUTABLE
  54. ""
  55. CACHE
  56. STRING
  57. "The filename of the C/C++ linker to use. \
  58. For example, the default linker for clang and gcc is ld. \
  59. Using a fast linker, like mold (https://github.com/rui314/mold), \
  60. could be useful during development to reduce build/test cycle times."
  61. )
  62. if(NOT ("${FIREBASE_LD_EXECUTABLE}" STREQUAL ""))
  63. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=${FIREBASE_LD_EXECUTABLE}")
  64. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=${FIREBASE_LD_EXECUTABLE}")
  65. endif()
  66. option(
  67. FIREBASE_IOS_BUILD_BENCHMARKS
  68. "Enable building of C++ and Objective-C benchmarks for this project"
  69. OFF
  70. )
  71. option(
  72. FIREBASE_IOS_BUILD_TESTS
  73. "Enable building of C++ and Objective-C tests for this project"
  74. ON
  75. )
  76. list(INSERT CMAKE_MODULE_PATH 0 ${PROJECT_SOURCE_DIR}/cmake)
  77. include(compiler_setup)
  78. include(sanitizer_options)
  79. include(fuzzing_options)
  80. # rules depend on properties and options set above
  81. include(external_rules)
  82. include(podspec_rules)
  83. include(cc_rules)
  84. set(FIREBASE_SOURCE_DIR ${PROJECT_SOURCE_DIR})
  85. set(FIREBASE_BINARY_DIR ${PROJECT_BINARY_DIR})
  86. set(FIREBASE_INSTALL_DIR ${PROJECT_BINARY_DIR}/opt)
  87. set(
  88. FIREBASE_DOWNLOAD_DIR
  89. ${PROJECT_BINARY_DIR}/downloads
  90. CACHE PATH "Where to store downloaded files"
  91. )
  92. set(
  93. FIREBASE_EXTERNAL_SOURCE_DIR
  94. ${FIREBASE_BINARY_DIR}/external/src
  95. CACHE PATH "Root directory of source code of the external dependencies"
  96. )
  97. download_external_sources()
  98. # Googletest
  99. if(FIREBASE_IOS_BUILD_TESTS)
  100. set(gtest_force_shared_crt ON CACHE BOOL "Use shared run-time")
  101. add_external_subdirectory(googletest)
  102. firebase_ios_add_alias(GTest::GTest gtest)
  103. firebase_ios_add_alias(GTest::Main gtest_main)
  104. firebase_ios_add_alias(GMock::GMock gmock)
  105. endif()
  106. # Benchmark
  107. if(FIREBASE_IOS_BUILD_BENCHMARKS)
  108. set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Firestore disabled")
  109. set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Firestore disabled")
  110. set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Firestore disabled")
  111. set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Firestore disabled")
  112. if(IOS)
  113. # benchmark uses CMake's try_run, which doesn't work out of the box when
  114. # compiling for iOS.
  115. set(HAVE_STD_REGEX ON CACHE BOOL "iOS has std::regex")
  116. set(HAVE_POSIX_REGEX ON CACHE BOOL "iOS has POSIX regex.h")
  117. set(HAVE_STEADY_CLOCK ON CACHE BOOL "iOS has std::chrono::steady_clock")
  118. endif()
  119. add_external_subdirectory(benchmark)
  120. endif()
  121. # gRPC
  122. # Force disable Abseil's tests, which don't compile under VS2017.
  123. set(ABSL_RUN_TESTS OFF CACHE BOOL "Disable Abseil tests" FORCE)
  124. # libcurl and c-ares conflict in their usage of this variable. Prevent
  125. # libcurl's setting of this variable from affecting the c-ares build that's
  126. # pulled in indirectly via gRPC.
  127. unset(RANDOM_FILE CACHE)
  128. set(CARES_INSTALL OFF CACHE BOOL "Disabled")
  129. set(protobuf_BUILD_TESTS OFF CACHE BOOL "Disabled")
  130. # See https://github.com/protocolbuffers/protobuf/issues/12185#issuecomment-1887892723
  131. set(protobuf_INSTALL OFF)
  132. set(utf8_range_ENABLE_INSTALL OFF)
  133. if(IOS OR ANDROID)
  134. # C-Ares includes a number of example binaries (e.g. `ahost`) that fail to
  135. # build when compiling for non-host targets.
  136. set(gRPC_CARES_PROVIDER none CACHE STRING "Don't use C-Ares")
  137. # protoc needs to be built for the host to be able to invoke it during the
  138. # build.
  139. set(protobuf_BUILD_PROTOC_BINARIES OFF CACHE BOOL "Disabled")
  140. endif()
  141. if(ANDROID OR IOS)
  142. set(OPENSSL_FOUND FALSE)
  143. else()
  144. find_package(OpenSSL QUIET)
  145. endif()
  146. if(OPENSSL_FOUND)
  147. set(gRPC_SSL_PROVIDER package CACHE STRING "Use external OpenSSL")
  148. else()
  149. set(BORINGSSL_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/boringssl/src)
  150. endif()
  151. find_package(ZLIB QUIET)
  152. if(ZLIB_FOUND)
  153. set(gRPC_ZLIB_PROVIDER package CACHE STRING "Use external ZLIB")
  154. else()
  155. set(ZLIB_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/zlib)
  156. endif()
  157. find_package(re2 QUIET)
  158. if(RE2_FOUND)
  159. set(gRPC_RE2_PROVIDER package CACHE STRING "Use external re2")
  160. else()
  161. set(RE2_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/re2)
  162. endif()
  163. set(gRPC_BUILD_TESTS OFF CACHE BOOL "Disable gRPC tests")
  164. set(gRPC_BUILD_CODEGEN OFF CACHE BOOL "Disable gRPC codegen")
  165. set(gRPC_BUILD_CSHARP_EXT OFF CACHE BOOL "Disable gRPC C# extensions")
  166. set(gRPC_INSTALL OFF CACHE BOOL "Disable gRPC installation")
  167. set(ABSL_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/abseil-cpp)
  168. set(CARES_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/cares)
  169. set(PROTOBUF_ROOT_DIR ${FIREBASE_EXTERNAL_SOURCE_DIR}/protobuf)
  170. add_external_subdirectory(grpc)
  171. # Fix up targets included by boringssl (ver: b9232f9e27e5668bc0414879dcdedb2a59ea75f2)
  172. # We might be able to remove this with newer versions.
  173. if(CXX_CLANG)
  174. if(TARGET crypto)
  175. target_compile_options(
  176. crypto PRIVATE
  177. -Wno-unused-but-set-variable
  178. )
  179. endif()
  180. endif()
  181. if(MSVC)
  182. # Disable warnings about unsafe use of std::copy
  183. target_compile_definitions(
  184. absl_strings PUBLIC
  185. _SCL_SECURE_NO_WARNINGS=1
  186. )
  187. endif()
  188. if(NOT OPENSSL_FOUND)
  189. # Not using outboard OpenSSL so set up BoringSSL to look like it.
  190. firebase_ios_add_alias(OpenSSL::Crypto crypto)
  191. target_include_directories(
  192. crypto INTERFACE
  193. $<BUILD_INTERFACE:${FIREBASE_EXTERNAL_SOURCE_DIR}/boringssl/src/include>
  194. )
  195. firebase_ios_add_alias(OpenSSL::SSL ssl)
  196. target_include_directories(
  197. ssl INTERFACE
  198. $<BUILD_INTERFACE:${FIREBASE_EXTERNAL_SOURCE_DIR}/boringssl/src/include>
  199. )
  200. endif()
  201. if(NOT ZLIB_FOUND)
  202. target_include_directories(
  203. zlibstatic INTERFACE
  204. $<BUILD_INTERFACE:${FIREBASE_EXTERNAL_SOURCE_DIR}/grpc/third_party/zlib>
  205. )
  206. endif()
  207. # Snappy
  208. set(SNAPPY_BUILD_TESTS OFF CACHE BOOL "Firestore disabled")
  209. set(SNAPPY_BUILD_BENCHMARKS OFF CACHE BOOL "Firestore disabled")
  210. add_external_subdirectory(snappy)
  211. firebase_ios_add_alias(Snappy::Snappy snappy)
  212. # LevelDB
  213. set(LEVELDB_BUILD_TESTS OFF CACHE BOOL "Firestore disabled")
  214. set(LEVELDB_BUILD_BENCHMARKS OFF CACHE BOOL "Firestore disabled")
  215. set(LEVELDB_INSTALL OFF CACHE BOOL "Firestore disabled")
  216. add_external_subdirectory(leveldb)
  217. firebase_ios_add_alias(LevelDB::LevelDB leveldb)
  218. # nanopb
  219. set(nanopb_BUILD_GENERATOR ON CACHE BOOL "Enable the nanopb generator")
  220. set(nanopb_MSVC_STATIC_RUNTIME OFF CACHE BOOL "Link static runtime libraries")
  221. add_external_subdirectory(nanopb)
  222. target_compile_definitions(
  223. protobuf-nanopb-static PUBLIC
  224. -DPB_FIELD_32BIT -DPB_ENABLE_MALLOC -DPB_NO_PACKED_STRUCTS=1
  225. )
  226. # Enable #include <nanopb/pb.h>
  227. target_include_directories(
  228. protobuf-nanopb-static INTERFACE
  229. $<BUILD_INTERFACE:${FIREBASE_EXTERNAL_SOURCE_DIR}/nanopb>
  230. )
  231. # XCTest
  232. if(APPLE)
  233. find_package(XCTest)
  234. endif()
  235. if(FIREBASE_IOS_BUILD_TESTS)
  236. enable_testing()
  237. endif()
  238. add_subdirectory(FirebaseAppCheck/Interop)
  239. add_subdirectory(FirebaseCore)
  240. add_subdirectory(Firestore)
  241. add_subdirectory(FirebaseAuth/Interop)