mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-25 08:23:09 +00:00
109 lines
3.1 KiB
Nix
109 lines
3.1 KiB
Nix
{
|
|
writeShellScript,
|
|
runtimeShell,
|
|
nix,
|
|
lib,
|
|
substituteAll,
|
|
nuget-to-nix,
|
|
cacert,
|
|
fetchNupkg,
|
|
callPackage,
|
|
}:
|
|
|
|
{
|
|
nugetDeps,
|
|
overrideFetchAttrs ? x: { },
|
|
}:
|
|
fnOrAttrs: finalAttrs:
|
|
let
|
|
attrs = if builtins.isFunction fnOrAttrs then fnOrAttrs finalAttrs else fnOrAttrs;
|
|
|
|
deps =
|
|
if (nugetDeps != null) then
|
|
if lib.isDerivation nugetDeps then
|
|
[ nugetDeps ]
|
|
else if lib.isList nugetDeps then
|
|
nugetDeps
|
|
else
|
|
assert (lib.isPath nugetDeps);
|
|
callPackage nugetDeps { fetchNuGet = fetchNupkg; }
|
|
else
|
|
[ ];
|
|
|
|
finalPackage = finalAttrs.finalPackage;
|
|
|
|
in
|
|
attrs
|
|
// {
|
|
buildInputs = attrs.buildInputs or [ ] ++ deps;
|
|
|
|
passthru =
|
|
attrs.passthru or { }
|
|
// {
|
|
nugetDeps = deps;
|
|
}
|
|
// lib.optionalAttrs (nugetDeps == null || lib.isPath nugetDeps) rec {
|
|
fetch-drv =
|
|
let
|
|
pkg' = finalPackage.overrideAttrs (old: {
|
|
buildInputs = attrs.buildInputs or [ ];
|
|
nativeBuildInputs = old.nativeBuildInputs or [ ] ++ [ cacert ];
|
|
keepNugetConfig = true;
|
|
dontBuild = true;
|
|
doCheck = false;
|
|
dontInstall = true;
|
|
doInstallCheck = false;
|
|
dontFixup = true;
|
|
doDist = false;
|
|
});
|
|
in
|
|
pkg'.overrideAttrs overrideFetchAttrs;
|
|
fetch-deps =
|
|
let
|
|
drv = builtins.unsafeDiscardOutputDependency fetch-drv.drvPath;
|
|
|
|
innerScript = substituteAll {
|
|
src = ./fetch-deps.sh;
|
|
isExecutable = true;
|
|
inherit cacert;
|
|
nugetToNix = nuget-to-nix;
|
|
};
|
|
|
|
defaultDepsFile =
|
|
# Wire in the depsFile such that running the script with no args
|
|
# runs it agains the correct deps file by default.
|
|
# Note that toString is necessary here as it results in the path at
|
|
# eval time (i.e. to the file in your local Nixpkgs checkout) rather
|
|
# than the Nix store path of the path after it's been imported.
|
|
if lib.isPath nugetDeps && !lib.isStorePath nugetDeps then
|
|
toString nugetDeps
|
|
else
|
|
''$(mktemp -t "${finalAttrs.pname or finalPackage.name}-deps-XXXXXX.nix")'';
|
|
|
|
in
|
|
writeShellScript "${finalPackage.name}-fetch-deps" ''
|
|
set -eu
|
|
|
|
echo 'fetching dependencies for' ${lib.escapeShellArg finalPackage.name} >&2
|
|
|
|
# this needs to be before TMPDIR is changed, so the output isn't deleted
|
|
# if it uses mktemp
|
|
depsFile=$(realpath "''${1:-${lib.escapeShellArg defaultDepsFile}}")
|
|
|
|
export TMPDIR
|
|
TMPDIR=$(mktemp -d -t fetch-deps-${lib.escapeShellArg finalPackage.name}.XXXXXX)
|
|
trap 'chmod -R +w "$TMPDIR" && rm -fr "$TMPDIR"' EXIT
|
|
|
|
export NUGET_HTTP_CACHE_PATH=''${NUGET_HTTP_CACHE_PATH-~/.local/share/NuGet/v3-cache}
|
|
|
|
HOME=$TMPDIR/home
|
|
mkdir "$HOME"
|
|
|
|
cd "$TMPDIR"
|
|
|
|
NIX_BUILD_SHELL=${lib.escapeShellArg runtimeShell} ${nix}/bin/nix-shell \
|
|
--pure --keep NUGET_HTTP_CACHE_PATH --run 'source '${lib.escapeShellArg innerScript}' '"''${depsFile@Q}" "${drv}"
|
|
'';
|
|
};
|
|
}
|