diff options
-rwxr-xr-x | lib/spack/env/cc | 19 | ||||
-rw-r--r-- | lib/spack/spack/test/cc.py | 18 |
2 files changed, 32 insertions, 5 deletions
diff --git a/lib/spack/env/cc b/lib/spack/env/cc index eee39e7f35..a647602cad 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -434,8 +434,6 @@ wl_expect_rpath=no xlinker_expect_rpath=no parse_Wl() { - # drop -Wl - shift while [ $# -ne 0 ]; do if [ "$wl_expect_rpath" = yes ]; then if system_dir "$1"; then @@ -448,7 +446,9 @@ parse_Wl() { case "$1" in -rpath=*) arg="${1#-rpath=}" - if system_dir "$arg"; then + if [ -z "$arg" ]; then + shift; continue + elif system_dir "$arg"; then append system_rpath_dirs_list "$arg" else append rpath_dirs_list "$arg" @@ -456,7 +456,9 @@ parse_Wl() { ;; --rpath=*) arg="${1#--rpath=}" - if system_dir "$arg"; then + if [ -z "$arg" ]; then + shift; continue + elif system_dir "$arg"; then append system_rpath_dirs_list "$arg" else append rpath_dirs_list "$arg" @@ -467,6 +469,11 @@ parse_Wl() { ;; "$dtags_to_strip") ;; + -Wl) + # Nested -Wl,-Wl means we're in NAG compiler territory, we don't support + # it. + return 1 + ;; *) append other_args_list "-Wl,$1" ;; @@ -576,7 +583,9 @@ while [ $# -ne 0 ]; do ;; -Wl,*) IFS=, - parse_Wl $1 + if ! parse_Wl ${1#-Wl,}; then + append other_args_list "$1" + fi unset IFS ;; -Xlinker) diff --git a/lib/spack/spack/test/cc.py b/lib/spack/spack/test/cc.py index 0df374866f..7dc02d01f9 100644 --- a/lib/spack/spack/test/cc.py +++ b/lib/spack/spack/test/cc.py @@ -352,6 +352,24 @@ def test_Wl_parsing(wrapper_environment): ) +@pytest.mark.regression("37179") +def test_Wl_parsing_with_missing_value(wrapper_environment): + check_args( + cc, + ["-Wl,-rpath=/a,-rpath=", "-Wl,--rpath="], + [real_cc] + target_args + ["-Wl,--disable-new-dtags", "-Wl,-rpath,/a"], + ) + + +@pytest.mark.regression("37179") +def test_Wl_parsing_NAG_is_ignored(wrapper_environment): + check_args( + fc, + ["-Wl,-Wl,,x,,y,,z"], + [real_cc] + target_args + ["-Wl,--disable-new-dtags", "-Wl,-Wl,,x,,y,,z"], + ) + + def test_Xlinker_parsing(wrapper_environment): # -Xlinker <x> ... -Xlinker <y> may have compiler flags inbetween, like -O3 in this # example. Also check that a trailing -Xlinker (which is a compiler error) is not |