From 3217bf4fd38ce1091f32b3c2c05780f84fed3dc9 Mon Sep 17 00:00:00 2001 From: SebastianPaucar Date: Sat, 27 Jun 2026 11:27:09 -0600 Subject: [PATCH 1/8] -ffile-prefix-map==. injection in compiler-wrapper (cc.sh). tests added in test/run.sh (test_debug_prefix_map) Signed-off-by: SebastianPaucar --- cc.sh | 9 +++++++++ test/run.sh | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/cc.sh b/cc.sh index 5e28812..01bb1db 100755 --- a/cc.sh +++ b/cc.sh @@ -797,6 +797,15 @@ elif [ "$SPACK_ADD_DEBUG_FLAGS" = "custom" ]; then extend flags_list SPACK_DEBUG_FLAGS fi +# -ffile-prefix-map==. injection for build reproducibility +case "$mode" in + cpp|as|cc|ccld) + if [ -n "${SPACK_DEBUG_PREFIX_MAP:-}" ]; then + append flags_list "-ffile-prefix-map=${SPACK_DEBUG_PREFIX_MAP}=." + fi + ;; +esac + spack_flags_list="" # Fortran flags come before CPPFLAGS diff --git a/test/run.sh b/test/run.sh index bb9c2ac..a55386f 100755 --- a/test/run.sh +++ b/test/run.sh @@ -197,7 +197,7 @@ SPACK_COMPILER_EXTRA_RPATHS SPACK_COMPILER_IMPLICIT_RPATHS SPACK_CC_HAS_FRANDOM_SEED SPACK_CXX_HAS_FRANDOM_SEED SPACK_FC_HAS_FRANDOM_SEED SPACK_F77_HAS_FRANDOM_SEED SPACK_CCACHE_BINARY SPACK_TEST_COMMAND SPACK_ADD_DEBUG_FLAGS SPACK_DEBUG_FLAGS -SPACK_DEBUG +SPACK_DEBUG SPACK_DEBUG_PREFIX_MAP ' wrapper_environment() { @@ -1479,6 +1479,52 @@ test_x_hip_vcheck() { --version' /bin/myhipcxx } +# --------------------------------------------------------------------------- +# SPACK_DEBUG_PREFIX_MAP injection +# --------------------------------------------------------------------------- + +test_debug_prefix_map() { + wrapper_environment + + # When SPACK_DEBUG_PREFIX_MAP is unset, -ffile-prefix-map must NOT appear. + unset SPACK_DEBUG_PREFIX_MAP + _out=$(dump_args cc '') + expect_not_contains debug_prefix_map_absent "$_out" \ + '-ffile-prefix-map=/some/stage/path=.' + + # When set, -ffile-prefix-map==. must appear for C. + SPACK_DEBUG_PREFIX_MAP='/some/stage/path' + export SPACK_DEBUG_PREFIX_MAP + _out=$(dump_args cc '') + expect_contains debug_prefix_map_cc "$_out" \ + '-ffile-prefix-map=/some/stage/path=.' + + # Must appear for C++ wrapper too. + _out=$(dump_args c++ '') + expect_contains debug_prefix_map_cxx "$_out" \ + '-ffile-prefix-map=/some/stage/path=.' + + # Must appear for Fortran wrapper too. + _out=$(dump_args fc '') + expect_contains debug_prefix_map_fc "$_out" \ + '-ffile-prefix-map=/some/stage/path=.' + + # Must NOT appear in vcheck mode + _out=$(dump_args cc '--version') + expect_not_contains debug_prefix_map_vcheck "$_out" \ + '-ffile-prefix-map=/some/stage/path=.' + + # Must NOT appear in ld mode + SPACK_DEBUG_PREFIX_MAP='/some/stage/path' + export SPACK_DEBUG_PREFIX_MAP + _out=$(dump_args ld '') + expect_not_contains debug_prefix_map_ld "$_out" \ + '-ffile-prefix-map=/some/stage/path=.' + + unset SPACK_DEBUG_PREFIX_MAP + +} + # --------------------------------------------------------------------------- # Runner # --------------------------------------------------------------------------- @@ -1537,6 +1583,7 @@ test_cpp_stays_cpp_with_x test_x_is_not_a_language_for_ld test_hip_always_flags test_x_hip_vcheck +test_debug_prefix_map ' all_tests="$wrapper_tests $list_ops_tests" From fd89d78b9386b1b49235cda523b97e768dfcfea7 Mon Sep 17 00:00:00 2001 From: SebastianPaucar Date: Sat, 11 Jul 2026 15:27:49 -0600 Subject: [PATCH 2/8] unconditional -ffile-prefix-map==. injection with fixed expected-args ordering (all tests pass successfully) Signed-off-by: SebastianPaucar --- cc.sh | 7 ++- test/run.sh | 157 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 113 insertions(+), 51 deletions(-) diff --git a/cc.sh b/cc.sh index 01bb1db..fe47abd 100755 --- a/cc.sh +++ b/cc.sh @@ -229,6 +229,8 @@ _msg="Error: the compiler wrapper must be invoked from Spack" : "${SPACK_SHORT_SPEC:?$_msg}" : "${SPACK_SYSTEM_DIRS:?$_msg}" : "${SPACK_MANAGED_DIRS:?$_msg}" +: "${SPACK_PREFIX_MAP:?$_msg}" +: "${SPACK_BUILD_PREFIX_MAP:?$_msg}" unset _msg # eval this because SPACK_MANAGED_DIRS and SPACK_SYSTEM_DIRS are inputs we don't wanna loop over. @@ -800,8 +802,9 @@ fi # -ffile-prefix-map==. injection for build reproducibility case "$mode" in cpp|as|cc|ccld) - if [ -n "${SPACK_DEBUG_PREFIX_MAP:-}" ]; then - append flags_list "-ffile-prefix-map=${SPACK_DEBUG_PREFIX_MAP}=." + append flags_list "-ffile-prefix-map=${SPACK_PREFIX_MAP}=." + if [ "$SPACK_BUILD_PREFIX_MAP" != "$SPACK_PREFIX_MAP" ]; then + append flags_list "-ffile-prefix-map=${SPACK_BUILD_PREFIX_MAP}=." fi ;; esac diff --git a/test/run.sh b/test/run.sh index a55386f..3b28f0c 100755 --- a/test/run.sh +++ b/test/run.sh @@ -197,7 +197,7 @@ SPACK_COMPILER_EXTRA_RPATHS SPACK_COMPILER_IMPLICIT_RPATHS SPACK_CC_HAS_FRANDOM_SEED SPACK_CXX_HAS_FRANDOM_SEED SPACK_FC_HAS_FRANDOM_SEED SPACK_F77_HAS_FRANDOM_SEED SPACK_CCACHE_BINARY SPACK_TEST_COMMAND SPACK_ADD_DEBUG_FLAGS SPACK_DEBUG_FLAGS -SPACK_DEBUG SPACK_DEBUG_PREFIX_MAP +SPACK_DEBUG ' wrapper_environment() { @@ -207,6 +207,8 @@ wrapper_environment() { SPACK_F77=$REAL_CC SPACK_HIPCXX=$REAL_CC SPACK_PREFIX=/spack-test-prefix + SPACK_PREFIX_MAP=/spack-test-stage/spack-src + SPACK_BUILD_PREFIX_MAP=/spack-test-stage/spack-build-abc1234 # shellcheck disable=SC2209 # literal string "test", not the command SPACK_COMPILER_WRAPPER_PATH=test SPACK_DEBUG_LOG_DIR=. @@ -234,6 +236,7 @@ wrapper_environment() { # shellcheck disable=SC2090 export SPACK_CC SPACK_CXX SPACK_FC SPACK_F77 SPACK_HIPCXX SPACK_PREFIX \ + SPACK_PREFIX_MAP SPACK_BUILD_PREFIX_MAP \ SPACK_COMPILER_WRAPPER_PATH SPACK_DEBUG_LOG_DIR SPACK_DEBUG_LOG_ID \ SPACK_SHORT_SPEC SPACK_SYSTEM_DIRS SPACK_MANAGED_DIRS \ SPACK_CC_RPATH_ARG SPACK_CXX_RPATH_ARG SPACK_F77_RPATH_ARG SPACK_FC_RPATH_ARG \ @@ -395,7 +398,14 @@ HEADERPAD='-headerpad_max_install_names' DISABLE_NEW_DTAGS_WL='-Wl,--disable-new-dtags' DISABLE_NEW_DTAGS='--disable-new-dtags' +PREFIX_MAP_FLAGS=$(cat <<'EOF' +-ffile-prefix-map=/spack-test-stage/spack-src=. +-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=. +EOF +) + COMMON_COMPILE_ARGS=$(concat \ + "$PREFIX_MAP_FLAGS" \ "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" \ "$DISABLE_NEW_DTAGS_WL" \ @@ -522,7 +532,7 @@ foo -rpath EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' foo.o bar.o baz.o @@ -544,7 +554,7 @@ foo -Wl,-rpath EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' foo.o bar.o baz.o @@ -561,7 +571,7 @@ EOF -Wl,/c EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -Wl,-rpath,/a -Wl,-rpath,/b -Wl,-rpath,/c @@ -575,12 +585,12 @@ EOF -Wl,--rpath= EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "-Wl,-rpath,/a") + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "-Wl,-rpath,/a") expect_args Wl_parsing_missing cc "$_args" "$_exp" # Wl_parsing_NAG_is_ignored _args='-Wl,-Wl,,x,,y,,z' - _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$DISABLE_NEW_DTAGS_WL" "-Wl,-Wl,,x,,y,,z") + _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "-Wl,-Wl,,x,,y,,z") expect_args Wl_parsing_NAG fc "$_args" "$_exp" # Xlinker_parsing @@ -597,7 +607,7 @@ EOF -Xlinker EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -Wl,-rpath,/a -Wl,-rpath,/b -O3 @@ -615,7 +625,7 @@ EOF -g EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -O3 -g -Wl,-rpath @@ -631,7 +641,7 @@ EOF -g EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -O3 -g -Xlinker @@ -646,14 +656,14 @@ EOF # dep_include SPACK_INCLUDE_DIRS=x; export SPACK_INCLUDE_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" "-Ix" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Ix" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args dep_include cc "$TEST_ARGS" "$_exp" SPACK_INCLUDE_DIRS=''; export SPACK_INCLUDE_DIRS # dep_lib SPACK_LINK_DIRS=x; SPACK_RPATH_DIRS=x; export SPACK_LINK_DIRS SPACK_RPATH_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "-Lx" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "-Wl,-rpath,x" "$TEST_ARGS_NO_PATHS") expect_args dep_lib cc "$TEST_ARGS" "$_exp" @@ -661,7 +671,7 @@ EOF # dep_lib_no_rpath SPACK_LINK_DIRS=x; export SPACK_LINK_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "-Lx" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args dep_lib_no_rpath cc "$TEST_ARGS" "$_exp" @@ -669,7 +679,7 @@ EOF # dep_lib_no_lib SPACK_RPATH_DIRS=x; export SPACK_RPATH_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "-Wl,-rpath,x" "$TEST_ARGS_NO_PATHS") expect_args dep_lib_no_lib cc "$TEST_ARGS" "$_exp" @@ -681,7 +691,7 @@ EOF SPACK_LINK_DIRS=xlib:ylib:zlib export SPACK_INCLUDE_DIRS SPACK_RPATH_DIRS SPACK_LINK_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-Ixinc\n-Iyinc\n-Izinc')" \ "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ @@ -694,7 +704,7 @@ EOF _args="$TEST_ARGS -isystem fooinc" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-isystem\nfooinc\n-isystem\nxinc\n-isystem\nyinc\n-isystem\nzinc')" \ "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ @@ -706,7 +716,7 @@ fooinc" # cc_deps (-c => mode=cc, no -L/rpath from deps) _args="-c $TEST_ARGS" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-Ixinc\n-Iyinc\n-Izinc')" \ "$TEST_LIBRARY_PATHS" "-c" "$TEST_ARGS_NO_PATHS") expect_args cc_deps cc "$_args" "$_exp" @@ -722,7 +732,7 @@ EOF ) _args="$_sys $TEST_ARGS" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-Ixinc\n-Iyinc\n-Izinc')" \ "$(printf -- '-I/usr/include\n-I/usr/local/include')" \ "$TEST_LIBRARY_PATHS" \ @@ -747,7 +757,7 @@ EOF ) _args="$_sys $TEST_ARGS" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-isystem\nxinc\n-isystem\nyinc\n-isystem\nzinc')" \ "$(printf -- '-isystem\n/usr/include\n-isystem\n/usr/local/include')" \ "$TEST_LIBRARY_PATHS" \ @@ -796,33 +806,33 @@ test_expected_args_with_flags() { expect_args ld_flags ld "$TEST_ARGS" "$_exp" # cpp_flags - _exp=$(concat "cpp" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "cpp" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES") expect_args cpp_flags cpp "$TEST_ARGS" "$_exp" # cc_flags - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" "$SPACK_CFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") expect_args cc_flags cc "$TEST_ARGS" "$_exp" # cxx_flags (note: -Werror is filtered by SPACK_COMPILER_FLAGS_REPLACE) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") expect_args cxx_flags c++ "$TEST_ARGS" "$_exp" # fc_flags - _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_FFLAGS_LINES" "$SPACK_CPPFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") expect_args fc_flags fc "$TEST_ARGS" "$_exp" # hip_flags (no target args; CPPFLAGS + HIPFLAGS applied; CFLAGS/CXXFLAGS absent) - _exp=$(concat "$REAL_CC" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" "$SPACK_HIPFLAGS_LINES" \ '-Wl,--gc-sections' "$SPACK_LDLIBS_LINES") @@ -891,7 +901,9 @@ test_ccache_prepend_for_cc() { expect_args ccache_prepend_linux cc "$TEST_ARGS" "$_exp" SPACK_SHORT_SPEC='foo@1.2=darwin-x86_64'; export SPACK_SHORT_SPEC - _exp=$(concat "ccache" "$REAL_CC" "$TARGET_ARGS" "$LHEADERPAD" "$COMMON_COMPILE_ARGS") + _exp=$(concat "ccache" "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$LHEADERPAD" \ + "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ + "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args ccache_prepend_darwin cc "$TEST_ARGS" "$_exp" } @@ -903,7 +915,9 @@ test_no_ccache_prepend_for_fc() { expect_args no_ccache_fc_linux fc "$TEST_ARGS" "$_exp" SPACK_SHORT_SPEC='foo@1.2=darwin-x86_64'; export SPACK_SHORT_SPEC - _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$LHEADERPAD" "$COMMON_COMPILE_ARGS") + _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$LHEADERPAD" \ + "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ + "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args no_ccache_fc_darwin fc "$TEST_ARGS" "$_exp" } @@ -1456,7 +1470,7 @@ test_hip_always_flags() { # applied on the compile line ... expect_args hip_always_compile spackhip '-c -foo.hip' "$(concat "$REAL_CC" -c foo.hip -always1 -always2)" +foo.hip' "$(concat "$REAL_CC" "$PREFIX_MAP_FLAGS" -c foo.hip -always1 -always2)" # ... and on version checks, like every other language _args='-v @@ -1480,49 +1494,91 @@ test_x_hip_vcheck() { } # --------------------------------------------------------------------------- -# SPACK_DEBUG_PREFIX_MAP injection +# SPACK_PREFIX_MAP / SPACK_BUILD_PREFIX_MAP injection # --------------------------------------------------------------------------- -test_debug_prefix_map() { +test_prefix_map_required() { wrapper_environment + unset SPACK_PREFIX_MAP + _out=$("$WRAPPER_DIR/cc" -c hello.c 2>&1) + _rc=$? + if [ "$_rc" -eq 0 ]; then + fail "prefix_map_required: expected non-zero exit when unset, got 0" + fi + case "$_out" in + *"compiler wrapper must be invoked from Spack"*) ;; + *) fail "prefix_map_required: expected mandatory-var error in: $_out" ;; + esac +} - # When SPACK_DEBUG_PREFIX_MAP is unset, -ffile-prefix-map must NOT appear. - unset SPACK_DEBUG_PREFIX_MAP - _out=$(dump_args cc '') - expect_not_contains debug_prefix_map_absent "$_out" \ - '-ffile-prefix-map=/some/stage/path=.' +test_build_prefix_map_required() { + wrapper_environment + unset SPACK_BUILD_PREFIX_MAP + _out=$("$WRAPPER_DIR/cc" -c hello.c 2>&1) + _rc=$? + if [ "$_rc" -eq 0 ]; then + fail "build_prefix_map_required: expected non-zero exit when unset, got 0" + fi + case "$_out" in + *"compiler wrapper must be invoked from Spack"*) ;; + *) fail "build_prefix_map_required: expected mandatory-var error in: $_out" ;; + esac +} - # When set, -ffile-prefix-map==. must appear for C. - SPACK_DEBUG_PREFIX_MAP='/some/stage/path' - export SPACK_DEBUG_PREFIX_MAP +test_prefix_map_injected() { + wrapper_environment + # wrapper_environment sets: + # SPACK_PREFIX_MAP=/spack-test-stage/spack-src + # SPACK_BUILD_PREFIX_MAP=/spack-test-stage/spack-build-abc1234 + + # Both flags must appear for C. _out=$(dump_args cc '') expect_contains debug_prefix_map_cc "$_out" \ - '-ffile-prefix-map=/some/stage/path=.' + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_contains debug_build_prefix_map_cc "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' - # Must appear for C++ wrapper too. + # Both must appear for C++. _out=$(dump_args c++ '') expect_contains debug_prefix_map_cxx "$_out" \ - '-ffile-prefix-map=/some/stage/path=.' + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_contains debug_build_prefix_map_cxx "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' - # Must appear for Fortran wrapper too. + # Both must appear for Fortran. _out=$(dump_args fc '') expect_contains debug_prefix_map_fc "$_out" \ - '-ffile-prefix-map=/some/stage/path=.' + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_contains debug_build_prefix_map_fc "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' - # Must NOT appear in vcheck mode + # Neither must appear in vcheck mode. _out=$(dump_args cc '--version') expect_not_contains debug_prefix_map_vcheck "$_out" \ - '-ffile-prefix-map=/some/stage/path=.' + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_not_contains debug_build_prefix_map_vcheck "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' - # Must NOT appear in ld mode - SPACK_DEBUG_PREFIX_MAP='/some/stage/path' - export SPACK_DEBUG_PREFIX_MAP + # Neither must appear in plain ld mode. _out=$(dump_args ld '') expect_not_contains debug_prefix_map_ld "$_out" \ - '-ffile-prefix-map=/some/stage/path=.' + '-ffile-prefix-map=/spack-test-stage/spack-src=.' + expect_not_contains debug_build_prefix_map_ld "$_out" \ + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' +} - unset SPACK_DEBUG_PREFIX_MAP +test_prefix_map_dedup() { + wrapper_environment + # When source and build dirs coincide (in-source build), only one + # -ffile-prefix-map flag should be emitted, not a duplicate. + SPACK_BUILD_PREFIX_MAP="$SPACK_PREFIX_MAP" + export SPACK_BUILD_PREFIX_MAP + _out=$(dump_args cc '') + _count=$(printf '%s\n' "$_out" | grep -Fxc -- "-ffile-prefix-map=$SPACK_PREFIX_MAP=.") + if [ "$_count" -ne 1 ]; then + fail "prefix_map_dedup: expected exactly 1 occurrence, got $_count" + fi } # --------------------------------------------------------------------------- @@ -1583,7 +1639,10 @@ test_cpp_stays_cpp_with_x test_x_is_not_a_language_for_ld test_hip_always_flags test_x_hip_vcheck -test_debug_prefix_map +test_prefix_map_required +test_build_prefix_map_required +test_prefix_map_injected +test_prefix_map_dedup ' all_tests="$wrapper_tests $list_ops_tests" From e080a7792fcae6f4fc6e3f5f3675ea43d26819f4 Mon Sep 17 00:00:00 2001 From: SebastianPaucar Date: Sun, 12 Jul 2026 00:21:32 -0600 Subject: [PATCH 3/8] out-of-source build directories remapped to ./build instead of . Signed-off-by: SebastianPaucar --- cc.sh | 2 +- test/run.sh | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cc.sh b/cc.sh index fe47abd..dd36985 100755 --- a/cc.sh +++ b/cc.sh @@ -804,7 +804,7 @@ case "$mode" in cpp|as|cc|ccld) append flags_list "-ffile-prefix-map=${SPACK_PREFIX_MAP}=." if [ "$SPACK_BUILD_PREFIX_MAP" != "$SPACK_PREFIX_MAP" ]; then - append flags_list "-ffile-prefix-map=${SPACK_BUILD_PREFIX_MAP}=." + append flags_list "-ffile-prefix-map=${SPACK_BUILD_PREFIX_MAP}=./build" fi ;; esac diff --git a/test/run.sh b/test/run.sh index 3b28f0c..a0529d2 100755 --- a/test/run.sh +++ b/test/run.sh @@ -400,7 +400,7 @@ DISABLE_NEW_DTAGS='--disable-new-dtags' PREFIX_MAP_FLAGS=$(cat <<'EOF' -ffile-prefix-map=/spack-test-stage/spack-src=. --ffile-prefix-map=/spack-test-stage/spack-build-abc1234=. +-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build EOF ) @@ -1536,35 +1536,35 @@ test_prefix_map_injected() { expect_contains debug_prefix_map_cc "$_out" \ '-ffile-prefix-map=/spack-test-stage/spack-src=.' expect_contains debug_build_prefix_map_cc "$_out" \ - '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' # Both must appear for C++. _out=$(dump_args c++ '') expect_contains debug_prefix_map_cxx "$_out" \ '-ffile-prefix-map=/spack-test-stage/spack-src=.' expect_contains debug_build_prefix_map_cxx "$_out" \ - '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' # Both must appear for Fortran. _out=$(dump_args fc '') expect_contains debug_prefix_map_fc "$_out" \ '-ffile-prefix-map=/spack-test-stage/spack-src=.' expect_contains debug_build_prefix_map_fc "$_out" \ - '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' # Neither must appear in vcheck mode. _out=$(dump_args cc '--version') expect_not_contains debug_prefix_map_vcheck "$_out" \ '-ffile-prefix-map=/spack-test-stage/spack-src=.' expect_not_contains debug_build_prefix_map_vcheck "$_out" \ - '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' # Neither must appear in plain ld mode. _out=$(dump_args ld '') expect_not_contains debug_prefix_map_ld "$_out" \ '-ffile-prefix-map=/spack-test-stage/spack-src=.' expect_not_contains debug_build_prefix_map_ld "$_out" \ - '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=.' + '-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' } test_prefix_map_dedup() { From 489b1a3fbf46d51c0f5a2da6f7458c387bd934c0 Mon Sep 17 00:00:00 2001 From: SebastianPaucar Date: Mon, 27 Jul 2026 16:30:29 -0600 Subject: [PATCH 4/8] cc.sh: inject --build-id/-Wl,--build-id for debuginfo auto-discovery --- cc.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cc.sh b/cc.sh index dd36985..7d14fea 100755 --- a/cc.sh +++ b/cc.sh @@ -890,6 +890,20 @@ if [ "$mode" = ld ] || [ "$mode" = ccld ]; then fi fi +# Enable GNU build-id notes for debuginfo auto-discovery (ELF platforms only; +# Darwin's linker doesn't understand --build-id and macOS builds use dsymutil +# / dSYM bundles for a comparable purpose instead). +if [ "$mode" = ld ] || [ "$mode" = ccld ]; then + if [ "${SPACK_SHORT_SPEC#*darwin}" = "${SPACK_SHORT_SPEC}" ]; then + case "$mode" in + ld) + append flags_list "--build-id" ;; + ccld) + append flags_list "-Wl,--build-id" ;; + esac + fi +fi + if [ "$mode" = ccld ] || [ "$mode" = ld ]; then if [ "$add_rpaths" != "false" ]; then # Append RPATH directories. Note that in the case of the From 7d49d7cc86b807e894c56b6273d4c4289761ea7a Mon Sep 17 00:00:00 2001 From: SebastianPaucar Date: Mon, 24 Aug 2026 15:32:04 -0600 Subject: [PATCH 5/8] cc.sh: inject --build-id on ELF linker/compile-link modes. Updates test fixtures accordingly --- test/run.sh | 52 ++++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/test/run.sh b/test/run.sh index a0529d2..dbd2d68 100755 --- a/test/run.sh +++ b/test/run.sh @@ -397,6 +397,8 @@ LHEADERPAD='-Wl,-headerpad_max_install_names' HEADERPAD='-headerpad_max_install_names' DISABLE_NEW_DTAGS_WL='-Wl,--disable-new-dtags' DISABLE_NEW_DTAGS='--disable-new-dtags' +BUILD_ID_WL='-Wl,--build-id' +BUILD_ID='--build-id' PREFIX_MAP_FLAGS=$(cat <<'EOF' -ffile-prefix-map=/spack-test-stage/spack-src=. @@ -406,6 +408,7 @@ EOF COMMON_COMPILE_ARGS=$(concat \ "$PREFIX_MAP_FLAGS" \ + "$BUILD_ID_WL" \ "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" \ "$DISABLE_NEW_DTAGS_WL" \ @@ -510,6 +513,7 @@ EOF ) _exp=$(cat <<'EOF' ld +--build-id --disable-new-dtags foo.o bar.o @@ -532,7 +536,7 @@ foo -rpath EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' foo.o bar.o baz.o @@ -554,7 +558,7 @@ foo -Wl,-rpath EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' foo.o bar.o baz.o @@ -571,7 +575,7 @@ EOF -Wl,/c EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -Wl,-rpath,/a -Wl,-rpath,/b -Wl,-rpath,/c @@ -585,12 +589,12 @@ EOF -Wl,--rpath= EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "-Wl,-rpath,/a") + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "-Wl,-rpath,/a") expect_args Wl_parsing_missing cc "$_args" "$_exp" # Wl_parsing_NAG_is_ignored _args='-Wl,-Wl,,x,,y,,z' - _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "-Wl,-Wl,,x,,y,,z") + _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "-Wl,-Wl,,x,,y,,z") expect_args Wl_parsing_NAG fc "$_args" "$_exp" # Xlinker_parsing @@ -607,7 +611,7 @@ EOF -Xlinker EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -Wl,-rpath,/a -Wl,-rpath,/b -O3 @@ -625,7 +629,7 @@ EOF -g EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -O3 -g -Wl,-rpath @@ -641,7 +645,7 @@ EOF -g EOF ) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$DISABLE_NEW_DTAGS_WL" "$(cat <<'EOF' -O3 -g -Xlinker @@ -656,14 +660,14 @@ EOF # dep_include SPACK_INCLUDE_DIRS=x; export SPACK_INCLUDE_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Ix" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Ix" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args dep_include cc "$TEST_ARGS" "$_exp" SPACK_INCLUDE_DIRS=''; export SPACK_INCLUDE_DIRS # dep_lib SPACK_LINK_DIRS=x; SPACK_RPATH_DIRS=x; export SPACK_LINK_DIRS SPACK_RPATH_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "-Lx" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "-Wl,-rpath,x" "$TEST_ARGS_NO_PATHS") expect_args dep_lib cc "$TEST_ARGS" "$_exp" @@ -671,7 +675,7 @@ EOF # dep_lib_no_rpath SPACK_LINK_DIRS=x; export SPACK_LINK_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "-Lx" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") expect_args dep_lib_no_rpath cc "$TEST_ARGS" "$_exp" @@ -679,7 +683,7 @@ EOF # dep_lib_no_lib SPACK_RPATH_DIRS=x; export SPACK_RPATH_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "-Wl,-rpath,x" "$TEST_ARGS_NO_PATHS") expect_args dep_lib_no_lib cc "$TEST_ARGS" "$_exp" @@ -691,7 +695,7 @@ EOF SPACK_LINK_DIRS=xlib:ylib:zlib export SPACK_INCLUDE_DIRS SPACK_RPATH_DIRS SPACK_LINK_DIRS - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-Ixinc\n-Iyinc\n-Izinc')" \ "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ @@ -704,7 +708,7 @@ EOF _args="$TEST_ARGS -isystem fooinc" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-isystem\nfooinc\n-isystem\nxinc\n-isystem\nyinc\n-isystem\nzinc')" \ "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ @@ -732,7 +736,7 @@ EOF ) _args="$_sys $TEST_ARGS" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-Ixinc\n-Iyinc\n-Izinc')" \ "$(printf -- '-I/usr/include\n-I/usr/local/include')" \ "$TEST_LIBRARY_PATHS" \ @@ -757,7 +761,7 @@ EOF ) _args="$_sys $TEST_ARGS" - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" \ "$(printf -- '-isystem\nxinc\n-isystem\nyinc\n-isystem\nzinc')" \ "$(printf -- '-isystem\n/usr/include\n-isystem\n/usr/local/include')" \ "$TEST_LIBRARY_PATHS" \ @@ -770,7 +774,7 @@ $TEST_ARGS" expect_args ccld_with_system_dirs_isystem cc "$_args" "$_exp" # ld_deps - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" \ "$(printf -- '-rpath\nxlib\n-rpath\nylib\n-rpath\nzlib')" \ @@ -780,7 +784,7 @@ $TEST_ARGS" # ld_deps_no_rpath unset SPACK_RPATH_DIRS SPACK_RPATH_DIRS=''; export SPACK_RPATH_DIRS - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$(printf -- '-Lxlib\n-Lylib\n-Lzlib')" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" \ "$TEST_ARGS_NO_PATHS") @@ -789,7 +793,7 @@ $TEST_ARGS" # ld_deps_no_link SPACK_RPATH_DIRS=xlib:ylib:zlib; export SPACK_RPATH_DIRS SPACK_LINK_DIRS=''; export SPACK_LINK_DIRS - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" \ "$(printf -- '-rpath\nxlib\n-rpath\nylib\n-rpath\nzlib')" \ "$TEST_ARGS_NO_PATHS") @@ -801,7 +805,7 @@ test_expected_args_with_flags() { wrapper_flags # ld_flags - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" "$TEST_ARGS_NO_PATHS" "$SPACK_LDLIBS_LINES") expect_args ld_flags ld "$TEST_ARGS" "$_exp" @@ -811,21 +815,21 @@ test_expected_args_with_flags() { expect_args cpp_flags cpp "$TEST_ARGS" "$_exp" # cc_flags - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" "$SPACK_CFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") expect_args cc_flags cc "$TEST_ARGS" "$_exp" # cxx_flags (note: -Werror is filtered by SPACK_COMPILER_FLAGS_REPLACE) - _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") expect_args cxx_flags c++ "$TEST_ARGS" "$_exp" # fc_flags - _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_FFLAGS_LINES" "$SPACK_CPPFLAGS_LINES" \ "-Wl,--gc-sections" "$SPACK_LDLIBS_LINES") @@ -882,7 +886,7 @@ test_ld_deps_partial() { SPACK_SHORT_SPEC='foo@1.2=linux-x86_64'; export SPACK_SHORT_SPEC _args="-r $TEST_ARGS" - _exp=$(concat "ld" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "-Lxlib" \ + _exp=$(concat "ld" "$BUILD_ID" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "-Lxlib" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" "-rpath" "xlib" "-r" "$TEST_ARGS_NO_PATHS") expect_args ld_deps_partial_linux ld "$_args" "$_exp" From 7e7946b829200a8f5bc34ac2e71b6eab4e93ac73 Mon Sep 17 00:00:00 2001 From: SebastianPaucar Date: Thu, 10 Sep 2026 17:32:04 -0600 Subject: [PATCH 6/8] fix: prefix remapping in cc.sh keeps compiler-agnostic --- cc.sh | 13 ++++++------ test/run.sh | 59 +++++++++++++++++++---------------------------------- 2 files changed, 28 insertions(+), 44 deletions(-) diff --git a/cc.sh b/cc.sh index 7d14fea..3bdc4af 100755 --- a/cc.sh +++ b/cc.sh @@ -229,8 +229,6 @@ _msg="Error: the compiler wrapper must be invoked from Spack" : "${SPACK_SHORT_SPEC:?$_msg}" : "${SPACK_SYSTEM_DIRS:?$_msg}" : "${SPACK_MANAGED_DIRS:?$_msg}" -: "${SPACK_PREFIX_MAP:?$_msg}" -: "${SPACK_BUILD_PREFIX_MAP:?$_msg}" unset _msg # eval this because SPACK_MANAGED_DIRS and SPACK_SYSTEM_DIRS are inputs we don't wanna loop over. @@ -799,12 +797,15 @@ elif [ "$SPACK_ADD_DEBUG_FLAGS" = "custom" ]; then extend flags_list SPACK_DEBUG_FLAGS fi -# -ffile-prefix-map==. injection for build reproducibility +# Inject compiler-supplied file-prefix-remapping flag(s) case "$mode" in cpp|as|cc|ccld) - append flags_list "-ffile-prefix-map=${SPACK_PREFIX_MAP}=." - if [ "$SPACK_BUILD_PREFIX_MAP" != "$SPACK_PREFIX_MAP" ]; then - append flags_list "-ffile-prefix-map=${SPACK_BUILD_PREFIX_MAP}=./build" + if [ -n "${SPACK_PREFIX_MAP_ARGS:-}" ]; then + append flags_list "$SPACK_PREFIX_MAP_ARGS" + fi + if [ -n "${SPACK_BUILD_PREFIX_MAP_ARGS:-}" ] && \ + [ "$SPACK_BUILD_PREFIX_MAP_ARGS" != "${SPACK_PREFIX_MAP_ARGS:-}" ]; then + append flags_list "$SPACK_BUILD_PREFIX_MAP_ARGS" fi ;; esac diff --git a/test/run.sh b/test/run.sh index dbd2d68..7b7c410 100755 --- a/test/run.sh +++ b/test/run.sh @@ -207,8 +207,8 @@ wrapper_environment() { SPACK_F77=$REAL_CC SPACK_HIPCXX=$REAL_CC SPACK_PREFIX=/spack-test-prefix - SPACK_PREFIX_MAP=/spack-test-stage/spack-src - SPACK_BUILD_PREFIX_MAP=/spack-test-stage/spack-build-abc1234 + SPACK_PREFIX_MAP_ARGS='-ffile-prefix-map=/spack-test-stage/spack-src=.' + SPACK_BUILD_PREFIX_MAP_ARGS='-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' # shellcheck disable=SC2209 # literal string "test", not the command SPACK_COMPILER_WRAPPER_PATH=test SPACK_DEBUG_LOG_DIR=. @@ -236,7 +236,7 @@ wrapper_environment() { # shellcheck disable=SC2090 export SPACK_CC SPACK_CXX SPACK_FC SPACK_F77 SPACK_HIPCXX SPACK_PREFIX \ - SPACK_PREFIX_MAP SPACK_BUILD_PREFIX_MAP \ + SPACK_PREFIX_MAP_ARGS SPACK_BUILD_PREFIX_MAP_ARGS \ SPACK_COMPILER_WRAPPER_PATH SPACK_DEBUG_LOG_DIR SPACK_DEBUG_LOG_ID \ SPACK_SHORT_SPEC SPACK_SYSTEM_DIRS SPACK_MANAGED_DIRS \ SPACK_CC_RPATH_ARG SPACK_CXX_RPATH_ARG SPACK_F77_RPATH_ARG SPACK_FC_RPATH_ARG \ @@ -836,7 +836,7 @@ test_expected_args_with_flags() { expect_args fc_flags fc "$TEST_ARGS" "$_exp" # hip_flags (no target args; CPPFLAGS + HIPFLAGS applied; CFLAGS/CXXFLAGS absent) - _exp=$(concat "$REAL_CC" "$PREFIX_MAP_FLAGS" "$TEST_INCLUDE_PATHS" "-Lfoo" \ + _exp=$(concat "$REAL_CC" "$PREFIX_MAP_FLAGS" "$BUILD_ID_WL" "$TEST_INCLUDE_PATHS" "-Lfoo" \ "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" "$TEST_WL_RPATHS" \ "$TEST_ARGS_NO_PATHS" "$SPACK_CPPFLAGS_LINES" "$SPACK_HIPFLAGS_LINES" \ '-Wl,--gc-sections' "$SPACK_LDLIBS_LINES") @@ -1464,7 +1464,7 @@ test_x_is_not_a_language_for_ld() { for _ld in ld ld.gold ld.lld; do expect_args "${_ld}_x" "$_ld" '-x hip -foo.o' "$(concat "$_ld" "$DISABLE_NEW_DTAGS" -x hip foo.o)" +foo.o' "$(concat "$_ld" "$BUILD_ID" "$DISABLE_NEW_DTAGS" -x hip foo.o)" done } @@ -1501,34 +1501,6 @@ test_x_hip_vcheck() { # SPACK_PREFIX_MAP / SPACK_BUILD_PREFIX_MAP injection # --------------------------------------------------------------------------- -test_prefix_map_required() { - wrapper_environment - unset SPACK_PREFIX_MAP - _out=$("$WRAPPER_DIR/cc" -c hello.c 2>&1) - _rc=$? - if [ "$_rc" -eq 0 ]; then - fail "prefix_map_required: expected non-zero exit when unset, got 0" - fi - case "$_out" in - *"compiler wrapper must be invoked from Spack"*) ;; - *) fail "prefix_map_required: expected mandatory-var error in: $_out" ;; - esac -} - -test_build_prefix_map_required() { - wrapper_environment - unset SPACK_BUILD_PREFIX_MAP - _out=$("$WRAPPER_DIR/cc" -c hello.c 2>&1) - _rc=$? - if [ "$_rc" -eq 0 ]; then - fail "build_prefix_map_required: expected non-zero exit when unset, got 0" - fi - case "$_out" in - *"compiler wrapper must be invoked from Spack"*) ;; - *) fail "build_prefix_map_required: expected mandatory-var error in: $_out" ;; - esac -} - test_prefix_map_injected() { wrapper_environment # wrapper_environment sets: @@ -1575,16 +1547,28 @@ test_prefix_map_dedup() { wrapper_environment # When source and build dirs coincide (in-source build), only one # -ffile-prefix-map flag should be emitted, not a duplicate. - SPACK_BUILD_PREFIX_MAP="$SPACK_PREFIX_MAP" - export SPACK_BUILD_PREFIX_MAP + SPACK_BUILD_PREFIX_MAP_ARGS="$SPACK_PREFIX_MAP_ARGS" + export SPACK_BUILD_PREFIX_MAP_ARGS _out=$(dump_args cc '') - _count=$(printf '%s\n' "$_out" | grep -Fxc -- "-ffile-prefix-map=$SPACK_PREFIX_MAP=.") + _count=$(printf '%s\n' "$_out" | grep -Fxc -- "$SPACK_PREFIX_MAP_ARGS") if [ "$_count" -ne 1 ]; then fail "prefix_map_dedup: expected exactly 1 occurrence, got $_count" fi } +test_prefix_map_absent_when_unsupported() { + wrapper_environment + unset SPACK_PREFIX_MAP_ARGS + unset SPACK_BUILD_PREFIX_MAP_ARGS + + # Wrapper must still succeed and emit no -ffile-prefix-map flags at all. + _out=$(dump_args cc '') + if printf '%s\n' "$_out" | grep -qF -- '-ffile-prefix-map='; then + fail "prefix_map_absent_when_unsupported: flag emitted despite unset args" + fi +} + # --------------------------------------------------------------------------- # Runner # --------------------------------------------------------------------------- @@ -1643,10 +1627,9 @@ test_cpp_stays_cpp_with_x test_x_is_not_a_language_for_ld test_hip_always_flags test_x_hip_vcheck -test_prefix_map_required -test_build_prefix_map_required test_prefix_map_injected test_prefix_map_dedup +test_prefix_map_absent_when_unsupported ' all_tests="$wrapper_tests $list_ops_tests" From e608eaedbc7e9c7d3111bd24dafbc041dd8f25c2 Mon Sep 17 00:00:00 2001 From: SebastianPaucar Date: Fri, 11 Sep 2026 14:16:56 -0600 Subject: [PATCH 7/8] keep build-id platform-agnostic --- cc.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cc.sh b/cc.sh index 3bdc4af..e57c718 100755 --- a/cc.sh +++ b/cc.sh @@ -891,16 +891,16 @@ if [ "$mode" = ld ] || [ "$mode" = ccld ]; then fi fi -# Enable GNU build-id notes for debuginfo auto-discovery (ELF platforms only; -# Darwin's linker doesn't understand --build-id and macOS builds use dsymutil -# / dSYM bundles for a comparable purpose instead). +# Enable GNU build-id notes for debuginfo auto-discovery. SPACK_BUILD_ID_ARGS +# is set per-compiler-package (e.g. gcc sets it on platform=linux); it is +# empty/unset on platforms or compilers that don't support it. if [ "$mode" = ld ] || [ "$mode" = ccld ]; then - if [ "${SPACK_SHORT_SPEC#*darwin}" = "${SPACK_SHORT_SPEC}" ]; then + if [ -n "${SPACK_BUILD_ID_ARGS:-}" ]; then case "$mode" in ld) - append flags_list "--build-id" ;; + append flags_list "$SPACK_BUILD_ID_ARGS" ;; ccld) - append flags_list "-Wl,--build-id" ;; + append flags_list "$linker_arg$SPACK_BUILD_ID_ARGS" ;; esac fi fi From c2ad4ff70c28b98ffa73a10c2e8286a62cb9e5fd Mon Sep 17 00:00:00 2001 From: SebastianPaucar Date: Fri, 11 Sep 2026 15:35:56 -0600 Subject: [PATCH 8/8] test: update run.sh for SPACK_BUILD_ID_ARGS (per-compiler injection) --- test/run.sh | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/test/run.sh b/test/run.sh index 7b7c410..eadcdb0 100755 --- a/test/run.sh +++ b/test/run.sh @@ -209,6 +209,7 @@ wrapper_environment() { SPACK_PREFIX=/spack-test-prefix SPACK_PREFIX_MAP_ARGS='-ffile-prefix-map=/spack-test-stage/spack-src=.' SPACK_BUILD_PREFIX_MAP_ARGS='-ffile-prefix-map=/spack-test-stage/spack-build-abc1234=./build' + SPACK_BUILD_ID_ARGS='--build-id' # shellcheck disable=SC2209 # literal string "test", not the command SPACK_COMPILER_WRAPPER_PATH=test SPACK_DEBUG_LOG_DIR=. @@ -236,7 +237,7 @@ wrapper_environment() { # shellcheck disable=SC2090 export SPACK_CC SPACK_CXX SPACK_FC SPACK_F77 SPACK_HIPCXX SPACK_PREFIX \ - SPACK_PREFIX_MAP_ARGS SPACK_BUILD_PREFIX_MAP_ARGS \ + SPACK_PREFIX_MAP_ARGS SPACK_BUILD_PREFIX_MAP_ARGS SPACK_BUILD_ID_ARGS \ SPACK_COMPILER_WRAPPER_PATH SPACK_DEBUG_LOG_DIR SPACK_DEBUG_LOG_ID \ SPACK_SHORT_SPEC SPACK_SYSTEM_DIRS SPACK_MANAGED_DIRS \ SPACK_CC_RPATH_ARG SPACK_CXX_RPATH_ARG SPACK_F77_RPATH_ARG SPACK_FC_RPATH_ARG \ @@ -891,6 +892,7 @@ $TEST_ARGS" expect_args ld_deps_partial_linux ld "$_args" "$_exp" SPACK_SHORT_SPEC='foo@1.2=darwin-x86_64'; export SPACK_SHORT_SPEC + unset SPACK_BUILD_ID_ARGS _exp=$(concat "ld" "$HEADERPAD" "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "-Lxlib" \ "$DISABLE_NEW_DTAGS" "$TEST_RPATHS" "-r" "$TEST_ARGS_NO_PATHS") expect_args ld_deps_partial_darwin ld "$_args" "$_exp" @@ -905,6 +907,7 @@ test_ccache_prepend_for_cc() { expect_args ccache_prepend_linux cc "$TEST_ARGS" "$_exp" SPACK_SHORT_SPEC='foo@1.2=darwin-x86_64'; export SPACK_SHORT_SPEC + unset SPACK_BUILD_ID_ARGS _exp=$(concat "ccache" "$REAL_CC" "$TARGET_ARGS" "$PREFIX_MAP_FLAGS" "$LHEADERPAD" \ "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") @@ -919,6 +922,7 @@ test_no_ccache_prepend_for_fc() { expect_args no_ccache_fc_linux fc "$TEST_ARGS" "$_exp" SPACK_SHORT_SPEC='foo@1.2=darwin-x86_64'; export SPACK_SHORT_SPEC + unset SPACK_BUILD_ID_ARGS _exp=$(concat "$REAL_CC" "$TARGET_ARGS_FC" "$PREFIX_MAP_FLAGS" "$LHEADERPAD" \ "$TEST_INCLUDE_PATHS" "$TEST_LIBRARY_PATHS" "$DISABLE_NEW_DTAGS_WL" \ "$TEST_WL_RPATHS" "$TEST_ARGS_NO_PATHS") @@ -1498,7 +1502,7 @@ test_x_hip_vcheck() { } # --------------------------------------------------------------------------- -# SPACK_PREFIX_MAP / SPACK_BUILD_PREFIX_MAP injection +# SPACK_PREFIX_MAP / SPACK_BUILD_PREFIX_MAP / BUILD-ID injection # --------------------------------------------------------------------------- test_prefix_map_injected() { @@ -1569,6 +1573,21 @@ test_prefix_map_absent_when_unsupported() { fi } +test_build_id_absent_when_unsupported() { + wrapper_environment + unset SPACK_BUILD_ID_ARGS + + _out=$(dump_args ld '') + if printf '%s\n' "$_out" | grep -qF -- '--build-id'; then + fail "build_id_absent_when_unsupported: flag emitted despite unset var" + fi + + _out=$(dump_args cc '') + if printf '%s\n' "$_out" | grep -qF -- '--build-id'; then + fail "build_id_absent_when_unsupported: flag emitted in ccld mode despite unset var" + fi +} + # --------------------------------------------------------------------------- # Runner # --------------------------------------------------------------------------- @@ -1630,6 +1649,7 @@ test_x_hip_vcheck test_prefix_map_injected test_prefix_map_dedup test_prefix_map_absent_when_unsupported +test_build_id_absent_when_unsupported ' all_tests="$wrapper_tests $list_ops_tests"