1{ 2 lib, 3 buildPackages, 4 callPackage, 5 stdenv, 6 nim1, 7 nim2, 8 nim_builder, 9 defaultNimVersion ? 2, 10 nimOverrides, 11 buildNimPackage, 12}: 13 14let 15 baseAttrs = { 16 strictDeps = true; 17 enableParallelBuilding = true; 18 doCheck = true; 19 configurePhase = '' 20 runHook preConfigure 21 export NIX_NIM_BUILD_INPUTS=''${pkgsHostTarget[@]} $NIX_NIM_BUILD_INPUTS 22 nim_builder --phase:configure 23 runHook postConfigure 24 ''; 25 buildPhase = '' 26 runHook preBuild 27 nim_builder --phase:build 28 runHook postBuild 29 ''; 30 checkPhase = '' 31 runHook preCheck 32 nim_builder --phase:check 33 runHook postCheck 34 ''; 35 installPhase = '' 36 runHook preInstall 37 nim_builder --phase:install 38 runHook postInstall 39 ''; 40 meta = { inherit (nim2.meta) maintainers platforms; }; 41 }; 42 43 fodFromLockEntry = 44 let 45 methods = { 46 fetchzip = 47 { url, sha256, ... }: 48 buildPackages.fetchzip { 49 name = "source"; 50 inherit url sha256; 51 }; 52 git = 53 { 54 fetchSubmodules, 55 leaveDotGit, 56 rev, 57 sha256, 58 url, 59 ... 60 }: 61 buildPackages.fetchgit { 62 inherit 63 fetchSubmodules 64 leaveDotGit 65 rev 66 sha256 67 url 68 ; 69 }; 70 }; 71 in 72 attrs@{ method, ... }: 73 let 74 fod = methods.${method} attrs; 75 in 76 ''--path:"${fod.outPath}/${attrs.srcDir}"''; 77 78 asFunc = x: if builtins.isFunction x then x else (_: x); 79 80in 81buildNimPackageArgs: 82let 83 composition = 84 finalAttrs: 85 let 86 postPkg = baseAttrs // (asFunc ((asFunc buildNimPackageArgs) finalAttrs)) baseAttrs; 87 88 lockAttrs = lib.attrsets.optionalAttrs (builtins.hasAttr "lockFile" postPkg) ( 89 builtins.fromJSON (builtins.readFile postPkg.lockFile) 90 ); 91 92 lockDepends = lockAttrs.depends or [ ]; 93 94 lockFileNimFlags = map fodFromLockEntry lockDepends; 95 96 postNimOverrides = builtins.foldl' ( 97 prevAttrs: 98 { packages, ... }@lockAttrs: 99 builtins.foldl' ( 100 prevAttrs: name: 101 if (builtins.hasAttr name nimOverrides) then 102 (prevAttrs // (nimOverrides.${name} lockAttrs prevAttrs)) 103 else 104 prevAttrs 105 ) prevAttrs packages 106 ) postPkg lockDepends; 107 108 finalOverride = 109 { 110 depsBuildBuild ? [ ], 111 nativeBuildInputs ? [ ], 112 nimFlags ? [ ], 113 requiredNimVersion ? defaultNimVersion, 114 passthru ? { }, 115 ... 116 }: 117 ( 118 if requiredNimVersion == 1 then 119 { 120 depsBuildBuild = [ nim_builder ] ++ depsBuildBuild; 121 nativeBuildInputs = [ nim1 ] ++ nativeBuildInputs; 122 } 123 else if requiredNimVersion == 2 then 124 { 125 depsBuildBuild = [ nim_builder ] ++ depsBuildBuild; 126 nativeBuildInputs = [ nim2 ] ++ nativeBuildInputs; 127 } 128 else 129 throw "requiredNimVersion ${toString requiredNimVersion} is not valid" 130 ) 131 // { 132 nimFlags = lockFileNimFlags ++ nimFlags; 133 passthru = passthru // { 134 # allow overriding the result of buildNimPackageArgs before this composition is applied 135 # this allows overriding the lockFile for packages built using buildNimPackage 136 # this is adapted from mkDerivationExtensible in stdenv.mkDerivation 137 overrideNimAttrs = 138 f0: 139 let 140 f = 141 self: super: 142 let 143 x = f0 super; 144 in 145 if builtins.isFunction x then f0 self super else x; 146 in 147 buildNimPackage ( 148 self: 149 let 150 super = (asFunc ((asFunc buildNimPackageArgs) self)) baseAttrs; 151 in 152 super // (if builtins.isFunction f0 || f0 ? __functor then f self super else f0) 153 ); 154 }; 155 }; 156 157 attrs = postNimOverrides // finalOverride postNimOverrides; 158 in 159 lib.trivial.warnIf (builtins.hasAttr "nimBinOnly" attrs) 160 "the nimBinOnly attribute is deprecated for buildNimPackage" 161 attrs; 162 163in 164stdenv.mkDerivation composition