nix-openwrt-imagebuilder/builder.nix

139 lines
3.8 KiB
Nix

{ pkgs ? import <nixpkgs> {}
# OpenWRT release
, release ? "21.02.3"
# OpenWRT target
, target
# Hardware model
, profile
, variant ? "generic"
# Checksum of the `sha256sums` file
, sha256 ?
(
import ./hashes/${release}.nix
).${target}.${variant}.sha256
# Checksum of a feed's `Packages` file
, feedsSha256 ?
(
import ./hashes/${release}.nix
).${target}.${variant}.feedsSha256
# Manually specify packages' arch for OpenWRT<19 releases without profiles.json
, packagesArch ? null
# Extra OpenWRT packages (can be prefixed with "-")
, packages ? []
# Directory of extra files to include
, files ? null
# Attrset of files to include
, extraFiles ? { }
# Which services in /etc/init.d/ should be disabled
, disabledServices ? []
# Add to output name
, extraImageName ? "nix"
}:
with pkgs;
let
inherit (import ./files.nix {
inherit pkgs release target variant sha256 feedsSha256 packagesArch;
}) arch variantFiles profiles expandDeps corePackages packagesByFeed allPackages;
requiredPackages = (
profiles.default_packages or (
builtins.attrNames packagesByFeed.base
++ builtins.attrNames corePackages
)
++ profiles.profiles.${profile}.device_packages or []
++ packages
);
allRequiredPackages = expandDeps allPackages requiredPackages;
in
stdenv.mkDerivation {
name = lib.concatStringsSep "-" ([
"openwrt" release
] ++
lib.optional (extraImageName != null) extraImageName ++
[ target variant profile ]);
src = variantFiles."openwrt-imagebuilder-${release}-${target}-${variant}.${hostPlatform.uname.system}-${hostPlatform.uname.processor}.tar.xz";
postPatch = ''
patchShebangs scripts staging_dir/host/bin
substituteInPlace rules.mk \
--replace "SHELL:=/usr/bin/env bash" "SHELL:=${runtimeShell}"
grep -r usr/bin/env
'';
configurePhase =
let
installPackages = writeScript "install-openwrt-packages" (
lib.concatMapStrings (pname:
let
package = allPackages.${pname};
in
lib.optionalString
(package.type == "real")
"[ -e packages/${package.filename} ] || ln -s ${package.file} packages/${package.filename}\n"
) allRequiredPackages
);
in ''
${installPackages}
echo "src imagebuilder file:packages" > repositories.conf
'';
nativeBuildInputs =
[
zlib unzip bzip2
ncurses which rsync git file getopt wget
bash perl python3
] ++
lib.optional (!lib.versionAtLeast release "21") python2;
buildPhase = ''
${lib.optionalString (!lib.versionAtLeast release "19") ''
# Hack around broken check for gcc
touch staging_dir/host/.prereq-build
''}
${lib.optionalString (files != null)
# copy files to avoid making etc read-only
"cp -r --no-preserve=all ${files} files"
}
${lib.strings.concatStringsSep "\n" (
lib.attrsets.mapAttrsToList (
path: { source, text }: ''
mkdir -p $(dirname ./files/${path})
${
if text != null then ''
cat << NIX_EOF > ./files/${path}
${text}
NIX_EOF
'' else "cat < ${source} > ./files/${path}"}
''
) extraFiles)
}
make image SHELL=${runtimeShell} \
PROFILE="${profile}" \
PACKAGES="${lib.concatStringsSep " " packages}" \
${lib.optionalString (files != null || extraFiles != { })
''FILES=./files''
} \
DISABLED_SERVICES="${lib.concatStringsSep " " disabledServices}" \
EXTRA_IMAGE_NAME="${extraImageName}"
'';
installPhase = ''
mkdir -p $out/nix-support
pushd bin/targets/${target}/${variant}
for src in *; do
dst="$out/$src"
cp -ar "$src" "$dst"
if [ -f "$dst" ]; then
filename=$(basename "$dst")
echo "file ''${filename##*.} $dst" >> $out/nix-support/hydra-build-products
fi
done
popd
'';
dontFixup = true;
}