Skip to content

Commit 1f8dfd3

Browse files
committed
Add FIREBASE_USE_BORINGSSL option, off by default but on for standalone desktop builds via build_desktop.py.
1 parent 8803578 commit 1f8dfd3

File tree

3 files changed

+101
-82
lines changed

3 files changed

+101
-82
lines changed

CMakeLists.txt

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ option(FIREBASE_CPP_BUILD_PACKAGE
6666
"Bundle the Firebase C++ libraries into a zip file." OFF)
6767
option(FIREBASE_CPP_USE_PRIOR_GRADLE_BUILD
6868
"When building with Gradle, use the previously built libraries." OFF)
69+
option(FIREBASE_USE_BORINGSSL
70+
"Build against BoringSSL instead of using your system's OpenSSL." OFF)
6971

7072
set(FIREBASE_ANDROID_STL "" CACHE STRING "STL implementation to use.")
7173
if (NOT FIREBASE_ANDROID_STL STREQUAL "")
@@ -194,24 +196,26 @@ if(DESKTOP)
194196
endif()
195197
endif()
196198

197-
# Use BoringSSL instead of OpenSSL.
198-
set(BORINGSSL_ROOT_DIR ${CMAKE_BINARY_DIR}/external/src/boringssl/src CACHE STRING "" FORCE)
199-
set(BORINGSSL_BINARY_DIR ${CMAKE_BINARY_DIR}/external/src/boringssl-build CACHE STRING "" FORCE)
200-
set(OPENSSL_ROOT_DIR ${BORINGSSL_ROOT_DIR} CACHE STRING "" FORCE)
201-
202-
# The call below to build_external_dependencies will make sure that these
203-
# libraries exist before the libraries are imported via add_library.
204-
if (MSVC)
205-
if (CMAKE_BUILD_TYPE)
206-
set(BORINGSSL_LIB_SUBDIR "${CMAKE_BUILD_TYPE}")
199+
if(FIREBASE_USE_BORINGSSL)
200+
# Use BoringSSL instead of OpenSSL.
201+
set(BORINGSSL_ROOT_DIR ${CMAKE_BINARY_DIR}/external/src/boringssl/src CACHE STRING "" FORCE)
202+
set(BORINGSSL_BINARY_DIR ${CMAKE_BINARY_DIR}/external/src/boringssl-build CACHE STRING "" FORCE)
203+
set(OPENSSL_ROOT_DIR ${BORINGSSL_ROOT_DIR} CACHE STRING "" FORCE)
204+
205+
# The call below to build_external_dependencies will make sure that these
206+
# libraries exist before the libraries are imported via add_library.
207+
if (MSVC)
208+
if (CMAKE_BUILD_TYPE)
209+
set(BORINGSSL_LIB_SUBDIR "${CMAKE_BUILD_TYPE}")
210+
else()
211+
set(BORINGSSL_LIB_SUBDIR "Debug")
212+
endif()
213+
set(OPENSSL_SSL_LIBRARY ${BORINGSSL_BINARY_DIR}/ssl/${BORINGSSL_LIB_SUBDIR}/ssl.lib CACHE FILEPATH "" FORCE)
214+
set(OPENSSL_CRYPTO_LIBRARY ${BORINGSSL_BINARY_DIR}/crypto/${BORINGSSL_LIB_SUBDIR}/crypto.lib CACHE FILEPATH "" FORCE)
207215
else()
208-
set(BORINGSSL_LIB_SUBDIR "Debug")
216+
set(OPENSSL_SSL_LIBRARY ${BORINGSSL_BINARY_DIR}/ssl/libssl.a CACHE FILEPATH "" FORCE)
217+
set(OPENSSL_CRYPTO_LIBRARY ${BORINGSSL_BINARY_DIR}/crypto/libcrypto.a CACHE FILEPATH "" FORCE)
209218
endif()
210-
set(OPENSSL_SSL_LIBRARY ${BORINGSSL_BINARY_DIR}/ssl/${BORINGSSL_LIB_SUBDIR}/ssl.lib CACHE FILEPATH "" FORCE)
211-
set(OPENSSL_CRYPTO_LIBRARY ${BORINGSSL_BINARY_DIR}/crypto/${BORINGSSL_LIB_SUBDIR}/crypto.lib CACHE FILEPATH "" FORCE)
212-
else()
213-
set(OPENSSL_SSL_LIBRARY ${BORINGSSL_BINARY_DIR}/ssl/libssl.a CACHE FILEPATH "" FORCE)
214-
set(OPENSSL_CRYPTO_LIBRARY ${BORINGSSL_BINARY_DIR}/crypto/libcrypto.a CACHE FILEPATH "" FORCE)
215219
endif()
216220
endif()
217221

