Skip to content

Commit 0cbe877

Browse files
authored
Use cross-compilers instead of CentOS image (#6559)
* Use cross-compilers instead of CentOS image * changelog * fix bad merge * refactor toolchain files * clarify useToolchain exception circumstances
1 parent 3cbab03 commit 0cbe877

15 files changed

+48
-140
lines changed

Diff for: CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
-----------
2020

2121
### Internals
22-
* None.
22+
* Added CMake toolchains for cross-targeting Linux x86_64, armv7, and aarch64. (PR [#6559](https://github.com/realm/realm-core/pull/6559))
2323

2424
----------------------------------------------
2525

Diff for: CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,8 @@ endif()
297297
# Just use -lz and let Xcode figure it out
298298
# Emscripten does provide Zlib, but it doesn't work with find_package and is handled specially
299299
if(NOT APPLE AND NOT EMSCRIPTEN AND NOT TARGET ZLIB::ZLIB)
300-
if(WIN32)
301-
realm_acquire_dependency(zlib ${DEP_WIN32_ZLIB_VERSION} ZLIB_CMAKE_INCLUDE_FILE)
300+
if(WIN32 OR (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND REALM_LINUX_TOOLCHAIN))
301+
realm_acquire_dependency(zlib ${DEP_ZLIB_VERSION} ZLIB_CMAKE_INCLUDE_FILE)
302302
include(${ZLIB_CMAKE_INCLUDE_FILE})
303303
elseif(ANDROID)
304304
# On Android FindZLIB chooses the static libz over the dynamic one, but this leads to issues

Diff for: Jenkinsfile

+14-8
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ jobWrapper {
105105

106106
parallelExecutors = [
107107
buildLinuxRelease : doBuildLinux('Release'),
108-
checkLinuxDebug : doCheckInDocker(buildOptions),
108+
checkLinuxDebug : doCheckInDocker(buildOptions + [useToolchain : true]),
109109
checkLinuxDebugEncrypt : doCheckInDocker(buildOptions + [useEncryption : true]),
110-
checkLinuxRelease_4 : doCheckInDocker(buildOptions + [maxBpNodeSize: 4, buildType : 'Release']),
110+
checkLinuxRelease_4 : doCheckInDocker(buildOptions + [maxBpNodeSize: 4, buildType : 'Release', useToolchain : true]),
111111
checkLinuxDebug_Sync : doCheckInDocker(buildOptions + [enableSync: true, dumpChangesetTransform: true]),
112112
checkLinuxDebugNoEncryp : doCheckInDocker(buildOptions + [enableEncryption: false]),
113113
checkMacOsRelease_Sync : doBuildMacOs(buildOptions + [buildType: 'Release', enableSync: true]),
@@ -251,7 +251,7 @@ def doCheckInDocker(Map options = [:]) {
251251
rlmNode('docker') {
252252
getArchive()
253253

254-
def buildEnv = buildDockerEnv('testing.Dockerfile')
254+
def buildEnv = buildDockerEnv('linux.Dockerfile')
255255

256256
def environment = environment()
257257
environment << 'UNITTEST_XML=unit-test-report.xml'
@@ -260,6 +260,12 @@ def doCheckInDocker(Map options = [:]) {
260260
environment << 'UNITTEST_ENCRYPT_ALL=1'
261261
}
262262

263+
// We don't enable this by default, because using a toolchain with its own sysroot
264+
// prevents CMake from finding system libraries like curl which we use in sync tests.
265+
if (options.useToolchain) {
266+
cmakeDefinitions += " -DCMAKE_TOOLCHAIN_FILE=\"${env.WORKSPACE}/tools/cmake/x86_64-linux-gnu.toolchain.cmake\""
267+
}
268+
263269
def buildSteps = { String dockerArgs = "" ->
264270
buildEnv.inside(dockerArgs) {
265271
withEnv(environment) {
@@ -351,7 +357,7 @@ def doCheckSanity(Map options = [:]) {
351357
"UNITTEST_SUITE_NAME=Linux-${options.buildType}",
352358
"TSAN_OPTIONS=\"suppressions=${WORKSPACE}/test/tsan.suppress\""
353359
]
354-
buildDockerEnv('testing.Dockerfile').inside(privileged) {
360+
buildDockerEnv('linux.Dockerfile').inside(privileged) {
355361
withEnv(environment) {
356362
try {
357363
dir('build-dir') {
@@ -379,12 +385,12 @@ def doBuildLinux(String buildType) {
379385
rlmNode('docker') {
380386
getSourceArchive()
381387

382-
buildDockerEnv('packaging.Dockerfile').inside {
388+
buildDockerEnv('linux.Dockerfile').inside {
383389
sh """
384390
rm -rf build-dir
385391
mkdir build-dir
386392
cd build-dir
387-
cmake -DCMAKE_BUILD_TYPE=${buildType} -DREALM_NO_TESTS=1 -DREALM_VERSION="${gitDescribeVersion}" -G Ninja ..
393+
cmake -DCMAKE_BUILD_TYPE=${buildType} -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/x86_64-linux-gnu.toolchain.cmake -DREALM_NO_TESTS=1 -DREALM_VERSION="${gitDescribeVersion}" -G Ninja ..
388394
ninja
389395
cpack -G TGZ
390396
"""
@@ -410,7 +416,7 @@ def doBuildLinuxClang(String buildType) {
410416
'CXX=clang++'
411417
]
412418

413-
buildDockerEnv('testing.Dockerfile').inside {
419+
buildDockerEnv('linux.Dockerfile').inside {
414420
withEnv(environment) {
415421
dir('build-dir') {
416422
sh "cmake -D CMAKE_BUILD_TYPE=${buildType} -DREALM_NO_TESTS=1 -DREALM_VERSION=\"${gitDescribeVersion}\" -G Ninja .."
@@ -778,7 +784,7 @@ def doBuildCoverage() {
778784
rlmNode('docker') {
779785
getArchive()
780786

781-
buildDockerEnv('testing.Dockerfile').inside {
787+
buildDockerEnv('linux.Dockerfile').inside {
782788
sh '''
783789
mkdir build
784790
cd build

Diff for: dependencies.list

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
PACKAGE_NAME=realm-core
22
VERSION=13.13.0
33
OPENSSL_VERSION=3.0.8
4-
WIN32_ZLIB_VERSION=1.2.13
4+
ZLIB_VERSION=1.2.13
55
MDBREALM_TEST_SERVER_TAG=2023-05-05

Diff for: testing.Dockerfile renamed to linux.Dockerfile

File renamed without changes.

Diff for: packaging.Dockerfile

-2
This file was deleted.

Diff for: tools/cmake/RealmConfig.cmake.in

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ find_dependency(Threads)
2424
# so for an iOS build it'll use the path from the Device plaform, which is an error on Simulator.
2525
# Just use -lz and let Xcode figure it out
2626
if(TARGET Realm::Sync AND NOT APPLE AND NOT TARGET ZLIB::ZLIB)
27-
if(WIN32)
28-
realm_acquire_dependency(zlib @DEP_WIN32_ZLIB_VERSION@ ZLIB_CMAKE_INCLUDE_FILE)
27+
if(WIN32 OR (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND REALM_LINUX_TOOLCHAIN))
28+
realm_acquire_dependency(zlib @DEP_ZLIB_VERSION@ ZLIB_CMAKE_INCLUDE_FILE)
2929
include(${ZLIB_CMAKE_INCLUDE_FILE})
3030
elseif(ANDROID)
3131
# On Android FindZLIB chooses the static libz over the dynamic one, but this leads to issues

Diff for: tools/cmake/aarch64-linux-gnu.toolchain.cmake

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
set(_TRIPLET "aarch64-unknown-linux-gnu")
2+
set(_TOOLCHAIN_MD5 a3a14d87f98904c2558b43bbd310f337)
3+
include("${CMAKE_CURRENT_LIST_DIR}/linux.toolchain.base.cmake")

Diff for: tools/cmake/aarch64.toolchain.cmake

-16
This file was deleted.

Diff for: tools/cmake/android-build-openssl.sh.in

-88
This file was deleted.

Diff for: tools/cmake/armhf.toolchain.cmake

-17
This file was deleted.

Diff for: tools/cmake/armv7-linux-gnueabihf.toolchain.cmake

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
set(_TRIPLET "armv7-unknown-linux-gnueabihf")
2+
set(_TOOLCHAIN_MD5 fbf817b1428bb35c93be8e6c15f73d7d)
3+
include("${CMAKE_CURRENT_LIST_DIR}/linux.toolchain.base.cmake")

Diff for: tools/cmake/linux.toolchain.base.cmake

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" OR NOT CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")
2+
message(FATAL_ERROR "This toolchain can only be used on x86_64 Linux.")
3+
endif()
4+
5+
file(DOWNLOAD https://static.realm.io/toolchains/v3/${_TRIPLET}.tar.zst ${CMAKE_BINARY_DIR}/${_TRIPLET}.tar.zst
6+
EXPECTED_HASH MD5=${_TOOLCHAIN_MD5} STATUS _DOWNLOAD_STATUS)
7+
list(GET _DOWNLOAD_STATUS 0 _DOWNLOAD_STATUS_CODE)
8+
if(NOT ${_DOWNLOAD_STATUS_CODE} EQUAL 0)
9+
message(FATAL_ERROR "Error downloading ${_TRIPLET}.tar.zst: ${_DOWNLOAD_STATUS}")
10+
endif()
11+
12+
file(ARCHIVE_EXTRACT INPUT ${CMAKE_BINARY_DIR}/${_TRIPLET}.tar.zst DESTINATION ${CMAKE_BINARY_DIR})
13+
include("${CMAKE_BINARY_DIR}/${_TRIPLET}/toolchain.cmake")
14+
15+
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Xlinker --exclude-libs=libgcc.a,libstdc++.a -static-libgcc -static-libstdc++")
16+
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-Xlinker --exclude-libs=libgcc.a,libstdc++.a -static-libgcc -static-libstdc++")
17+
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-Xlinker --exclude-libs=libgcc.a,libstdc++.a -static-libgcc -static-libstdc++")
18+
19+
set(REALM_LINUX_TOOLCHAIN ON)

Diff for: tools/cmake/run_ldconfig.sh

-3
This file was deleted.

Diff for: tools/cmake/x86_64-linux-gnu.toolchain.cmake

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
set(_TRIPLET "x86_64-unknown-linux-gnu")
2+
set(_TOOLCHAIN_MD5 aa99fc16d85adf1bb2f8b63b83542044)
3+
include("${CMAKE_CURRENT_LIST_DIR}/linux.toolchain.base.cmake")

0 commit comments

Comments
 (0)