diff --git a/pkgs/build-support/kernel/make-initrd-ng-tool.nix b/pkgs/build-support/kernel/make-initrd-ng-tool.nix index 66ffc09d43cf..654b10367812 100644 --- a/pkgs/build-support/kernel/make-initrd-ng-tool.nix +++ b/pkgs/build-support/kernel/make-initrd-ng-tool.nix @@ -1,4 +1,4 @@ -{ rustPlatform }: +{ rustPlatform, lib, makeWrapper, patchelf, glibc, binutils }: rustPlatform.buildRustPackage { pname = "make-initrd-ng"; @@ -6,4 +6,11 @@ rustPlatform.buildRustPackage { src = ./make-initrd-ng; cargoLock.lockFile = ./make-initrd-ng/Cargo.lock; + + nativeBuildInputs = [ makeWrapper ]; + + postInstall = '' + wrapProgram $out/bin/make-initrd-ng \ + --prefix PATH : ${lib.makeBinPath [ patchelf glibc binutils ]} + ''; } diff --git a/pkgs/build-support/kernel/make-initrd-ng.nix b/pkgs/build-support/kernel/make-initrd-ng.nix index 1890bbcd173a..5f0a70f8a969 100644 --- a/pkgs/build-support/kernel/make-initrd-ng.nix +++ b/pkgs/build-support/kernel/make-initrd-ng.nix @@ -8,7 +8,7 @@ let # compression type and filename extension. compressorName = fullCommand: builtins.elemAt (builtins.match "([^ ]*/)?([^ ]+).*" fullCommand) 1; in -{ stdenvNoCC, perl, cpio, ubootTools, lib, pkgsBuildHost, makeInitrdNGTool, patchelf, runCommand, glibc +{ stdenvNoCC, perl, cpio, ubootTools, lib, pkgsBuildHost, makeInitrdNGTool, patchelf, runCommand # Name of the derivation (not of the resulting file!) , name ? "initrd" @@ -72,7 +72,7 @@ in passAsFile = ["contents"]; contents = lib.concatMapStringsSep "\n" ({ object, symlink, ... }: "${object}\n${if symlink == null then "" else symlink}") contents + "\n"; - nativeBuildInputs = [makeInitrdNGTool patchelf glibc cpio] ++ lib.optional makeUInitrd ubootTools; + nativeBuildInputs = [makeInitrdNGTool patchelf cpio] ++ lib.optional makeUInitrd ubootTools; } '' mkdir ./root make-initrd-ng "$contentsPath" ./root diff --git a/pkgs/build-support/kernel/make-initrd-ng/src/main.rs b/pkgs/build-support/kernel/make-initrd-ng/src/main.rs index 1342734590f7..294c570a3741 100644 --- a/pkgs/build-support/kernel/make-initrd-ng/src/main.rs +++ b/pkgs/build-support/kernel/make-initrd-ng/src/main.rs @@ -6,7 +6,7 @@ use std::hash::Hash; use std::io::{BufReader, BufRead, Error, ErrorKind}; use std::os::unix; use std::path::{Component, Path, PathBuf}; -use std::process::{Command, Stdio}; +use std::process::Command; struct NonRepeatingQueue { queue: VecDeque, @@ -42,7 +42,6 @@ fn patch_elf, P: AsRef>(mode: S, path: P) -> Result, P: AsRef>(mode: S, path: P) -> Result + AsRef, S: AsRef>( +fn copy_file + AsRef, S: AsRef + AsRef>( source: P, target: S, queue: &mut NonRepeatingQueue>, ) -> Result<(), Error> { - fs::copy(&source, target)?; + fs::copy(&source, &target)?; if !Command::new("ldd").arg(&source).output()?.status.success() { - //stdout(Stdio::inherit()).stderr(Stdio::inherit()). - println!("{:?} is not dynamically linked. Not recursing.", OsStr::new(&source)); + // Not dynamically linked - no need to recurse return Ok(()); } @@ -91,6 +89,17 @@ fn copy_file + AsRef, S: AsRef>( } } + // Make file writable to strip it + let mut permissions = fs::metadata(&target)?.permissions(); + permissions.set_readonly(false); + fs::set_permissions(&target, permissions)?; + + // Strip further than normal + if !Command::new("strip").arg("--strip-all").arg(OsStr::new(&target)).output()?.status.success() { + println!("{:?} was not successfully stripped.", OsStr::new(&target)); + } + + Ok(()) } @@ -200,7 +209,6 @@ fn main() -> Result<(), Error> { } } while let Some(obj) = queue.pop_front() { - println!("{:?}", obj); handle_path(out_path, &*obj, &mut queue)?; }