@@ -221,33 +225,42 @@ if(DESKTOP)
221225
build_external_dependencies()
222226
message(STATUS "Build of external project dependencies complete.")
223227

224-
set(OPENSSL_FOUND TRUE CACHE BOOL "" FORCE)
225-
set(OPENSSL_NO_ASM TRUE) # Force cross-platform BoringSSL, no ASM.
226-
set(OPENSSL_INCLUDE_DIR ${BORINGSSL_ROOT_DIR}/include CACHE PATH "" FORCE)
227-
set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
228-
set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
229-
set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARIES} ${OPENSSL_CRYPTO_LIBRARIES})
230-
set(OPENSSL_VERSION '1.1.0' CACHE STRING "" FORCE)
231-
232-
add_library(OpenSSL::SSL STATIC IMPORTED)
233-
add_library(OpenSSL::Crypto STATIC IMPORTED)
234-
set_target_properties(OpenSSL::SSL PROPERTIES
235-
IMPORTED_LOCATION "${OPENSSL_SSL_LIBRARY}"
236-
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}"
237-
INTERFACE_LINK_LIBRARIES OpenSSL::Crypto
238-
)
239-
240-
set_target_properties(OpenSSL::Crypto PROPERTIES
241-
IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}"
242-
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}"
243-
)
244-
# Now if we do find_package(OpenSSL) it should give us BoringSSL.
245-
find_package(OpenSSL)
246-
247-
if(NOT "${OPENSSL_INCLUDE_DIR}" MATCHES boringssl OR
248-
NOT "${OPENSSL_SSL_LIBRARY}" MATCHES boringssl OR
249-
NOT "${OPENSSL_CRYPTO_LIBRARY}" MATCHES boringssl)
250-
message(FATAL_ERROR "BoringSSL was not configured correctly.\nINCLUDE_DIR=${OPENSSL_INCLUDE_DIR}\nSSL_LIBRARY=${OPENSSL_SSL_LIBRARY}\nCRYPTO_LIBRARY=${OPENSSL_CRYPTO_LIBRARY}")
228+
if(FIREBASE_USE_BORINGSSL)
229+
set(OPENSSL_FOUND TRUE CACHE BOOL "" FORCE)
230+
set(OPENSSL_NO_ASM TRUE) # Force cross-platform BoringSSL, no ASM.
231+
set(OPENSSL_INCLUDE_DIR ${BORINGSSL_ROOT_DIR}/include CACHE PATH "" FORCE)
232+
set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
233+
set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
234+
set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARIES} ${OPENSSL_CRYPTO_LIBRARIES})
235+
set(OPENSSL_VERSION '1.1.0' CACHE STRING "" FORCE)
236+
237+
add_library(OpenSSL::SSL STATIC IMPORTED)
238+
add_library(OpenSSL::Crypto STATIC IMPORTED)
239+
set_target_properties(OpenSSL::SSL PROPERTIES
240+
IMPORTED_LOCATION "${OPENSSL_SSL_LIBRARY}"
241+
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}"
242+
INTERFACE_LINK_LIBRARIES OpenSSL::Crypto
243+
)
244+
245+
set_target_properties(OpenSSL::Crypto PROPERTIES
246+
IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}"
247+
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}"
248+
)
249+
# Now if we do find_package(OpenSSL) it should give us BoringSSL.
250+
find_package(OpenSSL)
251+
252+
if(NOT "${OPENSSL_INCLUDE_DIR}" MATCHES boringssl OR
253+
NOT "${OPENSSL_SSL_LIBRARY}" MATCHES boringssl OR
254+
NOT "${OPENSSL_CRYPTO_LIBRARY}" MATCHES boringssl)
255+
message(FATAL_ERROR "BoringSSL was not configured correctly.\nINCLUDE_DIR=${OPENSSL_INCLUDE_DIR}\nSSL_LIBRARY=${OPENSSL_SSL_LIBRARY}\nCRYPTO_LIBRARY=${OPENSSL_CRYPTO_LIBRARY}")
256+
endif()
257+
else()
258+
# Don't use BoringSSL, use OpenSSL. If you are linking against the libraries directly
259+
# from source, you probably want this instead.
260+
#
261+
# If the find_package fails to find OpenSSL, set OPENSSL_ROOT_DIR to OpenSSL'S install
262+
# location on your system.
263+
find_package(OpenSSL REQUIRED)
251264
endif()
252265
endif()
253266

