summary refs log tree commit diff
path: root/pkgs/build-support
diff options
context:
space:
mode:
authorJanne Heß <janne@hess.ooo>2022-05-01 14:56:58 +0200
committerJanne Heß <janne@hess.ooo>2022-05-01 17:06:14 +0200
commite5995b22353d003cf2c3b32143ff996b14cbbb62 (patch)
tree225de1280d944dbb4104b77ced376e85b98b9308 /pkgs/build-support
parent5b47056b7d4ac1dcde998f9bac309a1875c670d5 (diff)
downloadnixpkgs-e5995b22353d003cf2c3b32143ff996b14cbbb62.tar
nixpkgs-e5995b22353d003cf2c3b32143ff996b14cbbb62.tar.gz
nixpkgs-e5995b22353d003cf2c3b32143ff996b14cbbb62.tar.bz2
nixpkgs-e5995b22353d003cf2c3b32143ff996b14cbbb62.tar.lz
nixpkgs-e5995b22353d003cf2c3b32143ff996b14cbbb62.tar.xz
nixpkgs-e5995b22353d003cf2c3b32143ff996b14cbbb62.tar.zst
nixpkgs-e5995b22353d003cf2c3b32143ff996b14cbbb62.zip
makeInitrdNG: Strip more and remove output
This strips all elf files as far as possible and removes a lot of
unnecessary output. Also wrap in the binaries instead of relying on
$PATH.
Diffstat (limited to 'pkgs/build-support')
-rw-r--r--pkgs/build-support/kernel/make-initrd-ng-tool.nix9
-rw-r--r--pkgs/build-support/kernel/make-initrd-ng.nix4
-rw-r--r--pkgs/build-support/kernel/make-initrd-ng/src/main.rs22
3 files changed, 25 insertions, 10 deletions
diff --git a/pkgs/build-support/kernel/make-initrd-ng-tool.nix b/pkgs/build-support/kernel/make-initrd-ng-tool.nix
index 66ffc09d43c..654b1036781 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 1890bbcd173..5f0a70f8a96 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 1342734590f..294c570a374 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<T> {
     queue: VecDeque<T>,
@@ -42,7 +42,6 @@ fn patch_elf<S: AsRef<OsStr>, P: AsRef<OsStr>>(mode: S, path: P) -> Result<Strin
     let output = Command::new("patchelf")
         .arg(&mode)
         .arg(&path)
-        .stderr(Stdio::inherit())
         .output()?;
     if output.status.success() {
         Ok(String::from_utf8(output.stdout).expect("Failed to parse output"))
@@ -51,16 +50,15 @@ fn patch_elf<S: AsRef<OsStr>, P: AsRef<OsStr>>(mode: S, path: P) -> Result<Strin
     }
 }
 
-fn copy_file<P: AsRef<Path> + AsRef<OsStr>, S: AsRef<Path>>(
+fn copy_file<P: AsRef<Path> + AsRef<OsStr>, S: AsRef<Path> + AsRef<OsStr>>(
     source: P,
     target: S,
     queue: &mut NonRepeatingQueue<Box<Path>>,
 ) -> 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<P: AsRef<Path> + AsRef<OsStr>, S: AsRef<Path>>(
         }
     }
 
+    // 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)?;
     }