mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-01-16 18:03:59 +00:00
3b40e1bd33
Without this, it's impossible to override the lockFile as the default overrideAttrs is applied after the composition in buildNimPackage has read the lock file and generated the nim flags from it.
136 lines
3.9 KiB
Nix
136 lines
3.9 KiB
Nix
{ lib
|
|
, buildPackages
|
|
, callPackage
|
|
, stdenv
|
|
, nim1
|
|
, nim2
|
|
, nim_builder
|
|
, defaultNimVersion ? 2
|
|
, nimOverrides
|
|
, buildNimPackage
|
|
}:
|
|
|
|
let
|
|
baseAttrs = {
|
|
strictDeps = true;
|
|
enableParallelBuilding = true;
|
|
doCheck = true;
|
|
configurePhase = ''
|
|
runHook preConfigure
|
|
export NIX_NIM_BUILD_INPUTS=''${pkgsHostTarget[@]} $NIX_NIM_BUILD_INPUTS
|
|
nim_builder --phase:configure
|
|
runHook postConfigure
|
|
'';
|
|
buildPhase = ''
|
|
runHook preBuild
|
|
nim_builder --phase:build
|
|
runHook postBuild
|
|
'';
|
|
checkPhase = ''
|
|
runHook preCheck
|
|
nim_builder --phase:check
|
|
runHook postCheck
|
|
'';
|
|
installPhase = ''
|
|
runHook preInstall
|
|
nim_builder --phase:install
|
|
runHook postInstall
|
|
'';
|
|
meta = { inherit (nim2.meta) maintainers platforms; };
|
|
};
|
|
|
|
fodFromLockEntry =
|
|
let
|
|
methods = {
|
|
fetchzip = { url, sha256, ... }:
|
|
buildPackages.fetchzip {
|
|
name = "source";
|
|
inherit url sha256;
|
|
};
|
|
git = { fetchSubmodules, leaveDotGit, rev, sha256, url, ... }:
|
|
buildPackages.fetchgit {
|
|
inherit fetchSubmodules leaveDotGit rev sha256 url;
|
|
};
|
|
};
|
|
in
|
|
attrs@{ method, ... }:
|
|
let fod = methods.${method} attrs;
|
|
in ''--path:"${fod.outPath}/${attrs.srcDir}"'';
|
|
|
|
callAnnotations = { packages, ... }@lockAttrs:
|
|
map (packageName: nimOverrides.${packageName} or (_: [ ]) lockAttrs)
|
|
packages;
|
|
|
|
asFunc = x: if builtins.isFunction x then x else (_: x);
|
|
|
|
in
|
|
buildNimPackageArgs:
|
|
let
|
|
composition = finalAttrs:
|
|
let
|
|
postPkg = baseAttrs
|
|
// (asFunc ((asFunc buildNimPackageArgs) finalAttrs)) baseAttrs;
|
|
|
|
lockAttrs =
|
|
lib.attrsets.optionalAttrs (builtins.hasAttr "lockFile" postPkg)
|
|
(builtins.fromJSON (builtins.readFile postPkg.lockFile));
|
|
|
|
lockDepends = lockAttrs.depends or [ ];
|
|
|
|
lockFileNimFlags = map fodFromLockEntry lockDepends;
|
|
|
|
annotationOverlays = lib.lists.flatten (map callAnnotations lockDepends);
|
|
|
|
postLock = builtins.foldl'
|
|
(prevAttrs: overlay: prevAttrs // (overlay finalAttrs prevAttrs))
|
|
postPkg
|
|
annotationOverlays;
|
|
|
|
finalOverride =
|
|
{ depsBuildBuild ? [ ]
|
|
, nativeBuildInputs ? [ ]
|
|
, nimFlags ? [ ]
|
|
, requiredNimVersion ? defaultNimVersion
|
|
, passthru ? { }
|
|
, ...
|
|
}:
|
|
(if requiredNimVersion == 1 then {
|
|
depsBuildBuild = [ nim_builder ] ++ depsBuildBuild;
|
|
nativeBuildInputs = [ nim1 ] ++ nativeBuildInputs;
|
|
} else if requiredNimVersion == 2 then {
|
|
depsBuildBuild = [ nim_builder ] ++ depsBuildBuild;
|
|
nativeBuildInputs = [ nim2 ] ++ nativeBuildInputs;
|
|
} else
|
|
throw
|
|
"requiredNimVersion ${toString requiredNimVersion} is not valid") // {
|
|
nimFlags = lockFileNimFlags ++ nimFlags;
|
|
passthru = passthru // {
|
|
# allow overriding the result of buildNimPackageArgs before this composition is applied
|
|
# this allows overriding the lockFile for packages built using buildNimPackage
|
|
# this is adapted from mkDerivationExtensible in stdenv.mkDerivation
|
|
overrideNimAttrs = f0:
|
|
let
|
|
f = self: super:
|
|
let x = f0 super;
|
|
in
|
|
if builtins.isFunction x
|
|
then f0 self super
|
|
else x;
|
|
in
|
|
buildNimPackage
|
|
(self:
|
|
let super = (asFunc ((asFunc buildNimPackageArgs) self)) baseAttrs;
|
|
in
|
|
super // (if builtins.isFunction f0 || f0?__functor then f self super else f0));
|
|
};
|
|
};
|
|
|
|
attrs = postLock // finalOverride postLock;
|
|
in
|
|
lib.trivial.warnIf (builtins.hasAttr "nimBinOnly" attrs)
|
|
"the nimBinOnly attribute is deprecated for buildNimPackage"
|
|
attrs;
|
|
|
|
in
|
|
stdenv.mkDerivation composition
|