1
set(CROSS_ROOTFS $ENV{ROOTFS_DIR})
3
# reset platform variables (e.g. cmake 3.25 sets LINUX=1)
11
set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH})
12
if(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version)
13
set(CMAKE_SYSTEM_NAME FreeBSD)
15
elseif(EXISTS ${CROSS_ROOTFS}/usr/platform/i86pc)
16
set(CMAKE_SYSTEM_NAME SunOS)
18
elseif(EXISTS ${CROSS_ROOTFS}/boot/system/develop/headers/config/HaikuConfig.h)
19
set(CMAKE_SYSTEM_NAME Haiku)
22
set(CMAKE_SYSTEM_NAME Linux)
25
set(CMAKE_SYSTEM_VERSION 1)
27
if(EXISTS ${CROSS_ROOTFS}/etc/tizen-release)
29
elseif(EXISTS ${CROSS_ROOTFS}/android_platform)
33
if(TARGET_ARCH_NAME STREQUAL "arm")
34
set(CMAKE_SYSTEM_PROCESSOR armv7l)
35
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv7-alpine-linux-musleabihf)
36
set(TOOLCHAIN "armv7-alpine-linux-musleabihf")
37
elseif(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf)
38
set(TOOLCHAIN "armv6-alpine-linux-musleabihf")
40
set(TOOLCHAIN "arm-linux-gnueabihf")
43
set(TIZEN_TOOLCHAIN "armv7hl-tizen-linux-gnueabihf/9.2.0")
45
elseif(TARGET_ARCH_NAME STREQUAL "arm64")
46
set(CMAKE_SYSTEM_PROCESSOR aarch64)
47
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl)
48
set(TOOLCHAIN "aarch64-alpine-linux-musl")
50
set(TOOLCHAIN "aarch64-linux-gnu")
52
set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0")
55
set(triple "aarch64-unknown-freebsd12")
57
elseif(TARGET_ARCH_NAME STREQUAL "armel")
58
set(CMAKE_SYSTEM_PROCESSOR armv7l)
59
set(TOOLCHAIN "arm-linux-gnueabi")
61
set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/9.2.0")
63
elseif(TARGET_ARCH_NAME STREQUAL "armv6")
64
set(CMAKE_SYSTEM_PROCESSOR armv6l)
65
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf)
66
set(TOOLCHAIN "armv6-alpine-linux-musleabihf")
68
set(TOOLCHAIN "arm-linux-gnueabihf")
70
elseif(TARGET_ARCH_NAME STREQUAL "ppc64le")
71
set(CMAKE_SYSTEM_PROCESSOR ppc64le)
72
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/powerpc64le-alpine-linux-musl)
73
set(TOOLCHAIN "powerpc64le-alpine-linux-musl")
75
set(TOOLCHAIN "powerpc64le-linux-gnu")
77
elseif(TARGET_ARCH_NAME STREQUAL "riscv64")
78
set(CMAKE_SYSTEM_PROCESSOR riscv64)
79
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/riscv64-alpine-linux-musl)
80
set(TOOLCHAIN "riscv64-alpine-linux-musl")
82
set(TOOLCHAIN "riscv64-linux-gnu")
84
elseif(TARGET_ARCH_NAME STREQUAL "s390x")
85
set(CMAKE_SYSTEM_PROCESSOR s390x)
86
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/s390x-alpine-linux-musl)
87
set(TOOLCHAIN "s390x-alpine-linux-musl")
89
set(TOOLCHAIN "s390x-linux-gnu")
91
elseif(TARGET_ARCH_NAME STREQUAL "x64")
92
set(CMAKE_SYSTEM_PROCESSOR x86_64)
93
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/x86_64-alpine-linux-musl)
94
set(TOOLCHAIN "x86_64-alpine-linux-musl")
96
set(TOOLCHAIN "x86_64-linux-gnu")
98
set(TIZEN_TOOLCHAIN "x86_64-tizen-linux-gnu/9.2.0")
101
set(triple "x86_64-unknown-freebsd12")
103
set(TOOLCHAIN "x86_64-illumos")
105
set(TOOLCHAIN "x86_64-unknown-haiku")
107
elseif(TARGET_ARCH_NAME STREQUAL "x86")
108
set(CMAKE_SYSTEM_PROCESSOR i686)
109
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl)
110
set(TOOLCHAIN "i586-alpine-linux-musl")
112
set(TOOLCHAIN "i686-linux-gnu")
115
set(TIZEN_TOOLCHAIN "i586-tizen-linux-gnu/9.2.0")
118
message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only arm, arm64, armel, armv6, ppc64le, riscv64, s390x, x64 and x86 are supported!")
121
if(DEFINED ENV{TOOLCHAIN})
122
set(TOOLCHAIN $ENV{TOOLCHAIN})
125
# Specify include paths
127
if(TARGET_ARCH_NAME STREQUAL "arm")
128
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
129
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7hl-tizen-linux-gnueabihf)
131
if(TARGET_ARCH_NAME STREQUAL "armel")
132
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
133
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi)
135
if(TARGET_ARCH_NAME STREQUAL "arm64")
136
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
137
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/aarch64-tizen-linux-gnu)
139
if(TARGET_ARCH_NAME STREQUAL "x86")
140
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
141
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/i586-tizen-linux-gnu)
143
if(TARGET_ARCH_NAME STREQUAL "x64")
144
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
145
include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/x86_64-tizen-linux-gnu)
150
if(TARGET_ARCH_NAME STREQUAL "arm")
151
set(ANDROID_ABI armeabi-v7a)
152
elseif(TARGET_ARCH_NAME STREQUAL "arm64")
153
set(ANDROID_ABI arm64-v8a)
156
# extract platform number required by the NDK's toolchain
157
file(READ "${CROSS_ROOTFS}/android_platform" RID_FILE_CONTENTS)
158
string(REPLACE "RID=" "" ANDROID_RID "${RID_FILE_CONTENTS}")
159
string(REGEX REPLACE ".*\\.([0-9]+)-.*" "\\1" ANDROID_PLATFORM "${ANDROID_RID}")
161
set(ANDROID_TOOLCHAIN clang)
162
set(FEATURE_EVENT_TRACE 0) # disable event trace as there is no lttng-ust package in termux repository
163
set(CMAKE_SYSTEM_LIBRARY_PATH "${CROSS_ROOTFS}/usr/lib")
164
set(CMAKE_SYSTEM_INCLUDE_PATH "${CROSS_ROOTFS}/usr/include")
166
# include official NDK toolchain script
167
include(${CROSS_ROOTFS}/../build/cmake/android.toolchain.cmake)
169
# we cross-compile by instructing clang
170
set(CMAKE_C_COMPILER_TARGET ${triple})
171
set(CMAKE_CXX_COMPILER_TARGET ${triple})
172
set(CMAKE_ASM_COMPILER_TARGET ${triple})
173
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
174
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld")
175
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld")
176
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=lld")
178
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
180
include_directories(SYSTEM ${CROSS_ROOTFS}/include)
182
set(TOOLSET_PREFIX ${TOOLCHAIN}-)
183
function(locate_toolchain_exec exec var)
184
string(TOUPPER ${exec} EXEC_UPPERCASE)
185
if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "")
186
set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE)
190
find_program(EXEC_LOCATION_${exec}
192
"${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}"
193
"${TOOLSET_PREFIX}${exec}")
195
if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND")
196
message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.")
198
set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE)
201
set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}")
203
locate_toolchain_exec(gcc CMAKE_C_COMPILER)
204
locate_toolchain_exec(g++ CMAKE_CXX_COMPILER)
206
set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp")
207
set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp")
209
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
210
set(CMAKE_PROGRAM_PATH "${CMAKE_PROGRAM_PATH};${CROSS_ROOTFS}/cross-tools-x86_64/bin")
212
set(TOOLSET_PREFIX ${TOOLCHAIN}-)
213
function(locate_toolchain_exec exec var)
214
string(TOUPPER ${exec} EXEC_UPPERCASE)
215
if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "")
216
set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE)
220
find_program(EXEC_LOCATION_${exec}
222
"${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}"
223
"${TOOLSET_PREFIX}${exec}")
225
if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND")
226
message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.")
228
set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE)
231
set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}")
233
locate_toolchain_exec(gcc CMAKE_C_COMPILER)
234
locate_toolchain_exec(g++ CMAKE_CXX_COMPILER)
236
set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp")
237
set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp")
239
# let CMake set up the correct search paths
240
include(Platform/Haiku)
242
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
244
set(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
245
set(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
246
set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN "${CROSS_ROOTFS}/usr")
251
function(add_toolchain_linker_flag Flag)
252
set(Config "${ARGV1}")
253
set(CONFIG_SUFFIX "")
254
if (NOT Config STREQUAL "")
255
set(CONFIG_SUFFIX "_${Config}")
257
set("CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE)
258
set("CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT" "${CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}_INIT} ${Flag}" PARENT_SCOPE)
262
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib/${TOOLCHAIN}")
263
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}")
266
if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$")
268
add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
269
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib")
270
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib")
271
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
273
elseif(TARGET_ARCH_NAME MATCHES "^(arm64|x64)$")
275
add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
276
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib64")
277
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib64")
278
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
280
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib64")
281
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64")
282
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
284
elseif(TARGET_ARCH_NAME STREQUAL "x86")
285
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl)
286
add_toolchain_linker_flag("--target=${TOOLCHAIN}")
287
add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}")
289
add_toolchain_linker_flag(-m32)
291
add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
292
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib")
293
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib")
294
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
297
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib/amd64")
298
add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/amd64/lib")
300
add_toolchain_linker_flag("-lnetwork")
301
add_toolchain_linker_flag("-lroot")
304
# Specify compile options
306
if((TARGET_ARCH_NAME MATCHES "^(arm|arm64|armel|armv6|ppc64le|riscv64|s390x|x64|x86)$" AND NOT ANDROID AND NOT FREEBSD) OR ILLUMOS OR HAIKU)
307
set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN})
308
set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN})
309
set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN})
312
if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$")
313
add_compile_options(-mthumb)
314
if (NOT DEFINED CLR_ARM_FPU_TYPE)
315
set (CLR_ARM_FPU_TYPE vfpv3)
316
endif (NOT DEFINED CLR_ARM_FPU_TYPE)
318
add_compile_options (-mfpu=${CLR_ARM_FPU_TYPE})
319
if (NOT DEFINED CLR_ARM_FPU_CAPABILITY)
320
set (CLR_ARM_FPU_CAPABILITY 0x7)
321
endif (NOT DEFINED CLR_ARM_FPU_CAPABILITY)
323
add_definitions (-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY})
325
# persist variables across multiple try_compile passes
326
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CLR_ARM_FPU_TYPE CLR_ARM_FPU_CAPABILITY)
328
if(TARGET_ARCH_NAME STREQUAL "armel")
329
add_compile_options(-mfloat-abi=softfp)
331
elseif(TARGET_ARCH_NAME STREQUAL "x86")
332
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl)
333
add_compile_options(--target=${TOOLCHAIN})
335
add_compile_options(-m32)
336
add_compile_options(-Wno-error=unused-command-line-argument)
340
if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64|x86)$")
341
add_compile_options(-Wno-deprecated-declarations) # compile-time option
342
add_compile_options(-D__extern_always_inline=inline) # compile-time option
346
# Set LLDB include and library paths for builds that need lldb.
347
if(TARGET_ARCH_NAME MATCHES "^(arm|armel|x86)$")
348
if(TARGET_ARCH_NAME STREQUAL "x86")
349
set(LLVM_CROSS_DIR "$ENV{LLVM_CROSS_HOME}")
350
else() # arm/armel case
351
set(LLVM_CROSS_DIR "$ENV{LLVM_ARM_HOME}")
354
set(WITH_LLDB_LIBS "${LLVM_CROSS_DIR}/lib/" CACHE STRING "")
355
set(WITH_LLDB_INCLUDES "${LLVM_CROSS_DIR}/include" CACHE STRING "")
356
set(LLDB_H "${WITH_LLDB_INCLUDES}" CACHE STRING "")
357
set(LLDB "${LLVM_CROSS_DIR}/lib/liblldb.so" CACHE STRING "")
359
if(TARGET_ARCH_NAME STREQUAL "x86")
360
set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/i386-linux-gnu" CACHE STRING "")
361
set(CHECK_LLVM_DIR "${CROSS_ROOTFS}/usr/lib/llvm-3.8/include")
362
if(EXISTS "${CHECK_LLVM_DIR}" AND IS_DIRECTORY "${CHECK_LLVM_DIR}")
363
set(WITH_LLDB_INCLUDES "${CHECK_LLVM_DIR}")
365
set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include")
367
else() # arm/armel case
368
set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}" CACHE STRING "")
369
set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include" CACHE STRING "")
374
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
375
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
376
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
377
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)