36bf6afd42
Be able to build arbitrary Julia environments in Nixpkgs, in the same style as python.withPackages.
63 lines
2.7 KiB
Julia
Executable file
63 lines
2.7 KiB
Julia
Executable file
|
|
import Base: UUID
|
|
import Pkg.Artifacts: artifact_meta, artifact_names, find_artifacts_toml, load_artifacts_toml, select_downloadable_artifacts
|
|
import Pkg.BinaryPlatforms: AbstractPlatform, platform_key_abi, triplet
|
|
import Pkg.Operations: gen_build_code
|
|
import TOML
|
|
|
|
pkg_uuid = UUID(ARGS[1])
|
|
dir = ARGS[2]
|
|
|
|
artifacts_toml = find_artifacts_toml(dir)
|
|
|
|
if artifacts_toml == nothing
|
|
print("")
|
|
exit()
|
|
end
|
|
|
|
platform = platform_key_abi()
|
|
|
|
# Using collect_artifacts (from Pkg.jl) is more reliable than calling select_downloadable_artifacts directly.
|
|
# collect_artifacts includes support for .pkg/select_artifacts.jl, which may produce different results.
|
|
# If we use select_downloadable_artifacts here, then at depot build time it may try to download a different artifact
|
|
# and fail.
|
|
|
|
# However! The collect_artifacts from Pkg.jl doesn't allow us to pass lazy to select_downloadable_artifacts.
|
|
# So we have to paste our own version in here :(
|
|
|
|
function collect_artifacts(pkg_root::String; platform::AbstractPlatform)
|
|
# Check to see if this package has an (Julia)Artifacts.toml
|
|
artifacts_tomls = Tuple{String,Base.TOML.TOMLDict}[]
|
|
for f in artifact_names
|
|
artifacts_toml = joinpath(pkg_root, f)
|
|
if isfile(artifacts_toml)
|
|
selector_path = joinpath(pkg_root, ".pkg", "select_artifacts.jl")
|
|
|
|
# If there is a dynamic artifact selector, run that in an appropriate sandbox to select artifacts
|
|
if isfile(selector_path)
|
|
# Despite the fact that we inherit the project, since the in-memory manifest
|
|
# has not been updated yet, if we try to load any dependencies, it may fail.
|
|
# Therefore, this project inheritance is really only for Preferences, not dependencies.
|
|
select_cmd = Cmd(`$(gen_build_code(selector_path; inherit_project=true)) --startup-file=no $(triplet(platform))`)
|
|
meta_toml = String(read(select_cmd))
|
|
res = TOML.tryparse(meta_toml)
|
|
if res isa TOML.ParserError
|
|
errstr = sprint(showerror, res; context=stderr)
|
|
pkgerror("failed to parse TOML output from running $(repr(selector_path)), got: \n$errstr")
|
|
else
|
|
push!(artifacts_tomls, (artifacts_toml, TOML.parse(meta_toml)))
|
|
end
|
|
else
|
|
# Otherwise, use the standard selector from `Artifacts`
|
|
artifacts = select_downloadable_artifacts(artifacts_toml; platform, include_lazy=true)
|
|
push!(artifacts_tomls, (artifacts_toml, artifacts))
|
|
end
|
|
break
|
|
end
|
|
end
|
|
return artifacts_tomls
|
|
end
|
|
|
|
for (artifacts_toml, artifacts) in collect_artifacts(dir; platform)
|
|
TOML.print(artifacts)
|
|
end
|