cmake/external_rules.cmake

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -95,20 +95,22 @@ function(download_external_sources)
9595

9696
# On desktop, make a few tweaks to the downloaded files.
9797
if(NOT ANDROID AND NOT IOS)
98-
# CMake's find_package(OpenSSL) doesn't quite work right with BoringSSL
99-
# unless the header file contains OPENSSL_VERSION_NUMBER.
100-
file(READ ${PROJECT_BINARY_DIR}/external/src/boringssl/src/include/openssl/opensslv.h TMP_HEADER_CONTENTS)
101-
if (NOT TMP_HEADER_CONTENTS MATCHES OPENSSL_VERSION_NUMBER)
102-
file(APPEND ${PROJECT_BINARY_DIR}/external/src/boringssl/src/include/openssl/opensslv.h
103-
"\n#ifndef OPENSSL_VERSION_NUMBER\n# define OPENSSL_VERSION_NUMBER 0x10010107L\n#endif\n")
104-
endif()
105-
# Also add an #include <stdlib.h> since openssl has it and boringssl
106-
# doesn't, and some of our code depends on the transitive dependency (this
107-
# is a bug).
108-
file(READ ${PROJECT_BINARY_DIR}/external/src/boringssl/src/include/openssl/rand.h TMP_HEADER2_CONTENTS)
109-
if (NOT TMP_HEADER2_CONTENTS MATCHES "<stdlib.h>")
110-
file(APPEND ${PROJECT_BINARY_DIR}/external/src/boringssl/src/include/openssl/rand.h
111-
"\n#include <stdlib.h>\n")
98+
if (FIREBASE_USE_BORINGSSL)
99+
# CMake's find_package(OpenSSL) doesn't quite work right with BoringSSL
100+
# unless the header file contains OPENSSL_VERSION_NUMBER.
101+
file(READ ${PROJECT_BINARY_DIR}/external/src/boringssl/src/include/openssl/opensslv.h TMP_HEADER_CONTENTS)
102+
if (NOT TMP_HEADER_CONTENTS MATCHES OPENSSL_VERSION_NUMBER)
103+
file(APPEND ${PROJECT_BINARY_DIR}/external/src/boringssl/src/include/openssl/opensslv.h
104+
"\n#ifndef OPENSSL_VERSION_NUMBER\n# define OPENSSL_VERSION_NUMBER 0x10010107L\n#endif\n")
105+
endif()
106+
# Also add an #include <stdlib.h> since openssl has it and boringssl
107+
# doesn't, and some of our code depends on the transitive dependency (this
108+
# is a bug).
109+
file(READ ${PROJECT_BINARY_DIR}/external/src/boringssl/src/include/openssl/rand.h TMP_HEADER2_CONTENTS)
110+
if (NOT TMP_HEADER2_CONTENTS MATCHES "<stdlib.h>")
111+
file(APPEND ${PROJECT_BINARY_DIR}/external/src/boringssl/src/include/openssl/rand.h
112+
"\n#include <stdlib.h>\n")
113+
endif()
112114
endif()
113115
endif()
114116
endfunction()
@@ -212,33 +214,35 @@ function(build_external_dependencies)
212214
message(STATUS "Sub-build options: ${CMAKE_SUB_BUILD_OPTIONS}")
213215

