at 23.05-pre 45 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 -n "Skipping overlay ${o.name}: incompatible with $(basename "$dtb")" 26 continue 27 fi 28 ${optionalString (o.filter != null) '' 29 if [[ "''${dtb//${o.filter}/}" == "$dtb" ]]; then 30 echo -n "Skipping overlay ${o.name}: filter does not match $(basename "$dtb")" 31 continue 32 fi 33 ''} 34 35 echo -n "Applying overlay ${o.name} to $(basename "$dtb")... " 36 mv "$dtb"{,.in} 37 fdtoverlay -o "$dtb" -i "$dtb.in" "${o.dtboFile}" 38 echo "ok" 39 rm "$dtb.in" 40 '')} 41 42 done 43 ''; 44 }); 45}