Skip to content

Commit 34bd81d

Browse files
authored
Allow storing compat strings in Dependency objects (#123)
1 parent 2212d16 commit 34bd81d

File tree

3 files changed

+52
-15
lines changed

3 files changed

+52
-15
lines changed

src/BinaryBuilderBase.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export AbstractSource, AbstractDependency, SetupSource, PatchSource,
1717
generate_compiler_wrappers!, preferred_runner, CompilerShard, UserNSRunner,
1818
DockerRunner, choose_shards, exeext, preferred_libgfortran_version,
1919
preferred_cxxstring_abi, gcc_version, available_gcc_builds, getversion,
20-
getpkg, aatriplet,
20+
getpkg, aatriplet, getcompat,
2121
nbits, proc_family, storage_dir, extract_kwargs, extract_fields,
2222
download_source, setup_workspace, setup_dependencies, update_registry,
2323
getname, cleanup_dependencies, compress_dir, prepare_for_deletion,

src/Dependencies.jl

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,33 @@ is_runtime_dependency
5757
Define a binary dependency that is necessary to build the package and load the
5858
generated JLL package. The argument can be either a string with the name of the
5959
JLL package or a `Pkg.PackageSpec`.
60+
61+
The optional keyword argument `build_version` can be used to specify the version
62+
of the dependency to be installed when building it.
63+
64+
The optional keyword argument `compat` can be used to specify a string for
65+
use in the `Project.toml` of the generated Julia package.
6066
"""
6167
struct Dependency <: AbstractDependency
6268
pkg::PkgSpec
6369
build_version::Union{VersionNumber,Nothing}
64-
Dependency(pkg::PkgSpec, build_version = nothing) = new(pkg, build_version)
70+
compat::String # semver string for use in Project.toml of the JLL
71+
function Dependency(pkg::PkgSpec, build_version = nothing; compat::String = "")
72+
if length(compat) > 0
73+
spec = Pkg.Types.semver_spec(compat) # verify compat is valid
74+
if build_version !== nothing && !(build_version in spec)
75+
throw(ArgumentError("build_version and compat for $(pkg) are incompatible"))
76+
end
77+
if pkg.version != Pkg.Types.VersionSpec("*") && !(pkg.version in spec)
78+
throw(ArgumentError("PackageSpec version and compat for $(pkg) are incompatible"))
79+
end
80+
end
81+
new(pkg, build_version, compat)
82+
end
83+
end
84+
function Dependency(dep::AbstractString, build_version = nothing; compat::String = "")
85+
return Dependency(PackageSpec(; name = dep), build_version, compat = compat)
6586
end
66-
Dependency(dep::AbstractString, build_version = nothing) = Dependency(PackageSpec(; name = dep), build_version)
6787
is_host_dependency(::Dependency) = false
6888
is_build_dependency(::Dependency) = true
6989
is_runtime_dependency(::Dependency) = true
@@ -181,10 +201,15 @@ __version(v::Pkg.Types.VersionSpec) = v.ranges[1].lower
181201
version(d::AbstractDependency) = __version(getpkg(d).version)
182202
version(d::Dependency) = __version(d.pkg.version)
183203

204+
205+
getcompat(d::AbstractDependency) = ""
206+
getcompat(d::Dependency) = d.compat
207+
184208
for (type, type_descr) in ((Dependency, "dependency"), (BuildDependency, "builddependency"), (HostBuildDependency, "hostdependency"))
185209
JSON.lower(d::type) = Dict("type" => type_descr,
186210
"name" => d.pkg.name,
187211
"uuid" => string_or_nothing(d.pkg.uuid),
212+
"compat" => getcompat(d),
188213
"version-major" => major(version(d)),
189214
"version-minor" => minor(version(d)),
190215
"version-patch" => patch(version(d)))
@@ -196,19 +221,19 @@ end
196221
function dependencify(d::Dict)
197222
if d["type"] in ("dependency", "builddependency", "hostdependency")
198223
uuid = isnothing(d["uuid"]) ? d["uuid"] : UUID(d["uuid"])
224+
compat = d["compat"]
199225
version = VersionNumber(d["version-major"], d["version-minor"], d["version-patch"])
200226
version = version == v"0" ? nothing : version
201-
T = if d["type"] == "dependency"
202-
Dependency
227+
spec = PackageSpec(; name = d["name"], uuid = uuid, version = version)
228+
if d["type"] == "dependency"
229+
return Dependency(spec; compat = compat)
203230
elseif d["type"] == "builddependency"
204-
BuildDependency
231+
return BuildDependency(spec)
205232
elseif d["type"] == "hostdependency"
206-
HostBuildDependency
233+
return HostBuildDependency(spec)
207234
end
208-
return T(PackageSpec(; name = d["name"], uuid = uuid, version = version))
209-
else
210-
error("Cannot convert to dependency")
211235
end
236+
error("Cannot convert to dependency")
212237
end
213238

214239

test/dependencies.jl

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,24 @@ end
2626
@test getname(dep) == name
2727
@test getname(PackageSpec(; name = name)) == name
2828
@test getpkg(dep) == PackageSpec(; name = name)
29+
@test getcompat(dep) == ""
2930

3031
build_version = v"1.2.3"
3132
dep_buildver = Dependency(PackageSpec(; name = name), build_version)
3233
@test Dependency(name, build_version) == dep_buildver
3334
@test getname(dep_buildver) == name
3435
@test getpkg(dep_buildver) == PackageSpec(; name = name, version = build_version)
36+
@test getcompat(dep_buildver) == ""
37+
38+
# the same but with compat info
39+
dep_buildver = Dependency(PackageSpec(; name = name), build_version, compat = "~1.2")
40+
@test Dependency(name, build_version) == dep_buildver
41+
@test getname(dep_buildver) == name
42+
@test getpkg(dep_buildver) == PackageSpec(; name = name, version = build_version)
43+
@test getcompat(dep_buildver) == "~1.2"
44+
45+
# if build_version and compat don't match, an error should be thrown
46+
@test_throws ArgumentError Dependency(PackageSpec(; name = name), build_version, compat = "2.0")
3547

3648
build_name = "Foo_headers_jll"
3749
build_dep = BuildDependency(PackageSpec(; name = build_name))
@@ -57,25 +69,25 @@ end
5769

5870
@testset "JSON (de)serialization" begin
5971
jdep = JSON.lower(dep)
60-
@test jdep == Dict("type" => "dependency", "name" => name, "uuid" => nothing, "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
72+
@test jdep == Dict("type" => "dependency", "name" => name, "uuid" => nothing, "compat" => "", "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
6173
@test dependencify(jdep) == dep
6274

6375
jdep_buildver = JSON.lower(dep_buildver)
64-
@test jdep_buildver == Dict("type" => "dependency", "name" => name, "uuid" => nothing, "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
76+
@test jdep_buildver == Dict("type" => "dependency", "name" => name, "uuid" => nothing, "compat" => "~1.2", "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
6577
# the build_version is currently not serialized, so the following test fails
6678
@test_broken dependencify(jdep_buildver) == dep_buildver
6779

6880
jbuild_dep = JSON.lower(build_dep)
69-
@test jbuild_dep == Dict("type" => "builddependency", "name" => build_name, "uuid" => nothing, "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
81+
@test jbuild_dep == Dict("type" => "builddependency", "name" => build_name, "uuid" => nothing, "compat" => "", "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
7082
@test dependencify(jbuild_dep) == build_dep
7183

7284
jhost_dep = JSON.lower(host_dep)
73-
@test jhost_dep == Dict("type" => "hostdependency", "name" => host_name, "uuid" => nothing, "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
85+
@test jhost_dep == Dict("type" => "hostdependency", "name" => host_name, "uuid" => nothing, "compat" => "", "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0)
7486
@test dependencify(jhost_dep) == host_dep
7587

7688
full_dep = Dependency(PackageSpec(; name = "Baz_jll", uuid = "00000000-1111-2222-3333-444444444444", version = "3.1.4"))
7789
jfull_dep = JSON.lower(full_dep)
78-
@test jfull_dep == Dict("type" => "dependency", "name" => "Baz_jll", "uuid" => "00000000-1111-2222-3333-444444444444", "version-major" => 0x3, "version-minor" => 0x1, "version-patch" => 0x4)
90+
@test jfull_dep == Dict("type" => "dependency", "name" => "Baz_jll", "uuid" => "00000000-1111-2222-3333-444444444444", "compat" => "", "version-major" => 0x3, "version-minor" => 0x1, "version-patch" => 0x4)
7991
@test dependencify(jfull_dep) == full_dep
8092
@test_throws ErrorException dependencify(Dict("type" => "git"))
8193
end

0 commit comments

Comments
 (0)