From 53b268ad4a513decaad91d69483ac48319ed54cb Mon Sep 17 00:00:00 2001 From: Rahul Butani Date: Wed, 3 May 2023 16:42:11 -0500 Subject: [PATCH 1/2] cc-wrapper: support `--` Fixes #228136. --- pkgs/build-support/cc-wrapper/cc-wrapper.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pkgs/build-support/cc-wrapper/cc-wrapper.sh b/pkgs/build-support/cc-wrapper/cc-wrapper.sh index e8eb579e15ad..5350fc3cc9ae 100644 --- a/pkgs/build-support/cc-wrapper/cc-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/cc-wrapper.sh @@ -33,6 +33,7 @@ cInclude=1 expandResponseParams "$@" linkType=$(checkLinkType "${params[@]}") +declare -ag positionalArgs=() declare -i n=0 nParams=${#params[@]} while (( "$n" < "$nParams" )); do @@ -54,6 +55,17 @@ while (( "$n" < "$nParams" )); do c++*) isCxx=1 ;; esac ;; + --) # Everything else is positional args! + # See: https://github.com/llvm/llvm-project/commit/ed1d07282cc9d8e4c25d585e03e5c8a1b6f63a74 + + # Any positional arg (i.e. any argument after `--`) will be + # interpreted as a "non flag" arg: + if [[ -v "params[$n]" ]]; then nonFlagArgs=1; fi + + positionalArgs=("${params[@]:$n}") + params=("${params[@]:0:$((n - 1))}") + break; + ;; -?*) ;; *) nonFlagArgs=1 ;; # Includes a solitary dash (`-`) which signifies standard input; it is not a flag esac @@ -207,6 +219,12 @@ if [ "$cc1" = 1 ]; then extraBefore=() fi +# Finally, if we got any positional args, append them to `extraAfter` +# now: +if [[ "${#positionalArgs[@]}" -gt 0 ]]; then + extraAfter+=(-- "${positionalArgs[@]}") +fi + # Optionally print debug info. if (( "${NIX_DEBUG:-0}" >= 1 )); then # Old bash workaround, see ld-wrapper for explanation. From 40c914f1be018545992a5b2e3182f3b940f907ce Mon Sep 17 00:00:00 2001 From: Rahul Butani Date: Wed, 3 May 2023 16:45:21 -0500 Subject: [PATCH 2/2] cc-wrapper-test: add tests for `--` --- pkgs/test/cc-wrapper/default.nix | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pkgs/test/cc-wrapper/default.nix b/pkgs/test/cc-wrapper/default.nix index 6fd7d9f45db8..43e8e7a21426 100644 --- a/pkgs/test/cc-wrapper/default.nix +++ b/pkgs/test/cc-wrapper/default.nix @@ -13,6 +13,8 @@ in stdenv.mkDerivation { name = "cc-wrapper-test"; buildCommand = '' + set -o pipefail + NIX_DEBUG=1 $CC -v NIX_DEBUG=1 $CXX -v @@ -43,6 +45,27 @@ in stdenv.mkDerivation { ''} ''} + ${# See: https://github.com/llvm/llvm-project/commit/ed1d07282cc9d8e4c25d585e03e5c8a1b6f63a74 + # `gcc` does not support this so we gate the test on `clang` + lib.optionalString stdenv.cc.isClang '' + printf "checking whether cc-wrapper accepts -- followed by positional (file) args..." >&2 + mkdir -p positional + + # Make sure `--` is not parsed as a "non flag arg"; we should get an + # input file error here and *not* a linker error. + { ! $CC --; } |& grep -q "no input files" + + # And that positional file args _must_ be files (this is just testing + # that we remembered to put the `--` back in the args to the compiler): + { ! $CC -c -- -o foo ${./foo.c}; } \ + |& grep -q "no such file or directory: '-o'" + + # Now check that we accept single and multiple positional file args: + $CC -c -DVALUE=42 -o positional/foo.o -- ${./foo.c} + $CC -o positional/main -- positional/foo.o ${./ldflags-main.c} + ${emulator} ./positional/main + ''} + printf "checking whether compiler uses NIX_CFLAGS_COMPILE... " >&2 mkdir -p foo/include cp ${./foo.c} foo/include/foo.h