Skip to content

Commit c9c95b3

Browse files
authored
[Dependencies] Allow using top_level with RuntimeDependency (#279)
Also, deprecate `top_level` with `Dependency`.
1 parent 582443d commit c9c95b3

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

src/Dependencies.jl

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Return whether `dep` is a runtime dependency or not.
6565
is_runtime_dependency
6666

6767
"""
68-
is_top_level_dependency(dep::AbstractDependency) ->
68+
is_top_level_dependency(dep::AbstractDependency) -> Bool
6969
7070
Return wheter `dep` is a top-level dependency or not.
7171
"""
@@ -128,6 +128,7 @@ struct Dependency <: AbstractDependency
128128
end
129129
end
130130
if top_level
131+
@warn("Dependency(\"$(getname(pkg))\") was defined as top-level but this is deprecated, use `RuntimeDependency` instead")
131132
if !(isempty(platforms) || all(p->p==AnyPlatform(), platforms))
132133
throw(ArgumentError("A top-level dependency can't be restricted to platforms."))
133134
end
@@ -147,7 +148,7 @@ is_runtime_dependency(::Dependency) = true
147148
is_top_level_dependency(dep::Dependency) = dep.top_level
148149

149150
"""
150-
RuntimeDependency(dep::Union{PackageSpec,String}; compat::String, platforms::Vector{<:AbstractPlatform})
151+
RuntimeDependency(dep::Union{PackageSpec,String}; compat::String, platforms::Vector{<:AbstractPlatform}, top_level::Bool=false)
151152
152153
Define a binary dependency that is only listed as dependency of the generated JLL package,
153154
but its artifact is not installed in the prefix during the build. The `dep` argument can be
@@ -159,27 +160,40 @@ in the `Project.toml` of the generated Julia package.
159160
The optional keyword argument `platforms` is a vector of `AbstractPlatform`s which indicates
160161
for which platforms the dependency should be used. By default `platforms=[AnyPlatform()]`,
161162
to mean that the dependency is compatible with all platforms.
163+
164+
The optional keyword argument `top_level` specifies whether the dependency should be use
165+
only at the top-level of the generated JLL package, instead of inside each platform-specific
166+
wrapper. Using `top_level=true` is useful for packages needed for platform augmentation
167+
(e.g. `MPIPreferences.jl`).
162168
"""
163169
struct RuntimeDependency <: AbstractDependency
164170
pkg::PkgSpec
165171
compat::String # semver string for use in Project.toml of the JLL
166172
platforms::Vector{<:AbstractPlatform}
173+
top_level::Bool
167174
function RuntimeDependency(pkg::PkgSpec; compat::String = "",
168-
platforms::Vector{<:AbstractPlatform}=[AnyPlatform()])
175+
platforms::Vector{<:AbstractPlatform}=[AnyPlatform()],
176+
top_level::Bool=false)
169177
if !isempty(compat)
170178
spec = PKG_VERSIONS.semver_spec(compat) # verify compat is valid
171179
if pkg.version != PKG_VERSIONS.VersionSpec("*") && !(pkg.version in spec)
172180
throw(ArgumentError("PackageSpec version and compat for $(pkg) are incompatible"))
173181
end
174182
end
175-
return new(pkg, compat, platforms)
183+
if top_level
184+
if !(isempty(platforms) || all(==(AnyPlatform()), platforms))
185+
throw(ArgumentError("A top-level dependency can't be restricted to platforms."))
186+
end
187+
end
188+
return new(pkg, compat, platforms, top_level)
176189
end
177190
end
178-
RuntimeDependency(name::AbstractString; compat::String = "", platforms::Vector{<:AbstractPlatform}=[AnyPlatform()]) =
179-
RuntimeDependency(PackageSpec(; name); compat, platforms)
191+
RuntimeDependency(name::AbstractString; compat::String = "", platforms::Vector{<:AbstractPlatform}=[AnyPlatform()], top_level::Bool=false) =
192+
RuntimeDependency(PackageSpec(; name); compat, platforms, top_level)
180193
is_host_dependency(::RuntimeDependency) = false
181194
is_build_dependency(::RuntimeDependency) = false
182195
is_runtime_dependency(::RuntimeDependency) = true
196+
is_top_level_dependency(dep::RuntimeDependency) = dep.top_level
183197
# In some cases we may want to automatically convert a `RuntimeDependency` to a `Dependency`
184198
Base.convert(::Type{Dependency}, dep::RuntimeDependency) =
185199
Dependency(dep.pkg; compat=dep.compat, platforms=dep.platforms)
@@ -355,7 +369,7 @@ function dependencify(d::Dict)
355369
if d["type"] == "dependency"
356370
return Dependency(spec; compat, platforms, top_level)
357371
elseif d["type"] == "runtimedependency"
358-
return RuntimeDependency(spec; compat, platforms)
372+
return RuntimeDependency(spec; compat, platforms, top_level)
359373
elseif d["type"] == "builddependency"
360374
return BuildDependency(spec; platforms)
361375
elseif d["type"] == "hostdependency"

test/dependencies.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,12 @@ end
9696
@test getpkg(host_dep) == PackageSpec(; name = host_name)
9797

9898
top_level_name = "MPIPreferences"
99-
@test_throws ArgumentError Dependency(PackageSpec(; name = top_level_name); platforms=supported_platforms(; experimental=true, exclude=!Sys.isapple),
100-
top_level=true)
99+
@test_logs (:warn, r"deprecated") @test_throws ArgumentError Dependency(PackageSpec(; name=top_level_name); platforms=supported_platforms(; exclude=!Sys.isapple), top_level=true)
100+
@test_throws ArgumentError RuntimeDependency(PackageSpec(; name=top_level_name); platforms=supported_platforms(; exclude=!Sys.isapple), top_level=true)
101101

102-
top_level_dep = Dependency(PackageSpec(; name = top_level_name); top_level=true)
102+
top_level_dep = @test_logs (:warn, r"deprecated") Dependency(PackageSpec(; name = top_level_name); top_level=true)
103+
@test is_top_level_dependency(top_level_dep)
104+
top_level_dep = RuntimeDependency(PackageSpec(; name = top_level_name); top_level=true)
103105
@test is_top_level_dependency(top_level_dep)
104106

105107
@testset "Filter dependencies by platform" begin
@@ -136,7 +138,7 @@ end
136138
@test_throws ErrorException dependencify(Dict("type" => "git"))
137139

138140
jtop_level_dep = JSON.lower(top_level_dep)
139-
@test jtop_level_dep == Dict("type" => "dependency", "name" => "MPIPreferences", "uuid" => nothing, "compat" => "", "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0, "platforms" => ["any"], "top_level" => true)
141+
@test jtop_level_dep == Dict("type" => "runtimedependency", "name" => "MPIPreferences", "uuid" => nothing, "compat" => "", "version-major" => 0x0, "version-minor" => 0x0, "version-patch" => 0x0, "platforms" => ["any"], "top_level" => true)
140142
@test dependencify(jtop_level_dep) == top_level_dep
141143
end
142144

0 commit comments

Comments
 (0)