Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at netboot-syslinux-multiplatform 43 lines 1.4 kB view raw
1{ lib, stdenvNoCC, dtc }: 2 3with lib; { 4 applyOverlays = (base: overlays': stdenvNoCC.mkDerivation { 5 name = "device-tree-overlays"; 6 nativeBuildInputs = [ dtc ]; 7 buildCommand = let 8 overlays = toList overlays'; 9 in '' 10 mkdir -p $out 11 cd "${base}" 12 find . -type f -name '*.dtb' -print0 \ 13 | xargs -0 cp -v --no-preserve=mode --target-directory "$out" --parents 14 15 for dtb in $(find "$out" -type f -name '*.dtb'); do 16 dtbCompat=$(fdtget -t s "$dtb" / compatible 2>/dev/null || true) 17 # skip files without `compatible` string 18 test -z "$dtbCompat" && continue 19 20 ${flip (concatMapStringsSep "\n") overlays (o: '' 21 overlayCompat="$(fdtget -t s "${o.dtboFile}" / compatible)" 22 23 # skip incompatible and non-matching overlays 24 if [[ ! "$dtbCompat" =~ "$overlayCompat" ]]; then 25 echo "Skipping overlay ${o.name}: incompatible with $(basename "$dtb")" 26 elif ${if (o.filter == null) then "false" else '' 27 [[ "''${dtb//${o.filter}/}" == "$dtb" ]] 28 ''} 29 then 30 echo "Skipping overlay ${o.name}: filter does not match $(basename "$dtb")" 31 else 32 echo -n "Applying overlay ${o.name} to $(basename "$dtb")... " 33 mv "$dtb"{,.in} 34 fdtoverlay -o "$dtb" -i "$dtb.in" "${o.dtboFile}" 35 echo "ok" 36 rm "$dtb.in" 37 fi 38 '')} 39 40 done 41 ''; 42 }); 43}