{ lib, stdenv, stdenvNoCC, dtc, writers, python3, }: { # Compile single Device Tree overlay source # file (.dts) into its compiled variant (.dtb) compileDTS = ( { name, dtsFile, includePaths ? [ ], extraPreprocessorFlags ? [ ], }: stdenv.mkDerivation { inherit name; nativeBuildInputs = [ dtc ]; buildCommand = let includeFlagsStr = lib.concatMapStringsSep " " (includePath: "-I${includePath}") includePaths; extraPreprocessorFlagsStr = lib.concatStringsSep " " extraPreprocessorFlags; in '' $CC -E -nostdinc ${includeFlagsStr} -undef -D__DTS__ -x assembler-with-cpp ${extraPreprocessorFlagsStr} ${dtsFile} | \ dtc -I dts -O dtb -@ -o $out ''; } ); applyOverlays = ( base: overlays': stdenvNoCC.mkDerivation { name = "device-tree-overlays"; nativeBuildInputs = [ (python3.pythonOnBuildForHost.withPackages (ps: [ ps.libfdt ])) ]; buildCommand = '' python ${./apply_overlays.py} --source ${base} --destination $out --overlays ${writers.writeJSON "overlays.json" overlays'} ''; } ); }