Skip to content

Commit 38633d5

Browse files
committed
Implement per-platform compiler version selection
1 parent 41cbc83 commit 38633d5

File tree

4 files changed

+139
-3
lines changed

4 files changed

+139
-3
lines changed

src/AutoBuild.jl

+53-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export build_tarballs, autobuild, print_artifacts_toml, build, get_meta_json
1+
export build_tarballs, autobuild, print_artifacts_toml, build, get_meta_json, preferred_platform_compiler, set_preferred_compiler_version!
22
import GitHub: gh_get_json, DEFAULT_API
33
import SHA: sha256, sha1
44
using TOML, Dates, UUIDs
@@ -720,6 +720,49 @@ function compose_debug_prompt(workspace)
720720
return debug_shell_prompt
721721
end
722722

723+
"""
724+
preferred_platform_compiler(platforms::Vector{<:Platform}, version::Union{Nothing,VersionNumber}=nothing)
725+
726+
Initializes a dictionary with an entry for every platform given
727+
that will store platform-specific compiler versions (if any).
728+
"""
729+
function preferred_platform_compiler(platforms::Vector{<:Platform}, version::Union{Nothing,VersionNumber}=nothing)
730+
compiler_versions = Dict{Platform, Union{Nothing,VersionNumber}}(p => version for p in platforms)
731+
return compiler_versions
732+
end
733+
734+
"""
735+
set_preferred_compiler_version!(compiler_versions::Dict{Platform, Union{Nothing,VersionNumber}},
736+
version::VersionNumber,
737+
selector::Union{Vector{<:Platform},Function})
738+
739+
Set the preferred compiler version for the platforms matching `selector` to `version`.
740+
"""
741+
function set_preferred_compiler_version!(compiler_versions::Dict{Platform, Union{Nothing,VersionNumber}},
742+
version::VersionNumber,
743+
selector::Union{Vector{<:Platform},Function})
744+
matching_platform(selector::Function, platform) = selector(platform)
745+
matching_platform(selector::Vector{<:Platform}, platform) = platform in selector
746+
747+
for (platform, compiler) in compiler_versions
748+
if matching_platform(selector, platform)
749+
compiler_versions[platform] = version
750+
end
751+
end
752+
753+
return compiler_versions
754+
end
755+
756+
function get_platform_compiler_version!(compiler_args, key, platform, version)
757+
if version isa VersionNumber
758+
compiler_args[key] = version
759+
elseif version isa Dict
760+
if !isnothing(version[platform])
761+
compiler_args[key] = version[platform]
762+
end
763+
end
764+
end
765+
723766
"""
724767
autobuild(dir::AbstractString, src_name::AbstractString,
725768
src_version::VersionNumber, sources::Vector,
@@ -823,11 +866,17 @@ function autobuild(dir::AbstractString,
823866
timer = BuildTimer()
824867
timer.begin_setup = time()
825868

869+
compiler_args = Dict()
870+
871+
for (k, v) in extract_kwargs(kwargs, (:preferred_gcc_version,:preferred_llvm_version,:preferred_rust_version,:preferred_go_version))
872+
get_platform_compiler_version!(compiler_args, k, platform, kwargs[k])
873+
end
874+
826875
# We build in a platform-specific directory
827876
build_path = joinpath(dir, "build", triplet(platform))
828877
mkpath(build_path)
829878

830-
shards = choose_shards(platform; extract_kwargs(kwargs, (:preferred_gcc_version,:preferred_llvm_version,:preferred_rust_version,:preferred_go_version,:bootstrap_list,:compilers))...)
879+
shards = choose_shards(platform; compiler_args..., extract_kwargs(kwargs, (:bootstrap_list,:compilers))...)
831880
concrete_platform = get_concrete_platform(platform, shards)
832881

833882
prefix = setup_workspace(
@@ -854,7 +903,8 @@ function autobuild(dir::AbstractString,
854903
compiler_wrapper_dir = joinpath(prefix, "compiler_wrappers"),
855904
src_name = src_name,
856905
shards = shards,
857-
extract_kwargs(kwargs, (:preferred_gcc_version,:preferred_llvm_version,:compilers,:allow_unsafe_flags,:lock_microarchitecture,:clang_use_lld))...,
906+
compiler_args...,
907+
extract_kwargs(kwargs, (:compilers,:allow_unsafe_flags,:lock_microarchitecture,:clang_use_lld))...,
858908
)
859909

860910
# Set up some bash traps

test/building.jl

+50
Original file line numberDiff line numberDiff line change
@@ -479,3 +479,53 @@ end
479479
)
480480
end
481481
end
482+
483+
@testset "Different compiler versions" begin
484+
platforms = [Platform("x86_64", "linux"),
485+
Platform("x86_64", "freebsd")]
486+
487+
# Use GCC 5 on FreeBSD and GCC 10 on Linux
488+
c = preferred_platform_compiler(platforms, v"5")
489+
set_preferred_compiler_version!(c, v"10", p ->Sys.islinux(p))
490+
491+
mktempdir() do build_path
492+
build_output_meta = autobuild(
493+
build_path,
494+
"libfoo",
495+
v"1.0.0",
496+
[DirectorySource(build_tests_dir)],
497+
# Include a GCC version check before we build
498+
raw"""
499+
export ver=$(cc -dumpversion)
500+
export shortver=${ver%.*.*}
501+
502+
if [[ "${target}" == *-linux-* ]]; then
503+
if [[ $shortver == "10" ]]; then
504+
# This is what we want
505+
echo "Success! GCC version correct"
506+
else
507+
# This is not what we want
508+
exit 1
509+
fi
510+
else
511+
if [[ $shortver == "5" ]]; then
512+
# This is what we want
513+
echo "Success! GCC version correct"
514+
else
515+
# This is not what we want
516+
exit 1
517+
fi
518+
fi
519+
"""*libfoo_make_script,
520+
platforms,
521+
libfoo_products,
522+
# No dependencies
523+
Dependency[];
524+
# Don't do audit passes
525+
skip_audit=true,
526+
# Specify the per-platform GCC versions
527+
preferred_gcc_version=c,
528+
)
529+
@test haskey(build_output_meta, p)
530+
end
531+
end

test/compilers.jl

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using BinaryBuilder, Test
2+
3+
@testset "Compiler dictionary creation" begin
4+
platforms = supported_platforms()
5+
6+
pd = preferred_platform_compiler(platforms)
7+
8+
# Make sure everything is nothing
9+
@test length(platforms) == length(pd)
10+
@test all(isnothing.(values(pd)))
11+
12+
# Try the expanded platform list
13+
platforms = supported_platforms()
14+
platforms = expand_gfortran_versions()
15+
pd = preferred_platform_compiler(platforms)
16+
@test length(platforms) == length(pd)
17+
@test all(isnothing.(values(pd)))
18+
19+
# Set everything to a version
20+
pd = preferred_platform_compiler(platforms, v"5")
21+
@test length(platforms) == length(pd)
22+
@test all(values(pd) .== v"5")
23+
24+
# Assign some compiler values
25+
pd = preferred_platform_compiler(platforms, v"5")
26+
set_preferred_compiler_version!(pd, v"10", p ->Sys.islinux(p))
27+
set_preferred_compiler_version!(pd, v"6", p ->Sys.isfreebsd(p))
28+
set_preferred_compiler_version!(pd, v"12", [Platform("x86_64", "macos")])
29+
set_preferred_compiler_version!(pd, v"13", [Platform("aarch64", "macos")])
30+
31+
@test pd[Platform("x86_64", "linux")] == v"10"
32+
@test pd[Platform("x86_64", "freebsd")] == v"6"
33+
@test pd[Platform("x86_64", "macos")] == v"12"
34+
@test pd[Platform("aarch64", "macos")] == v"13"
35+
end

test/runtests.jl

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ install_license ${WORKSPACE}/srcdir/libfoo/LICENSE.md
6767

6868
# Run all our tests
6969
include("basic.jl")
70+
include("compilers.jl")
7071
include("building.jl")
7172
include("auditing.jl")
7273
include("jll.jl")

0 commit comments

Comments
 (0)