-
Notifications
You must be signed in to change notification settings - Fork 13
/
BoringSSL.cmake
142 lines (135 loc) · 5.51 KB
/
BoringSSL.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
option(COUCHBASE_CXX_CLIENT_USE_BORINGSSL_PREFIX "Use BoringSSL option to prefix symbols" FALSE)
# 2023-09-29
set(COUCHBASE_CXX_CLIENT_BORINGSSL_SHA "bd20800c22fc8402611b537287bd6948c3f2a5a8")
include(FetchContent)
FetchContent_Declare(
boringssl
GIT_REPOSITORY https://github.com/google/boringssl.git
GIT_TAG ${COUCHBASE_CXX_CLIENT_BORINGSSL_SHA})
# we need to do a two-phase build: 1. build 2. get the symbols 3. build again w/ symbol prefixing
message(STATUS "Cloning BoringSSL...")
FetchContent_Populate(boringssl)
message(STATUS "Cloned BoringSSL to ${boringssl_SOURCE_DIR}")
set(BORINGSSL_SRC_DIR "${boringssl_SOURCE_DIR}")
set(BORINGSSL_BIN_DIR "${boringssl_BINARY_DIR}")
set(BORINGSSL_OUTPUT_DIR ${PROJECT_BINARY_DIR}/boringssl)
set(BORINGSSL_INCLUDE_DIR ${BORINGSSL_OUTPUT_DIR}/include)
set(BORINGSSL_LIB_DIR ${BORINGSSL_OUTPUT_DIR}/lib)
if(MINGW)
set(boringssl_PATCH "${PROJECT_SOURCE_DIR}/cmake/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch")
message("Applying ${boringssl_PATCH} in ${boringssl_SOURCE_DIR} for MinGW gcc")
execute_process(
COMMAND patch --input ${boringssl_PATCH} --ignore-whitespace --strip=1
WORKING_DIRECTORY ${boringssl_SOURCE_DIR}
RESULT_VARIABLE PATCH_RESULT)
if(NOT
PATCH_RESULT
EQUAL
"0")
message(FATAL_ERROR "Failed to apply patch to BoringSSL. Failed with: ${PATCH_RESULT}.")
endif()
endif()
# we need Go in order to read BoringSSL's symbols via the utils they provide...thanks Google!
find_program(GO_EXECUTABLE go)
if(NOT GO_EXECUTABLE)
message(FATAL_ERROR "Could not find Go")
else()
message(STATUS "Found Go: ${GO_EXECUTABLE}")
endif()
file(MAKE_DIRECTORY ${BORINGSSL_OUTPUT_DIR})
file(MAKE_DIRECTORY ${BORINGSSL_INCLUDE_DIR})
file(MAKE_DIRECTORY ${BORINGSSL_LIB_DIR})
# if we are building BoringSSL, we set the prefix
set(COUCHBASE_CXX_CLIENT_BORINGSSL_PREFIX "COUCHBASE_CXX")
set(COUCHBASE_CXX_CLIENT_USE_BORINGSSL_PREFIX TRUE)
message(STATUS "COUCHBASE_CXX_CLIENT_BORINGSSL_PREFIX=${COUCHBASE_CXX_CLIENT_BORINGSSL_PREFIX}")
string(CONCAT BORINGSSL_CMAKE_OPTIONS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON ")
if(WIN32)
if(MINGW)
set(LIB_CRYPTO "libcrypto${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(LIB_SSL "libssl${CMAKE_STATIC_LIBRARY_SUFFIX}")
else()
set(LIB_CRYPTO "crypto${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(LIB_SSL "ssl${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif()
if(CMAKE_GENERATOR MATCHES "Visual Studio")
set(LIB_CRYPTO "${CMAKE_BUILD_TYPE}/${LIB_CRYPTO}")
set(LIB_SSL "${CMAKE_BUILD_TYPE}/${LIB_SSL}")
# https://cmake.org/cmake/help/latest/variable/CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION.html
string(CONCAT BORINGSSL_CMAKE_OPTIONS
"-DCMAKE_SYSTEM_VERSION=${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION} "
${BORINGSSL_CMAKE_OPTIONS})
endif()
execute_process(
COMMAND
cmd /C build_boringssl_win.bat ${BORINGSSL_SRC_DIR} ${BORINGSSL_BIN_DIR} ${BORINGSSL_OUTPUT_DIR}
${COUCHBASE_CXX_CLIENT_BORINGSSL_PREFIX} ${LIB_CRYPTO} ${LIB_SSL} ${CMAKE_COMMAND} ${CMAKE_GENERATOR}
${CMAKE_BUILD_TYPE} ${BORINGSSL_CMAKE_OPTIONS}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/bin
RESULT_VARIABLE BUILD_RESULT)
else()
string(
CONCAT BORINGSSL_CMAKE_OPTIONS
"-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} "
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} "
"-DCMAKE_AR=${CMAKE_AR} "
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} "
${BORINGSSL_CMAKE_OPTIONS})
execute_process(
COMMAND bash build_boringssl ${BORINGSSL_SRC_DIR} ${BORINGSSL_BIN_DIR} ${BORINGSSL_OUTPUT_DIR}
${COUCHBASE_CXX_CLIENT_BORINGSSL_PREFIX} ${CMAKE_COMMAND} ${CMAKE_GENERATOR} ${BORINGSSL_CMAKE_OPTIONS}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/bin
RESULT_VARIABLE BUILD_RESULT)
endif()
if(NOT
BUILD_RESULT
EQUAL
"0")
message(FATAL_ERROR "Failed to build BoringSSL. Failed with: ${BUILD_RESULT}.")
endif()
# make sure we can find BoringSSL
set(BORINGSSL_ROOT_DIR "${BORINGSSL_OUTPUT_DIR}")
find_package(BoringSSL)
if(NOT BoringSSL_FOUND)
message(FATAL_ERROR "Cannot build Couchbase C++ SDK without BoringSSL")
else()
# NOTEs: linux seems to need to link `Threads::Threads`, does not appear to be required for macOS use `OUTPUT_VARIABLE
# TRY_COMPILE_OUTPUT` for debugging
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
set(BORINGSSL_TEST_COMPILE_DEFINITIONS "")
if(COUCHBASE_CXX_CLIENT_USE_BORINGSSL_PREFIX)
set(BORINGSSL_TEST_COMPILE_DEFINITIONS "-DBORINGSSL_PREFIX=${COUCHBASE_CXX_CLIENT_BORINGSSL_PREFIX}")
endif()
if(CMAKE_BUILD_TYPE_LOWER MATCHES "deb")
try_compile(
BORINGSSL_USABLE ${PROJECT_BINARY_DIR}
${PROJECT_SOURCE_DIR}/cmake/test_boringssl.cxx
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${BORINGSSL_INCLUDE_DIR}"
COMPILE_DEFINITIONS "${BORINGSSL_TEST_COMPILE_DEFINITIONS}"
OUTPUT_VARIABLE TRY_COMPILE_OUTPUT
LINK_LIBRARIES
OpenSSL::Crypto
OpenSSL::SSL
Threads::Threads
CXX_STANDARD
17)
message(STATUS ${TRY_COMPILE_OUTPUT})
else()
try_compile(
BORINGSSL_USABLE ${PROJECT_BINARY_DIR}
${PROJECT_SOURCE_DIR}/cmake/test_boringssl.cxx
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${BORINGSSL_INCLUDE_DIR}"
COMPILE_DEFINITIONS "${BORINGSSL_TEST_COMPILE_DEFINITIONS}"
LINK_LIBRARIES
OpenSSL::Crypto
OpenSSL::SSL
Threads::Threads
CXX_STANDARD
17)
endif()
if(BORINGSSL_USABLE)
message(STATUS "BORING_SSL test success.")
else()
message(STATUS "BORING_SSL test fail.")
endif()
endif()