builder: refactor into files.nix

This commit is contained in:
Astro 2022-04-28 00:42:02 +02:00
parent a8258eece3
commit 9ec872e36a
2 changed files with 113 additions and 116 deletions

View File

@ -27,122 +27,9 @@
}:
with pkgs;
let
fetchSums = url: sha256:
let
sumsFile = fetchurl {
url = "${url}/sha256sums";
inherit sha256;
};
filesSha256 =
builtins.foldl' (filesSha256: line:
let
m = builtins.match "([0-9a-f]+) \\*(.+)" line;
in
if builtins.isList m && builtins.length m == 2
then filesSha256 // {
${builtins.elemAt m 1} = builtins.elemAt m 0;
} else filesSha256
) {} (lib.splitString "\n" (builtins.readFile sumsFile));
in
builtins.mapAttrs (file: sha256:
fetchurl {
url = "${url}/${file}";
inherit sha256;
}
) filesSha256;
fetchPackages = url: packagesContent:
let
parsedPackages = map (section:
builtins.foldl' (data: line:
let
m = builtins.match "(.+): (.+)" line;
in
if builtins.isList m && builtins.length m == 2
then data // {
${builtins.elemAt m 0} = builtins.elemAt m 1;
} else data
) {} (lib.splitString "\n" section)
) (lib.splitString "\n\n" packagesContent);
in
builtins.foldl' (variantFiles: parsed:
if parsed ? Filename && parsed ? SHA256sum
then
variantFiles // {
${parsed.Filename} = fetchurl {
url = "${url}/${parsed.Filename}";
sha256 = parsed.SHA256sum;
};
}
else
variantFiles
) {} parsedPackages;
baseUrl = "https://downloads.openwrt.org/releases/${release}";
variantFiles = fetchSums "${baseUrl}/targets/${target}/${variant}" sha256;
variantPackages = runCommandNoCC "openwrt-${release}-${target}-${variant}-packages" {} ''
mkdir packages
${lib.concatMapStrings (file:
lib.optionalString (lib.hasPrefix "packages/" file) ''
ln -s ${variantFiles.${file}} ${file}
'') (builtins.attrNames variantFiles)}
mv packages $out
'';
feedsPackagesFile = builtins.mapAttrs (feed: sha256:
fetchurl {
url = "${baseUrl}/packages/${arch}/${feed}/Packages";
inherit sha256;
}
) feedsSha256;
feedsFiles = builtins.mapAttrs (feed: packagesFile:
fetchPackages "${baseUrl}/packages/${arch}/${feed}" (builtins.readFile packagesFile)
) feedsPackagesFile;
feedsPackages = builtins.mapAttrs (feed: files:
runCommandNoCC "openwrt-${release}-${arch}-${feed}-packages" {} ''
mkdir $out
ln -s ${feedsPackagesFile.${feed}} $out/Packages
${lib.concatMapStrings (file: ''
ln -s ${files.${file}} $out/${file}
'') (builtins.attrNames files)}
''
) feedsFiles;
openwrtConfigFile = stdenv.mkDerivation {
name = "openwrt-${release}-${target}-${variant}.config";
src = variantFiles."openwrt-imagebuilder-${release}-${target}-${variant}.${hostPlatform.uname.system}-${hostPlatform.uname.processor}.tar.xz";
phases = [ "unpackPhase" "installPhase" ];
installPhase = ''
cp .config $out
'';
};
openwrtConfig = builtins.foldl' (openwrtConfig: line:
let
m1 = builtins.match "(.+)=\"(.+)\"" line;
m2 = builtins.match "(.+)=(.+)" line;
in
if builtins.isList m1 && builtins.length m1 == 2
then openwrtConfig // {
${builtins.elemAt m1 0} = builtins.elemAt m1 1;
}
else if builtins.isList m2 && builtins.length m2 == 2
then openwrtConfig // {
${builtins.elemAt m2 0} = builtins.elemAt m2 1;
}
else openwrtConfig
) {} (
lib.splitString "\n" (builtins.readFile openwrtConfigFile)
);
arch = openwrtConfig.CONFIG_TARGET_ARCH_PACKAGES;
inherit (import ./files.nix {
inherit pkgs release target variant sha256 feedsSha256;
}) arch variantPackages variantFiles feedsPackages;
in
stdenv.mkDerivation {

110
files.nix Normal file
View File

@ -0,0 +1,110 @@
{ pkgs ? import <nixpkgs> {}
# OpenWRT release
, release ? "21.02.3"
# OpenWRT target
, target
, variant ? "generic"
# Checksum of the `sha256sums` file
, sha256
# Checksum of a feed's `Packages` file
, feedsSha256
}:
with pkgs;
let
fetchSums = url: sha256:
let
sumsFile = fetchurl {
url = "${url}/sha256sums";
inherit sha256;
};
filesSha256 =
builtins.foldl' (filesSha256: line:
let
m = builtins.match "([0-9a-f]+) \\*(.+)" line;
in
if builtins.isList m && builtins.length m == 2
then filesSha256 // {
${builtins.elemAt m 1} = builtins.elemAt m 0;
} else filesSha256
) {} (lib.splitString "\n" (builtins.readFile sumsFile));
in
builtins.mapAttrs (file: sha256:
fetchurl {
url = "${url}/${file}";
inherit sha256;
}
) filesSha256;
fetchPackages = url: packagesContent:
let
parsedPackages = map (section:
builtins.foldl' (data: line:
let
m = builtins.match "(.+): (.+)" line;
in
if builtins.isList m && builtins.length m == 2
then data // {
${builtins.elemAt m 0} = builtins.elemAt m 1;
} else data
) {} (lib.splitString "\n" section)
) (lib.splitString "\n\n" packagesContent);
in
builtins.foldl' (variantFiles: parsed:
if parsed ? Filename && parsed ? SHA256sum
then
variantFiles // {
${parsed.Filename} = fetchurl {
url = "${url}/${parsed.Filename}";
sha256 = parsed.SHA256sum;
};
}
else
variantFiles
) {} parsedPackages;
baseUrl = "https://downloads.openwrt.org/releases/${release}";
variantFiles = fetchSums "${baseUrl}/targets/${target}/${variant}" sha256;
variantPackages = runCommandNoCC "openwrt-${release}-${target}-${variant}-packages" {} ''
mkdir packages
${lib.concatMapStrings (file:
lib.optionalString (lib.hasPrefix "packages/" file) ''
ln -s ${variantFiles.${file}} ${file}
'') (builtins.attrNames variantFiles)}
mv packages $out
'';
feedsPackagesFile = builtins.mapAttrs (feed: sha256:
fetchurl {
url = "${baseUrl}/packages/${arch}/${feed}/Packages";
inherit sha256;
}
) feedsSha256;
feedsFiles = builtins.mapAttrs (feed: packagesFile:
fetchPackages "${baseUrl}/packages/${arch}/${feed}" (builtins.readFile packagesFile)
) feedsPackagesFile;
feedsPackages = builtins.mapAttrs (feed: files:
runCommandNoCC "openwrt-${release}-${arch}-${feed}-packages" {} ''
mkdir $out
ln -s ${feedsPackagesFile.${feed}} $out/Packages
${lib.concatMapStrings (file: ''
ln -s ${files.${file}} $out/${file}
'') (builtins.attrNames files)}
''
) feedsFiles;
arch = (builtins.fromJSON (
builtins.readFile (
variantFiles."profiles.json"
)
)).arch_packages;
in {
inherit variantFiles variantPackages feedsFiles feedsPackages;
}