diff --git a/lib/spack/spack/test/cc.py b/lib/spack/spack/test/cc.py index e9aea962085..aaae00ab9f0 100644 --- a/lib/spack/spack/test/cc.py +++ b/lib/spack/spack/test/cc.py @@ -216,16 +216,13 @@ def check_args_contents(cc, args, must_contain, must_not_contain): assert a not in cc_modified_args -def check_env_var(executable, var, expected): - """Check environment variables updated by the passed compiler wrapper - - This assumes that cc will print debug output when it's environment - contains SPACK_TEST_COMMAND=dump-env- - """ - executable = Executable(str(executable)) - with set_env(SPACK_TEST_COMMAND="dump-env-" + var): - output = executable(*test_args, output=str).strip() - assert executable.path + ": " + var + ": " + expected == output +def check_wrapper_var(exe, *args, var, expected): + """Check variables set by the compiler wrapper. This works by setting SPACK_TEST_COMMAND to + dump-var-, which will print the variable and exit.""" + executable = Executable(str(exe)) + with set_env(SPACK_TEST_COMMAND=f"dump-var-{var}"): + output = executable(*args, output=str).strip() + assert f"{executable.path}: {var}: {expected}" == output def dump_mode(cc, args): @@ -749,11 +746,22 @@ def test_system_path_cleanup(wrapper_environment, wrapper_dir): """ cc = wrapper_dir / "cc" system_path = "/bin:/usr/bin:/usr/local/bin" - with set_env(SPACK_COMPILER_WRAPPER_PATH=str(wrapper_dir), SPACK_CC="true"): + with set_env(SPACK_COMPILER_WRAPPER_PATH=str(wrapper_dir)): with set_env(PATH=str(wrapper_dir) + ":" + system_path): - check_env_var(cc, "PATH", system_path) + check_wrapper_var(cc, *test_args, var="PATH", expected=system_path) with set_env(PATH=str(wrapper_dir) + "/:" + system_path): - check_env_var(cc, "PATH", system_path) + check_wrapper_var(cc, *test_args, var="PATH", expected=system_path) + + +def test_language_from_flags(wrapper_environment, wrapper_dir): + """Tes that the compiler language mode is determined by -x/--language flags if present""" + cc = wrapper_dir / "cc" + + for flag_value, lang in [("c", "CC"), ("c++", "CXX"), ("f77", "F77"), ("f95", "FC")]: + check_wrapper_var(cc, "-c", "file", "-x", flag_value, var="comp", expected=lang) + check_wrapper_var(cc, "-c", "file", f"-x{flag_value}", var="comp", expected=lang) + check_wrapper_var(cc, "-c", "file", f"--language={flag_value}", var="comp", expected=lang) + check_wrapper_var(cc, "-c", "file", "--language", flag_value, var="comp", expected=lang) def test_ld_deps_partial(wrapper_environment, wrapper_dir): diff --git a/var/spack/repos/builtin/packages/compiler-wrapper/cc.sh b/var/spack/repos/builtin/packages/compiler-wrapper/cc.sh index 3cfb0ffbf86..31ae442ed13 100755 --- a/var/spack/repos/builtin/packages/compiler-wrapper/cc.sh +++ b/var/spack/repos/builtin/packages/compiler-wrapper/cc.sh @@ -178,9 +178,10 @@ execute() { unset IFS exit ;; - dump-env-*) - var=${SPACK_TEST_COMMAND#dump-env-} + dump-var-*) + var=${SPACK_TEST_COMMAND#dump-var-} eval "printf '%s\n' \"\$0: \$var: \$$var\"" + exit ;; *) die "Unknown test command: '$SPACK_TEST_COMMAND'" @@ -296,9 +297,36 @@ fi # Note. SPACK_ALWAYS_XFLAGS are applied for all compiler invocations, # including version checks (SPACK_XFLAGS variants are not applied # for version checks). -command="${0##*/}" +command_from_argv0="${0##*/}" +command="$command_from_argv0" comp="CC" vcheck_flags="" + +_command_from_flags() { + while [ $# -ne 0 ]; do + arg="$1" + shift + case "$arg" in + -x|--language) + _lang="$1" + shift ;; + -x*) + _lang="${arg#-x}" ;; + --language=*) + _lang="${arg#--language=}" ;; + *) continue ;; + esac + done + + case "$_lang" in + c) command=cc ;; + c++|f77|f95) command="$_lang" ;; + *) command="$command_from_argv0" ;; # drop unknown languages + esac +} + +_command_from_flags "$@" + case "$command" in cpp) mode=cpp diff --git a/var/spack/repos/builtin/packages/compiler-wrapper/package.py b/var/spack/repos/builtin/packages/compiler-wrapper/package.py index e4a5e77abcd..a5362fb2cc0 100644 --- a/var/spack/repos/builtin/packages/compiler-wrapper/package.py +++ b/var/spack/repos/builtin/packages/compiler-wrapper/package.py @@ -43,7 +43,7 @@ class CompilerWrapper(Package): if sys.platform != "win32": version( "1.0", - sha256="c65a9d2b2d4eef67ab5cb0684d706bb9f005bb2be94f53d82683d7055bdb837c", + sha256="db44e5898aa9b8605e3cfe53a51649b4df504066f0f13562432f584fc88a5038", expand=False, ) else: