aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/pkgs/os-specific/linux/device-tree/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/os-specific/linux/device-tree/default.nix')
-rw-r--r--nixpkgs/pkgs/os-specific/linux/device-tree/default.nix27
1 files changed, 21 insertions, 6 deletions
diff --git a/nixpkgs/pkgs/os-specific/linux/device-tree/default.nix b/nixpkgs/pkgs/os-specific/linux/device-tree/default.nix
index 13d819a08a5..0599289ab72 100644
--- a/nixpkgs/pkgs/os-specific/linux/device-tree/default.nix
+++ b/nixpkgs/pkgs/os-specific/linux/device-tree/default.nix
@@ -1,16 +1,31 @@
{ stdenvNoCC, dtc, findutils }:
with stdenvNoCC.lib; {
- applyOverlays = (base: overlays: stdenvNoCC.mkDerivation {
+ applyOverlays = (base: overlays': stdenvNoCC.mkDerivation {
name = "device-tree-overlays";
nativeBuildInputs = [ dtc findutils ];
buildCommand = let
- quotedDtbos = concatMapStringsSep " " (o: "\"${toString o}\"") (toList overlays);
+ overlays = toList overlays';
in ''
- for dtb in $(find ${base} -name "*.dtb" ); do
- outDtb=$out/$(realpath --relative-to "${base}" "$dtb")
- mkdir -p "$(dirname "$outDtb")"
- fdtoverlay -o "$outDtb" -i "$dtb" ${quotedDtbos};
+ mkdir -p $out
+ cd ${base}
+ find . -type f -name '*.dtb' -print0 \
+ | xargs -0 cp -v --no-preserve=mode --target-directory $out --parents
+
+ for dtb in $(find $out -type f -name '*.dtb'); do
+ dtbCompat="$( fdtget -t s $dtb / compatible )"
+
+ ${flip (concatMapStringsSep "\n") overlays (o: ''
+ overlayCompat="$( fdtget -t s ${o.dtboFile} / compatible )"
+ # overlayCompat in dtbCompat
+ if [[ "$dtbCompat" =~ "$overlayCompat" ]]; then
+ echo "Applying overlay ${o.name} to $( basename $dtb )"
+ mv $dtb{,.in}
+ fdtoverlay -o "$dtb" -i "$dtb.in" ${o.dtboFile};
+ rm $dtb.in
+ fi
+ '')}
+
done
'';
});