@@ -29,17 +29,28 @@ function cmake_os(p::AbstractPlatform)
29
29
end
30
30
end
31
31
32
- function toolchain_file (bt:: CMake , p:: AbstractPlatform )
32
+ function toolchain_file (bt:: CMake , p:: AbstractPlatform ; is_host :: Bool = false )
33
33
target = triplet (p)
34
34
aatarget = aatriplet (p)
35
35
36
+ # CMake uses the setting of `HOST_SYSTEM_NAME` and `SYSTEM_NAME` to decide
37
+ # whether the current build is a cross-compilation or not:
38
+ # <https://cmake.org/cmake/help/latest/variable/CMAKE_CROSSCOMPILING.html>.
39
+ # We want to have the host toolchain always setting `HOST_SYSTEM_NAME`, and
40
+ # the target toolchain always setting `SYSTEM_NAME`.
41
+ system_name_var = if is_host
42
+ " HOST_SYSTEM_NAME"
43
+ else
44
+ " SYSTEM_NAME"
45
+ end
46
+
36
47
if Sys. isapple (p)
37
48
darwin_ver = something (os_version (p), v " 14.5.0" )
38
49
maj_ver = darwin_ver. major
39
50
min_ver = darwin_ver. minor
40
51
return """
41
52
# CMake toolchain file for $(c_compiler (bt)) running on $(target)
42
- set(CMAKE_SYSTEM_NAME $(cmake_os (p)) )
53
+ set($(system_name_var) $(cmake_os (p)) )
43
54
set(CMAKE_SYSTEM_PROCESSOR $(cmake_arch (p)) )
44
55
set(CMAKE_SYSTEM_VERSION $(maj_ver) .$(min_ver) )
45
56
set(DARWIN_MAJOR_VERSION $(maj_ver) )
@@ -73,7 +84,7 @@ function toolchain_file(bt::CMake, p::AbstractPlatform)
73
84
else
74
85
return """
75
86
# CMake toolchain file for $(c_compiler (bt)) running on $(target)
76
- set(CMAKE_SYSTEM_NAME $(cmake_os (p)) )
87
+ set($(system_name_var) $(cmake_os (p)) )
77
88
set(CMAKE_SYSTEM_PROCESSOR $(cmake_arch (p)) )
78
89
79
90
set(CMAKE_SYSROOT /opt/$(aatarget) /$(aatarget) /sys-root/)
@@ -195,17 +206,29 @@ function generate_toolchain_files!(platform::AbstractPlatform;
195
206
dir = joinpath (toolchains_path, triplet (p))
196
207
mkpath (dir)
197
208
198
- write (joinpath (dir, " $(aatriplet (p)) _clang.cmake" ), toolchain_file (CMake {:clang} (), p))
199
- write (joinpath (dir, " $(aatriplet (p)) _gcc.cmake" ), toolchain_file (CMake {:gcc} (), p))
209
+ for compiler in (:clang , :gcc )
210
+ # Target CMake toolchain
211
+ if platforms_match (p, platform)
212
+ write (joinpath (dir, " target_$(aatriplet (p)) _$(compiler) .cmake" ), toolchain_file (CMake {compiler} (), p; is_host= false ))
213
+ end
214
+ # Host CMake toolchain
215
+ if platforms_match (p, host_platform)
216
+ write (joinpath (dir, " host_$(aatriplet (p)) _$(compiler) .cmake" ), toolchain_file (CMake {compiler} (), p; is_host= true ))
217
+ end
218
+ end
200
219
write (joinpath (dir, " $(aatriplet (p)) _clang.meson" ), toolchain_file (Meson {:clang} (), p))
201
220
write (joinpath (dir, " $(aatriplet (p)) _gcc.meson" ), toolchain_file (Meson {:gcc} (), p))
202
221
222
+ symlink_if_exists (target, link) = ispath (joinpath (dir, target)) && symlink (target, link)
223
+
203
224
# On FreeBSD and MacOS we actually want to default to clang, otherwise gcc
204
225
if Sys. isbsd (p)
205
- symlink (" $(aatriplet (p)) _clang.cmake" , joinpath (dir, " $(aatriplet (p)) .cmake" ))
226
+ symlink_if_exists (" host_$(aatriplet (p)) _clang.cmake" , joinpath (dir, " host_$(aatriplet (p)) .cmake" ))
227
+ symlink_if_exists (" target_$(aatriplet (p)) _clang.cmake" , joinpath (dir, " target_$(aatriplet (p)) .cmake" ))
206
228
symlink (" $(aatriplet (p)) _clang.meson" , joinpath (dir, " $(aatriplet (p)) .meson" ))
207
229
else
208
- symlink (" $(aatriplet (p)) _gcc.cmake" , joinpath (dir, " $(aatriplet (p)) .cmake" ))
230
+ symlink_if_exists (" host_$(aatriplet (p)) _gcc.cmake" , joinpath (dir, " host_$(aatriplet (p)) .cmake" ))
231
+ symlink_if_exists (" target_$(aatriplet (p)) _gcc.cmake" , joinpath (dir, " target_$(aatriplet (p)) .cmake" ))
209
232
symlink (" $(aatriplet (p)) _gcc.meson" , joinpath (dir, " $(aatriplet (p)) .meson" ))
210
233
end
211
234
end
0 commit comments