214216
if(NOT ANDROID AND NOT IOS)
215-
execute_process(
216-
COMMAND ${ENV_COMMAND} cmake -DOPENSSL_NO_ASM=TRUE ${CMAKE_SUB_CONFIGURE_OPTIONS} ../boringssl/src
217-
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/external/src/boringssl-build
218-
RESULT_VARIABLE boringssl_configure_status
219-
)
220-
if (boringssl_configure_status AND NOT boringssl_configure_status EQUAL 0)
221-
message(FATAL_ERROR "BoringSSL configure failed: ${boringssl_configure_status}")
222-
endif()
223-
224-
# Run builds in parallel if we know how
225-
if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
226-
set(cmake_build_args -j)
227-
endif()
217+
if (FIREBASE_USE_BORINGSSL)
218+
execute_process(
219+
COMMAND ${ENV_COMMAND} cmake -DOPENSSL_NO_ASM=TRUE ${CMAKE_SUB_CONFIGURE_OPTIONS} ../boringssl/src
220+
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/external/src/boringssl-build
221+
RESULT_VARIABLE boringssl_configure_status
222+
)
223+
if (boringssl_configure_status AND NOT boringssl_configure_status EQUAL 0)
224+
message(FATAL_ERROR "BoringSSL configure failed: ${boringssl_configure_status}")
225+
endif()
226+
227+
# Run builds in parallel if we know how
228+
if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
229+
set(cmake_build_args -j)
230+
endif()
231+
232+
execute_process(
233+
COMMAND ${ENV_COMMAND} cmake --build . ${CMAKE_SUB_BUILD_OPTIONS} --target ssl crypto -- ${cmake_build_args}
234+
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/external/src/boringssl-build
235+
RESULT_VARIABLE boringssl_build_status
236+
)
237+
if (boringssl_build_status AND NOT boringssl_build_status EQUAL 0)
238+
message(FATAL_ERROR "BoringSSL build failed: ${boringssl_build_status}")
239+
endif()
228240

229-
execute_process(
230-
COMMAND ${ENV_COMMAND} cmake --build . ${CMAKE_SUB_BUILD_OPTIONS} --target ssl crypto -- ${cmake_build_args}
231-
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/external/src/boringssl-build
232-
RESULT_VARIABLE boringssl_build_status
233-
)
234-
if (boringssl_build_status AND NOT boringssl_build_status EQUAL 0)
235-
message(FATAL_ERROR "BoringSSL build failed: ${boringssl_build_status}")
241+
# Also copy the built files into OPENSSL_ROOT_DIR to handle misconfigured
242+
# subprojects.
243+
file(INSTALL "${OPENSSL_CRYPTO_LIBRARY}" DESTINATION "${OPENSSL_ROOT_DIR}")
244+
file(INSTALL "${OPENSSL_SSL_LIBRARY}" DESTINATION "${OPENSSL_ROOT_DIR}")
236245
endif()
237-
238-
# Also copy the built files into OPENSSL_ROOT_DIR to handle misconfigured
239-
# subprojects.
240-
file(INSTALL "${OPENSSL_CRYPTO_LIBRARY}" DESTINATION "${OPENSSL_ROOT_DIR}")
241-
file(INSTALL "${OPENSSL_SSL_LIBRARY}" DESTINATION "${OPENSSL_ROOT_DIR}")
242246
endif()
243247
endfunction()
244248

scripts/gha/build_desktop.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ def cmake_configure(build_dir, arch, msvc_runtime_library='static',
194194

195195
if (target_format):
196196
cmd.append('-DFIREBASE_XCODE_TARGET_FORMAT={0}'.format(target_format))
197+
198+
cmd.append('-DFIREBASE_USE_BORINGSSL=ON')
197199
utils.run_command(cmd)
198200

199201
def main():

0 commit comments

Comments
 (0)