redistribution.nix (2099B)
1 { pkgs, host, source, nixpkgsSource, flakeUtilsSource, systemsSource }: 2 let 3 # Match linker inputs and installed ELF owners across the native closure. 4 native = [ pkgs.gmpxx pkgs.libffi pkgs.elfutils pkgs.numactl pkgs.zlib 5 pkgs.zstd pkgs.xz pkgs.bzip2 pkgs.stdenv.cc.cc pkgs.glibc ]; 6 components = [ host.compiler ] ++ host.haskellLibraries ++ native; 7 describe = p: let 8 clean = value: if builtins.isString value then 9 builtins.replaceStrings (map builtins.placeholder p.outputs) 10 (map (name: "@OUTPUT_${name}@") p.outputs) value 11 else if builtins.isList value then map clean value else value; 12 in { 13 name = p.name; 14 version = p.version or "unknown"; 15 roots = pkgs.lib.unique (map toString ([ p ] ++ map (name: p.${name}) 16 (builtins.filter (name: builtins.elem name p.outputs) [ "out" "lib" "libgcc" "dev" ]))); 17 source = toString p.src; 18 patches = map toString (p.patches or []); 19 cabalRevision = if p ? editedCabalFile && p.editedCabalFile != null 20 then toString p.editedCabalFile else null; 21 licenseMetadata = p.meta.license or []; 22 homepage = p.meta.homepage or ""; 23 recipe = { 24 inherit (p) name; 25 configureFlags = clean (p.configureFlags or []); 26 prePatch = clean (p.prePatch or ""); 27 postPatch = clean (p.postPatch or ""); 28 preConfigure = clean (p.preConfigure or ""); 29 postConfigure = clean (p.postConfigure or ""); 30 }; 31 }; 32 metadata = pkgs.writeText "tricu-redistribution-inputs.json" (builtins.toJSON (map describe components)); 33 in pkgs.runCommand "tricu-redistribution-materials" { 34 nativeBuildInputs = [ pkgs.python3 pkgs.glibc.bin ]; 35 meta.platforms = [ "x86_64-linux" ]; 36 } '' 37 mkdir tools 38 cp ${./redistribution.py} tools/redistribution.py 39 cp ${./portable.py} tools/portable.py 40 python3 tools/redistribution.py --components ${metadata} \ 41 --host ${host} --link-evidence ${host.linkEvidence} \ 42 --source ${source} --nixpkgs ${nixpkgsSource} \ 43 --flake-utils ${flakeUtilsSource} --systems ${systemsSource} \ 44 --policy ${./redistribution-policy.json} --output $out 45 ''