{ libkernel, pkgs }: let mkKernel = { name, asmFile, linkerScript }: pkgs.stdenvNoCC.mkDerivation { pname = "${libkernel.pname}-${name}"; version = libkernel.version; inherit asmFile linkerScript; nativeBuildInputs = [ pkgs.stdenv.cc.bintools.bintools ]; dontUnpack = true; buildPhase = '' runHook preBuild riscv64-unknown-none-elf-as -g -march=rv64gc -mabi=lp64d -o asm.o \ $asmFile riscv64-unknown-none-elf-ld --gc-sections -T$linkerScript -o kernel.elf \ asm.o ${libkernel}/lib/libkernel.a runHook postBuild ''; installPhase = '' runHook preInstall install -Dt $out kernel.elf runHook postInstall ''; }; in pkgs.lib.recurseIntoAttrs { qemu-virt = pkgs.callPackage ./qemu-virt { inherit mkKernel; }; }