diff --git a/pkgs/development/tools/mold/default.nix b/pkgs/development/tools/mold/default.nix index 4ba0bfdd2a7c8..84a7509c528c3 100644 --- a/pkgs/development/tools/mold/default.nix +++ b/pkgs/development/tools/mold/default.nix @@ -9,6 +9,11 @@ , testers , mold , nix-update-script +, runCommandCC +, mold-wrapped +, hello +, buildPackages +, useMoldLinker }: stdenv.mkDerivation rec { @@ -44,11 +49,51 @@ stdenv.mkDerivation rec { passthru = { updateScript = nix-update-script { }; - tests.version = testers.testVersion { package = mold; }; + tests = + let + helloTest = name: helloMold: + let + command = "$READELF -p .comment ${lib.getExe helloMold}"; + emulator = stdenv.hostPlatform.emulator buildPackages; + in + runCommandCC "mold-${name}-test" { passthru = { inherit helloMold; }; } + '' + echo "Testing running the 'hello' binary which should be linked with 'mold'" >&2 + ${emulator} ${lib.getExe helloMold} + + echo "Checking for mold in the '.comment' section" >&2 + if output=$(${command} 2>&1); then + if grep -Fw -- "mold" - <<< "$output"; then + touch $out + else + echo "No mention of 'mold' detected in the '.comment' section" >&2 + echo "The command was:" >&2 + echo "${command}" >&2 + echo "The output was:" >&2 + echo "$output" >&2 + exit 1 + fi + else + echo -n "${command}" >&2 + echo " returned a non-zero exit code." >&2 + echo "$output" >&2 + exit 1 + fi + '' + ; + in + { + version = testers.testVersion { package = mold; }; + wrapped = helloTest "wrapped" (hello.overrideAttrs (previousAttrs: { + nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ mold-wrapped ]; + NIX_CFLAGS_LINK = toString (previousAttrs.NIX_CFLAGS_LINK or "") + " -fuse-ld=mold"; + })); + adapter = helloTest "adapter" (hello.override (old: { stdenv = useMoldLinker old.stdenv; })); + }; }; meta = with lib; { - description = "A faster drop-in replacement for existing Unix linkers"; + description = "A faster drop-in replacement for existing Unix linkers (unwrapped)"; longDescription = '' mold is a faster drop-in replacement for existing Unix linkers. It is several times faster than the LLVM lld linker. mold is designed to diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix index f29bdf671c8c6..9b4ee16a003d1 100644 --- a/pkgs/stdenv/adapters.nix +++ b/pkgs/stdenv/adapters.nix @@ -192,8 +192,8 @@ rec { useMoldLinker = stdenv: let bintools = stdenv.cc.bintools.override { extraBuildCommands = '' - wrap ld.mold ${../build-support/bintools-wrapper/ld-wrapper.sh} ${pkgs.mold}/bin/ld.mold - wrap ld ${../build-support/bintools-wrapper/ld-wrapper.sh} ${pkgs.mold}/bin/ld.mold + wrap ${stdenv.cc.bintools.targetPrefix}ld.mold ${../build-support/bintools-wrapper/ld-wrapper.sh} ${pkgs.mold}/bin/ld.mold + wrap ${stdenv.cc.bintools.targetPrefix}ld ${../build-support/bintools-wrapper/ld-wrapper.sh} ${pkgs.mold}/bin/ld.mold ''; }; in stdenv.override (old: { diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 8cedede61ecbb..a0f111bcf7e3c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -19649,6 +19649,14 @@ with pkgs; mold = callPackage ../development/tools/mold { }; + mold-wrapped = wrapBintoolsWith { + bintools = mold; + extraBuildCommands = '' + wrap ${targetPackages.stdenv.cc.bintools.targetPrefix}ld.mold ${../build-support/bintools-wrapper/ld-wrapper.sh} ${mold}/bin/ld.mold + wrap ${targetPackages.stdenv.cc.bintools.targetPrefix}mold ${../build-support/bintools-wrapper/ld-wrapper.sh} ${mold}/bin/mold + ''; + }; + mommy = callPackage ../tools/misc/mommy { }; moon = callPackage ../development/tools/build-managers/moon/default.nix { };