Luke Granger-Brown
57725ef3ec
git-subtree-dir: third_party/nixpkgs git-subtree-split: 76612b17c0ce71689921ca12d9ffdc9c23ce40b2
123 lines
4.1 KiB
Nix
123 lines
4.1 KiB
Nix
{
|
|
version,
|
|
lib,
|
|
writeText,
|
|
}:
|
|
|
|
{
|
|
inherit version;
|
|
|
|
mkBsdArch =
|
|
stdenv':
|
|
{
|
|
x86_64 = "amd64";
|
|
aarch64 = "aarch64";
|
|
i486 = "i386";
|
|
i586 = "i386";
|
|
i686 = "i386";
|
|
armv6l = "armv6";
|
|
armv7l = "armv7";
|
|
powerpc = "powerpc";
|
|
powerpc64 = "powerpc64";
|
|
powerpc64le = "powerpc64le";
|
|
riscv64 = "riscv64";
|
|
}
|
|
.${stdenv'.hostPlatform.parsed.cpu.name} or stdenv'.hostPlatform.parsed.cpu.name;
|
|
|
|
mkBsdCpuArch =
|
|
stdenv':
|
|
{
|
|
x86_64 = "amd64";
|
|
aarch64 = "aarch64";
|
|
i486 = "i386";
|
|
i586 = "i386";
|
|
i686 = "i386";
|
|
armv6l = "arm";
|
|
armv7l = "arm";
|
|
powerpc = "powerpc";
|
|
powerpc64 = "powerpc";
|
|
powerpc64le = "powerpc";
|
|
riscv64 = "riscv";
|
|
}
|
|
.${stdenv'.hostPlatform.parsed.cpu.name} or stdenv'.hostPlatform.parsed.cpu.name;
|
|
|
|
mkBsdMachine =
|
|
stdenv':
|
|
{
|
|
x86_64 = "amd64";
|
|
aarch64 = "arm64";
|
|
i486 = "i386";
|
|
i586 = "i386";
|
|
i686 = "i386";
|
|
armv6l = "arm";
|
|
armv7l = "arm";
|
|
powerpc = "powerpc";
|
|
powerpc64 = "powerpc";
|
|
powerpc64le = "powerpc";
|
|
riscv64 = "riscv";
|
|
}
|
|
.${stdenv'.hostPlatform.parsed.cpu.name} or stdenv'.hostPlatform.parsed.cpu.name;
|
|
|
|
install-wrapper = builtins.readFile ../../lib/install-wrapper.sh;
|
|
|
|
# this function takes a list of patches and a list of paths and returns a list of derivations,
|
|
# one per file that is patched, containing the actual patch contents. This allows us to have
|
|
# extract only the patches that are relevant for a given subset of the source tree.
|
|
# note: the "list of patches" input can be a directory containing patch files, a path or a list of valid inputs to this argument, recursively.
|
|
filterPatches =
|
|
patches: paths:
|
|
let
|
|
isDir =
|
|
file:
|
|
let
|
|
base = baseNameOf file;
|
|
type = (builtins.readDir (dirOf file)).${base} or null;
|
|
in
|
|
file == /. || type == "directory";
|
|
consolidatePatches =
|
|
patches:
|
|
if (lib.isDerivation patches) then
|
|
[ patches ]
|
|
else if (builtins.isPath patches) then
|
|
(if (isDir patches) then (lib.filesystem.listFilesRecursive patches) else [ patches ])
|
|
else if (builtins.isList patches) then
|
|
(lib.flatten (builtins.map consolidatePatches patches))
|
|
else
|
|
throw "Bad patches - must be path or derivation or list thereof";
|
|
consolidated = consolidatePatches patches;
|
|
splitPatch =
|
|
patchFile:
|
|
let
|
|
allLines' = lib.strings.splitString "\n" (builtins.readFile patchFile);
|
|
allLines = builtins.filter (
|
|
line: !((lib.strings.hasPrefix "diff --git" line) || (lib.strings.hasPrefix "index " line))
|
|
) allLines';
|
|
foldFunc =
|
|
a: b:
|
|
if ((lib.strings.hasPrefix "--- " b) || (lib.strings.hasPrefix "diff --git " b)) then
|
|
(a ++ [ [ b ] ])
|
|
else
|
|
((lib.lists.init a) ++ (lib.lists.singleton ((lib.lists.last a) ++ [ b ])));
|
|
partitionedPatches' = lib.lists.foldl foldFunc [ [ ] ] allLines;
|
|
partitionedPatches =
|
|
if (builtins.length partitionedPatches' > 1) then
|
|
(lib.lists.drop 1 partitionedPatches')
|
|
else
|
|
(throw "${patchFile} does not seem to be a unified patch (diff -u). this is required for FreeBSD.");
|
|
filterFunc =
|
|
patchLines:
|
|
let
|
|
prefixedPath = builtins.elemAt (builtins.split " |\t" (builtins.elemAt patchLines 1)) 2;
|
|
unfixedPath = lib.path.subpath.join (lib.lists.drop 1 (lib.path.subpath.components prefixedPath));
|
|
in
|
|
lib.lists.any (included: lib.path.hasPrefix (/. + ("/" + included)) (/. + ("/" + unfixedPath))) (
|
|
paths
|
|
);
|
|
filteredLines = builtins.filter filterFunc partitionedPatches;
|
|
derive = patchLines: writeText "freebsd-patch" (lib.concatLines patchLines);
|
|
derivedPatches = builtins.map derive filteredLines;
|
|
in
|
|
derivedPatches;
|
|
in
|
|
lib.lists.concatMap splitPatch consolidated;
|
|
}
|