diff --git a/lib/spack/env/cc b/lib/spack/env/cc index bc4a20dc3e..76f6095004 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -52,6 +52,7 @@ parameters=( SPACK_F77_RPATH_ARG SPACK_FC_RPATH_ARG SPACK_SHORT_SPEC + SPACK_SYSTEM_DIRS ) # The compiler input variables are checked for sanity later: @@ -228,7 +229,92 @@ fi # Save original command for debug logging input_command="$@" -args=("$@") +args=() + +# +# Parse the command line args, trying hard to keep +# non-rpath linker arguments in the proper order w.r.t. other command +# line arguments. This is important for things like groups. +# +# -l arguments are treated as 'other_args' to ensure that they stay in +# any groups they are a part of. Dependency library -l statements are +# categorized as 'libs' +# +# The various categories will be recombined with compiler flags into +# args variable later. +# +includes=() +libdirs=() +libs=() +rpaths=() +other_args=() + +while [ -n "$1" ]; do + case "$1" in + -I*) + arg="${1#-I}" + if [ -z "$arg" ]; then shift; arg="$1"; fi + includes+=("$arg") + ;; + -L*) + arg="${1#-L}" + if [ -z "$arg" ]; then shift; arg="$1"; fi + libdirs+=("$arg") + ;; + -l*) + arg="${1#-l}" + if [ -z "$arg" ]; then shift; arg="$1"; fi + other_args+=("-l$arg") + ;; + -Wl,*) + arg="${1#-Wl,}" + if [ -z "$arg" ]; then shift; arg="$1"; fi + if [[ "$arg" = -rpath=* ]]; then + rpaths+=("${arg#-rpath=}") + elif [[ "$arg" = -rpath,* ]]; then + rpaths+=("${arg#-rpath,}") + elif [[ "$arg" = -rpath ]]; then + shift; arg="$1" + if [[ "$arg" != -Wl,* ]]; then + die "-Wl,-rpath was not followed by -Wl,*" + fi + rpaths+=("${arg#-Wl,}") + else + other_args+=("-Wl,$arg") + fi + ;; + -Xlinker,*) + arg="${1#-Xlinker,}" + if [ -z "$arg" ]; then shift; arg="$1"; fi + if [[ "$arg" = -rpath=* ]]; then + rpaths+=("${arg#-rpath=}") + elif [[ "$arg" = -rpath ]]; then + shift; arg="$1" + if [[ "$arg" != -Xlinker,* ]]; then + die "-Xlinker,-rpath was not followed by -Xlinker,*" + fi + rpaths+=("${arg#-Xlinker,}") + else + other_args+=("-Xlinker,$arg") + fi + ;; + -Xlinker) + if [[ "$2" == "-rpath" ]]; then + if [[ "$3" != "-Xlinker" ]]; then + die "-Xlinker,-rpath was not followed by -Xlinker,*" + fi + shift 3; + rpaths+=("$1") + else + other_args+=("$1") + fi + ;; + *) + other_args+=("$1") + ;; + esac + shift +done # Prepend cppflags, cflags, cxxflags, fcflags, fflags, and ldflags @@ -266,92 +352,93 @@ case "$mode" in cc|ccld) ;; esac +# Include all -L's and prefix/whatever dirs in rpath +$add_rpaths && rpaths+=("$SPACK_PREFIX/lib") +$add_rpaths && rpaths+=("$SPACK_PREFIX/lib64") + # Read spack dependencies from the path environment variable IFS=':' read -ra deps <<< "$SPACK_DEPENDENCIES" for dep in "${deps[@]}"; do - # Prepend include directories + # Append include directories if [[ -d $dep/include ]]; then if [[ $mode == cpp || $mode == cc || $mode == as || $mode == ccld ]]; then - args=("-I$dep/include" "${args[@]}") + includes=("${includes[@]}" "$dep/include") fi fi - # Prepend lib and RPATH directories + # Append lib and RPATH directories if [[ -d $dep/lib ]]; then - if [[ $mode == ccld ]]; then - if [[ $SPACK_RPATH_DEPS == *$dep* ]]; then - $add_rpaths && args=("$rpath$dep/lib" "${args[@]}") - fi - if [[ $SPACK_LINK_DEPS == *$dep* ]]; then - args=("-L$dep/lib" "${args[@]}") - fi - elif [[ $mode == ld ]]; then - if [[ $SPACK_RPATH_DEPS == *$dep* ]]; then - $add_rpaths && args=("-rpath" "$dep/lib" "${args[@]}") - fi - if [[ $SPACK_LINK_DEPS == *$dep* ]]; then - args=("-L$dep/lib" "${args[@]}") - fi + if [[ $SPACK_RPATH_DEPS == *$dep* ]]; then + $add_rpaths && rpaths=("${rpaths[@]}" "$dep/lib") + fi + if [[ $SPACK_LINK_DEPS == *$dep* ]]; then + libdirs=("${libdirs[@]}" "$dep/lib") fi fi - # Prepend lib64 and RPATH directories + # Append lib64 and RPATH directories if [[ -d $dep/lib64 ]]; then - if [[ $mode == ccld ]]; then - if [[ $SPACK_RPATH_DEPS == *$dep* ]]; then - $add_rpaths && args=("$rpath$dep/lib64" "${args[@]}") - fi - if [[ $SPACK_LINK_DEPS == *$dep* ]]; then - args=("-L$dep/lib64" "${args[@]}") - fi - elif [[ $mode == ld ]]; then - if [[ $SPACK_RPATH_DEPS == *$dep* ]]; then - $add_rpaths && args=("-rpath" "$dep/lib64" "${args[@]}") - fi - if [[ $SPACK_LINK_DEPS == *$dep* ]]; then - args=("-L$dep/lib64" "${args[@]}") - fi + if [[ $SPACK_RPATH_DEPS == *$dep* ]]; then + $add_rpaths && rpaths+=("$dep/lib64") + fi + if [[ $SPACK_LINK_DEPS == *$dep* ]]; then + libdirs+=("$dep/lib64") fi fi done -# Include all -L's and prefix/whatever dirs in rpath -if [[ $mode == ccld ]]; then - $add_rpaths && args=("$rpath$SPACK_PREFIX/lib64" "${args[@]}") - $add_rpaths && args=("$rpath$SPACK_PREFIX/lib" "${args[@]}") -elif [[ $mode == ld ]]; then - $add_rpaths && args=("-rpath" "$SPACK_PREFIX/lib64" "${args[@]}") - $add_rpaths && args=("-rpath" "$SPACK_PREFIX/lib" "${args[@]}") -fi - # Set extra RPATHs IFS=':' read -ra extra_rpaths <<< "$SPACK_COMPILER_EXTRA_RPATHS" -for extra_rpath in "${extra_rpaths[@]}"; do - if [[ $mode == ccld ]]; then - $add_rpaths && args=("$rpath$extra_rpath" "${args[@]}") - args=("-L$extra_rpath" "${args[@]}") - elif [[ $mode == ld ]]; then - $add_rpaths && args=("-rpath" "$extra_rpath" "${args[@]}") - args=("-L$extra_rpath" "${args[@]}") - fi +for extra_rpath in "${extra_rpaths[@]}"; do + $add_rpaths && rpaths+=("$extra_rpath") + libdirs+=("$extra_rpath") done # Add SPACK_LDLIBS to args case "$mode" in ld|ccld) - args=("${args[@]}" ${SPACK_LDLIBS[@]}) ;; + for lib in ${SPACK_LDLIBS[@]}; do + libs+=("${lib#-l}") + done esac -#ccache only supports C languages, so filtering out Fortran -if [[ ( ${lang_flags} = "C" || ${lang_flags} = "CXX" ) && ${SPACK_CCACHE_BINARY} ]]; then - full_command=("${SPACK_CCACHE_BINARY}" "$command" "${args[@]}") - # #3761#issuecomment-294352232 - # workaround for stage being a temp folder - export CCACHE_NOHASHDIR=yes -else - full_command=("$command" "${args[@]}") +# Filter system locations to the end of each sublist of args +# (includes, library dirs, rpaths) +for sd in ${SPACK_SYSTEM_DIRS[@]}; do + stripped_includes=`echo $includes | sed "s#\b$sd/\? \b##g"` + stripped_libdirs=`echo $libdirs | sed "s#\b$sd/\? \b##g"` + stripped_rpaths=`echo $rpaths | sed "s#\b$sd/\? \b##g"` + if [[ "$includes" != "$stripped_includes" ]]; then + $includes="$stripped_includes $sd" + fi + if [[ "$libdirs" != "$stripped_libdirs" ]]; then + $libdirs="$stripped_libdirs $sd" + fi + if [[ "$rpaths" != "$stripped_rpaths" ]]; then + $rpaths="$stripped_rpaths $sd" + fi +done + +# Put the arguments together into one list +# Includes come first, then other args, library dirs, and rpaths +# rpaths get appropriate flag for ld vs ccld mode +for dir in "${includes[@]}"; do args+=("-I$dir"); done +args+=("${other_args[@]}") +for dir in "${libdirs[@]}"; do args+=("-L$dir"); done +for lib in "${libs[@]}"; do args+=("-l$lib"); done +if [ "$mode" = ccld ]; then + for dir in "${rpaths[@]}"; do + args+=("$rpath$dir") + done +elif [ "$mode" = ld ]; then + for dir in "${rpaths[@]}"; do + args+=("-rpath" "$dir") + done fi +full_command=("$command") +full_command+=("${args[@]}") + # In test command mode, write out full command for Spack tests. if [[ $SPACK_TEST_COMMAND == dump-args ]]; then echo "${full_command[@]}" @@ -370,4 +457,4 @@ if [[ $SPACK_DEBUG == TRUE ]]; then echo "[$mode] ${full_command[@]}" >> "$output_log" fi -exec "${full_command[@]}" +exec "${full_command[@]}" diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index e48e570e76..ea18cc87d0 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -73,6 +73,7 @@ from spack.environment import EnvironmentModifications, validate from spack.environment import preserve_environment from spack.util.environment import env_flag, filter_system_paths, get_path +from spack.util.environment import system_dirs from spack.util.executable import Executable from spack.util.module_cmd import load_module, get_path_from_module from spack.util.log_parse import parse_log_events, make_log_context @@ -99,6 +100,7 @@ SPACK_DEBUG_LOG_ID = 'SPACK_DEBUG_LOG_ID' SPACK_DEBUG_LOG_DIR = 'SPACK_DEBUG_LOG_DIR' SPACK_CCACHE_BINARY = 'SPACK_CCACHE_BINARY' +SPACK_SYSTEM_DIRS = 'SPACK_SYSTEM_DIRS' # Platform-specific library suffix. @@ -202,6 +204,8 @@ def set_compiler_environment_variables(pkg, env): env.set('SPACK_COMPILER_SPEC', str(pkg.spec.compiler)) + env.set('SPACK_SYSTEM_DIRS', ' '.join(system_dirs)) + compiler.setup_custom_environment(pkg, env) return env diff --git a/lib/spack/spack/test/build_environment.py b/lib/spack/spack/test/build_environment.py index 982e7822b3..f48f46cd4c 100644 --- a/lib/spack/spack/test/build_environment.py +++ b/lib/spack/spack/test/build_environment.py @@ -58,6 +58,8 @@ def build_environment(): os.environ['SPACK_F77_RPATH_ARG'] = "-Wl,-rpath," os.environ['SPACK_FC_RPATH_ARG'] = "-Wl,-rpath," + os.environ['SPACK_SYSTEM_DIRS'] = '/usr/include /usr/lib' + if 'SPACK_DEPENDENCIES' in os.environ: del os.environ['SPACK_DEPENDENCIES'] @@ -67,7 +69,8 @@ def build_environment(): 'SPACK_ENV_PATH', 'SPACK_DEBUG_LOG_DIR', 'SPACK_COMPILER_SPEC', 'SPACK_SHORT_SPEC', 'SPACK_CC_RPATH_ARG', 'SPACK_CXX_RPATH_ARG', - 'SPACK_F77_RPATH_ARG', 'SPACK_FC_RPATH_ARG'): + 'SPACK_F77_RPATH_ARG', 'SPACK_FC_RPATH_ARG', + 'SPACK_SYSTEM_DIRS'): del os.environ[name] @@ -96,8 +99,8 @@ def test_static_to_shared_library(build_environment): shared_lib = '{0}.{1}'.format( os.path.splitext(static_lib)[0], dso_suffix) - assert output == expected[arch].format( - static_lib, shared_lib, os.path.basename(shared_lib)) + assert set(output.split()) == set(expected[arch].format( + static_lib, shared_lib, os.path.basename(shared_lib)).split()) @pytest.mark.regression('8345') diff --git a/lib/spack/spack/test/cc.py b/lib/spack/spack/test/cc.py index adc5bfd71b..12f8acc1a6 100644 --- a/lib/spack/spack/test/cc.py +++ b/lib/spack/spack/test/cc.py @@ -166,50 +166,71 @@ def test_flags(self): # Test ldflags added properly in ld mode self.check_ld('dump-args', test_command, - "ld " + - '-rpath ' + self.prefix + '/lib ' + - '-rpath ' + self.prefix + '/lib64 ' + - '-L foo ' + - ' '.join(test_command) + ' ' + - '-lfoo') + 'ld -L foo ' + + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-lfoo ' + + '-rpath /first/rpath -rpath /second/rpath ' + + '-rpath /third/rpath -rpath /fourth/rpath ' + + '-rpath /spack-test-prefix/lib ' + + '-rpath /spack-test-prefix/lib64') # Test cppflags added properly in cpp mode self.check_cpp('dump-args', test_command, "cpp " + '-g -O1 ' + - ' '.join(test_command)) + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib') # Test ldflags, cppflags, and language specific flags are added in # proper order self.check_cc('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + - '-g -O1 ' + - '-Wall ' + - '-L foo ' + - ' '.join(test_command) + ' ' + - '-lfoo') + '-g -O1 -Wall -L foo ' + + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-lfoo ' + + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64') self.check_cxx('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + - '-g -O1 ' + - '-Werror ' + - '-L foo ' + - ' '.join(test_command) + ' ' + - '-lfoo') + '-g -O1 -Werror -L foo ' + + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-lfoo ' + + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64') self.check_fc('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + - '-w ' + - '-g -O1 ' + - '-L foo ' + - ' '.join(test_command) + ' ' + - '-lfoo') + '-w -g -O1 -L foo ' + + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-lfoo ' + + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64') del os.environ['SPACK_CFLAGS'] del os.environ['SPACK_CXXFLAGS'] @@ -222,9 +243,15 @@ def test_dep_rpath(self): """Ensure RPATHs for root package are added.""" self.check_cc('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + - ' '.join(test_command)) + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64') def test_dep_include(self): """Ensure a single dependency include directory is added.""" @@ -233,10 +260,16 @@ def test_dep_include(self): os.environ['SPACK_LINK_DEPS'] = os.environ['SPACK_DEPENDENCIES'] self.check_cc('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + - '-I' + self.dep4 + '/include ' + - ' '.join(test_command)) + '-I/test/include -I/other/include ' + + '-I' + self.dep4 + '/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64') def test_dep_lib(self): """Ensure a single dependency RPATH is added.""" @@ -245,11 +278,17 @@ def test_dep_lib(self): os.environ['SPACK_LINK_DEPS'] = os.environ['SPACK_DEPENDENCIES'] self.check_cc('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + '-L' + self.dep2 + '/lib64 ' + - '-Wl,-rpath,' + self.dep2 + '/lib64 ' + - ' '.join(test_command)) + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64 ' + + '-Wl,-rpath,' + self.dep2 + '/lib64') def test_dep_lib_no_rpath(self): """Ensure a single dependency link flag is added with no dep RPATH.""" @@ -257,10 +296,16 @@ def test_dep_lib_no_rpath(self): os.environ['SPACK_LINK_DEPS'] = os.environ['SPACK_DEPENDENCIES'] self.check_cc('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + '-L' + self.dep2 + '/lib64 ' + - ' '.join(test_command)) + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64') def test_dep_lib_no_lib(self): """Ensure a single dependency RPATH is added with no -L.""" @@ -268,10 +313,16 @@ def test_dep_lib_no_lib(self): os.environ['SPACK_RPATH_DEPS'] = os.environ['SPACK_DEPENDENCIES'] self.check_cc('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + - '-Wl,-rpath,' + self.dep2 + '/lib64 ' + - ' '.join(test_command)) + '-I/test/include -I/other/include arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64 ' + + '-Wl,-rpath,' + self.dep2 + '/lib64') def test_all_deps(self): """Ensure includes and RPATHs for all deps are added. """ @@ -285,23 +336,25 @@ def test_all_deps(self): # to. We could loosen that if it becomes necessary self.check_cc('dump-args', test_command, self.realcc + ' ' + - '-Wl,-rpath,' + self.prefix + '/lib ' + - '-Wl,-rpath,' + self.prefix + '/lib64 ' + - - '-I' + self.dep4 + '/include ' + - - '-L' + self.dep3 + '/lib64 ' + - '-Wl,-rpath,' + self.dep3 + '/lib64 ' + - '-I' + self.dep3 + '/include ' + - - '-L' + self.dep2 + '/lib64 ' + - '-Wl,-rpath,' + self.dep2 + '/lib64 ' + - - '-L' + self.dep1 + '/lib ' + - '-Wl,-rpath,' + self.dep1 + '/lib ' + + '-I/test/include -I/other/include ' + '-I' + self.dep1 + '/include ' + - - ' '.join(test_command)) + '-I' + self.dep3 + '/include ' + + '-I' + self.dep4 + '/include ' + + 'arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-L' + self.dep1 + '/lib ' + + '-L' + self.dep2 + '/lib64 ' + + '-L' + self.dep3 + '/lib64 ' + + '-Wl,-rpath,/first/rpath -Wl,-rpath,/second/rpath ' + + '-Wl,-rpath,/third/rpath -Wl,-rpath,/fourth/rpath ' + + '-Wl,-rpath,/spack-test-prefix/lib ' + + '-Wl,-rpath,/spack-test-prefix/lib64 ' + + '-Wl,-rpath,' + self.dep1 + '/lib ' + + '-Wl,-rpath,' + self.dep2 + '/lib64 ' + + '-Wl,-rpath,' + self.dep3 + '/lib64') def test_ld_deps(self): """Ensure no (extra) -I args or -Wl, are passed in ld mode.""" @@ -312,19 +365,22 @@ def test_ld_deps(self): self.check_ld('dump-args', test_command, 'ld ' + - '-rpath ' + self.prefix + '/lib ' + - '-rpath ' + self.prefix + '/lib64 ' + - - '-L' + self.dep3 + '/lib64 ' + - '-rpath ' + self.dep3 + '/lib64 ' + - - '-L' + self.dep2 + '/lib64 ' + - '-rpath ' + self.dep2 + '/lib64 ' + - + '-I/test/include -I/other/include ' + + 'arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + '-L' + self.dep1 + '/lib ' + + '-L' + self.dep2 + '/lib64 ' + + '-L' + self.dep3 + '/lib64 ' + + '-rpath /first/rpath -rpath /second/rpath ' + + '-rpath /third/rpath -rpath /fourth/rpath ' + + '-rpath /spack-test-prefix/lib ' + + '-rpath /spack-test-prefix/lib64 ' + '-rpath ' + self.dep1 + '/lib ' + - - ' '.join(test_command)) + '-rpath ' + self.dep2 + '/lib64 ' + + '-rpath ' + self.dep3 + '/lib64') def test_ld_deps_no_rpath(self): """Ensure SPACK_RPATH_DEPS controls RPATHs for ld.""" @@ -334,14 +390,19 @@ def test_ld_deps_no_rpath(self): self.check_ld('dump-args', test_command, 'ld ' + - '-rpath ' + self.prefix + '/lib ' + - '-rpath ' + self.prefix + '/lib64 ' + - - '-L' + self.dep3 + '/lib64 ' + - '-L' + self.dep2 + '/lib64 ' + + '-I/test/include -I/other/include ' + + 'arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + '-L' + self.dep1 + '/lib ' + - - ' '.join(test_command)) + '-L' + self.dep2 + '/lib64 ' + + '-L' + self.dep3 + '/lib64 ' + + '-rpath /first/rpath -rpath /second/rpath ' + + '-rpath /third/rpath -rpath /fourth/rpath ' + + '-rpath /spack-test-prefix/lib ' + + '-rpath /spack-test-prefix/lib64') def test_ld_deps_no_link(self): """Ensure SPACK_LINK_DEPS controls -L for ld.""" @@ -351,14 +412,19 @@ def test_ld_deps_no_link(self): self.check_ld('dump-args', test_command, 'ld ' + - '-rpath ' + self.prefix + '/lib ' + - '-rpath ' + self.prefix + '/lib64 ' + - - '-rpath ' + self.dep3 + '/lib64 ' + - '-rpath ' + self.dep2 + '/lib64 ' + + '-I/test/include -I/other/include ' + + 'arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + + '-rpath /first/rpath -rpath /second/rpath ' + + '-rpath /third/rpath -rpath /fourth/rpath ' + + '-rpath /spack-test-prefix/lib ' + + '-rpath /spack-test-prefix/lib64 ' + '-rpath ' + self.dep1 + '/lib ' + - - ' '.join(test_command)) + '-rpath ' + self.dep2 + '/lib64 ' + + '-rpath ' + self.dep3 + '/lib64') def test_ld_deps_reentrant(self): """Make sure ld -r is handled correctly on OS's where it doesn't @@ -371,18 +437,30 @@ def test_ld_deps_reentrant(self): reentrant_test_command = ['-r'] + test_command self.check_ld('dump-args', reentrant_test_command, 'ld ' + - '-rpath ' + self.prefix + '/lib ' + - '-rpath ' + self.prefix + '/lib64 ' + - + '-I/test/include -I/other/include ' + + '-r arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + '-L' + self.dep1 + '/lib ' + - '-rpath ' + self.dep1 + '/lib ' + - - '-r ' + - ' '.join(test_command)) + '-rpath /first/rpath -rpath /second/rpath ' + + '-rpath /third/rpath -rpath /fourth/rpath ' + + '-rpath /spack-test-prefix/lib ' + + '-rpath /spack-test-prefix/lib64 ' + + '-rpath ' + self.dep1 + '/lib') + # rpaths from the underlying command will still appear + # Spack will not add its own rpaths. os.environ['SPACK_SHORT_SPEC'] = "foo@1.2=darwin-x86_64" self.check_ld('dump-args', reentrant_test_command, 'ld ' + + '-I/test/include -I/other/include ' + + '-r arg1 ' + + '-Wl,--start-group arg2 arg3 -llib1 -llib2 arg4 ' + + '-Wl,--end-group ' + + '-llib3 -llib4 arg5 arg6 ' + + '-L/test/lib -L/other/lib ' + '-L' + self.dep1 + '/lib ' + - '-r ' + - ' '.join(test_command)) + '-rpath /first/rpath -rpath /second/rpath ' + + '-rpath /third/rpath -rpath /fourth/rpath')