Skip to content

Commit 581b094

Browse files
authored
[BuildToolchains] Set HOST_SYSTEM_NAME for the host CMake toolchain (#115)
1 parent a824f33 commit 581b094

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

src/BuildToolchains.jl

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,28 @@ function cmake_os(p::AbstractPlatform)
2929
end
3030
end
3131

32-
function toolchain_file(bt::CMake, p::AbstractPlatform)
32+
function toolchain_file(bt::CMake, p::AbstractPlatform; is_host::Bool=false)
3333
target = triplet(p)
3434
aatarget = aatriplet(p)
3535

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+
3647
if Sys.isapple(p)
3748
darwin_ver = something(os_version(p), v"14.5.0")
3849
maj_ver = darwin_ver.major
3950
min_ver = darwin_ver.minor
4051
return """
4152
# 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)))
4354
set(CMAKE_SYSTEM_PROCESSOR $(cmake_arch(p)))
4455
set(CMAKE_SYSTEM_VERSION $(maj_ver).$(min_ver))
4556
set(DARWIN_MAJOR_VERSION $(maj_ver))
@@ -73,7 +84,7 @@ function toolchain_file(bt::CMake, p::AbstractPlatform)
7384
else
7485
return """
7586
# 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)))
7788
set(CMAKE_SYSTEM_PROCESSOR $(cmake_arch(p)))
7889
7990
set(CMAKE_SYSROOT /opt/$(aatarget)/$(aatarget)/sys-root/)
@@ -195,17 +206,29 @@ function generate_toolchain_files!(platform::AbstractPlatform;
195206
dir = joinpath(toolchains_path, triplet(p))
196207
mkpath(dir)
197208

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
200219
write(joinpath(dir, "$(aatriplet(p))_clang.meson"), toolchain_file(Meson{:clang}(), p))
201220
write(joinpath(dir, "$(aatriplet(p))_gcc.meson"), toolchain_file(Meson{:gcc}(), p))
202221

222+
symlink_if_exists(target, link) = ispath(joinpath(dir, target)) && symlink(target, link)
223+
203224
# On FreeBSD and MacOS we actually want to default to clang, otherwise gcc
204225
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"))
206228
symlink("$(aatriplet(p))_clang.meson", joinpath(dir, "$(aatriplet(p)).meson"))
207229
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"))
209232
symlink("$(aatriplet(p))_gcc.meson", joinpath(dir, "$(aatriplet(p)).meson"))
210233
end
211234
end

src/Runner.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -928,8 +928,8 @@ function platform_envs(platform::AbstractPlatform, src_name::AbstractString;
928928
"LLVM_HOST_TARGET" => host_target,
929929

930930
# Let the user parameterize their scripts for toolchain locations
931-
"CMAKE_HOST_TOOLCHAIN" => "/opt/toolchains/$(triplet(host_platform))/$(host_target).cmake",
932-
"CMAKE_TARGET_TOOLCHAIN" => "/opt/toolchains/$(triplet(platform))/$(target).cmake",
931+
"CMAKE_HOST_TOOLCHAIN" => "/opt/toolchains/$(triplet(host_platform))/host_$(host_target).cmake",
932+
"CMAKE_TARGET_TOOLCHAIN" => "/opt/toolchains/$(triplet(platform))/target_$(target).cmake",
933933
"MESON_HOST_TOOLCHAIN" => "/opt/toolchains/$(triplet(host_platform))/$(host_target).meson",
934934
"MESON_TARGET_TOOLCHAIN" => "/opt/toolchains/$(triplet(platform))/$(target).meson",
935935

0 commit comments

Comments
 (0)