diff options
Diffstat (limited to 'lib/spack/env/cc')
-rwxr-xr-x | lib/spack/env/cc | 244 |
1 files changed, 150 insertions, 94 deletions
diff --git a/lib/spack/env/cc b/lib/spack/env/cc index 6c4db38ba1..52fc8f524d 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -47,7 +47,8 @@ SPACK_F77_RPATH_ARG SPACK_FC_RPATH_ARG SPACK_LINKER_ARG SPACK_SHORT_SPEC -SPACK_SYSTEM_DIRS" +SPACK_SYSTEM_DIRS +SPACK_MANAGED_DIRS" # Optional parameters that aren't required to be set @@ -173,21 +174,17 @@ preextend() { unset IFS } -# system_dir PATH -# test whether a path is a system directory -system_dir() { - IFS=':' # SPACK_SYSTEM_DIRS is colon-separated - path="$1" - for sd in $SPACK_SYSTEM_DIRS; do - if [ "${path}" = "${sd}" ] || [ "${path}" = "${sd}/" ]; then - # success if path starts with a system prefix - unset IFS - return 0 - fi - done - unset IFS - return 1 # fail if path starts no system prefix +# eval this because SPACK_MANAGED_DIRS and SPACK_SYSTEM_DIRS are inputs we don't wanna loop over. +# moving the eval inside the function would eval it every call. +eval "\ +path_order() { +case \"\$1\" in + $SPACK_MANAGED_DIRS) return 0 ;; + $SPACK_SYSTEM_DIRS) return 2 ;; + /*) return 1 ;; +esac } +" # Fail with a clear message if the input contains any bell characters. if eval "[ \"\${*#*${lsep}}\" != \"\$*\" ]"; then @@ -420,11 +417,12 @@ input_command="$*" parse_Wl() { while [ $# -ne 0 ]; do if [ "$wl_expect_rpath" = yes ]; then - if system_dir "$1"; then - append return_system_rpath_dirs_list "$1" - else - append return_rpath_dirs_list "$1" - fi + path_order "$1" + case $? in + 0) append return_spack_store_rpath_dirs_list "$1" ;; + 1) append return_rpath_dirs_list "$1" ;; + 2) append return_system_rpath_dirs_list "$1" ;; + esac wl_expect_rpath=no else case "$1" in @@ -432,21 +430,25 @@ parse_Wl() { arg="${1#-rpath=}" if [ -z "$arg" ]; then shift; continue - elif system_dir "$arg"; then - append return_system_rpath_dirs_list "$arg" - else - append return_rpath_dirs_list "$arg" fi + path_order "$arg" + case $? in + 0) append return_spack_store_rpath_dirs_list "$arg" ;; + 1) append return_rpath_dirs_list "$arg" ;; + 2) append return_system_rpath_dirs_list "$arg" ;; + esac ;; --rpath=*) arg="${1#--rpath=}" if [ -z "$arg" ]; then shift; continue - elif system_dir "$arg"; then - append return_system_rpath_dirs_list "$arg" - else - append return_rpath_dirs_list "$arg" fi + path_order "$arg" + case $? in + 0) append return_spack_store_rpath_dirs_list "$arg" ;; + 1) append return_rpath_dirs_list "$arg" ;; + 2) append return_system_rpath_dirs_list "$arg" ;; + esac ;; -rpath|--rpath) wl_expect_rpath=yes @@ -473,12 +475,20 @@ categorize_arguments() { return_other_args_list="" return_isystem_was_used="" + + return_isystem_spack_store_include_dirs_list="" return_isystem_system_include_dirs_list="" return_isystem_include_dirs_list="" + + return_spack_store_include_dirs_list="" return_system_include_dirs_list="" return_include_dirs_list="" + + return_spack_store_lib_dirs_list="" return_system_lib_dirs_list="" return_lib_dirs_list="" + + return_spack_store_rpath_dirs_list="" return_system_rpath_dirs_list="" return_rpath_dirs_list="" @@ -546,29 +556,32 @@ categorize_arguments() { arg="${1#-isystem}" return_isystem_was_used=true if [ -z "$arg" ]; then shift; arg="$1"; fi - if system_dir "$arg"; then - append return_isystem_system_include_dirs_list "$arg" - else - append return_isystem_include_dirs_list "$arg" - fi + path_order "$arg" + case $? in + 0) append return_isystem_spack_store_include_dirs_list "$arg" ;; + 1) append return_isystem_include_dirs_list "$arg" ;; + 2) append return_isystem_system_include_dirs_list "$arg" ;; + esac ;; -I*) arg="${1#-I}" if [ -z "$arg" ]; then shift; arg="$1"; fi - if system_dir "$arg"; then - append return_system_include_dirs_list "$arg" - else - append return_include_dirs_list "$arg" - fi + path_order "$arg" + case $? in + 0) append return_spack_store_include_dirs_list "$arg" ;; + 1) append return_include_dirs_list "$arg" ;; + 2) append return_system_include_dirs_list "$arg" ;; + esac ;; -L*) arg="${1#-L}" if [ -z "$arg" ]; then shift; arg="$1"; fi - if system_dir "$arg"; then - append return_system_lib_dirs_list "$arg" - else - append return_lib_dirs_list "$arg" - fi + path_order "$arg" + case $? in + 0) append return_spack_store_lib_dirs_list "$arg" ;; + 1) append return_lib_dirs_list "$arg" ;; + 2) append return_system_lib_dirs_list "$arg" ;; + esac ;; -l*) # -loopopt=0 is generated erroneously in autoconf <= 2.69, @@ -601,29 +614,32 @@ categorize_arguments() { break elif [ "$xlinker_expect_rpath" = yes ]; then # Register the path of -Xlinker -rpath <other args> -Xlinker <path> - if system_dir "$1"; then - append return_system_rpath_dirs_list "$1" - else - append return_rpath_dirs_list "$1" - fi + path_order "$1" + case $? in + 0) append return_spack_store_rpath_dirs_list "$1" ;; + 1) append return_rpath_dirs_list "$1" ;; + 2) append return_system_rpath_dirs_list "$1" ;; + esac xlinker_expect_rpath=no else case "$1" in -rpath=*) arg="${1#-rpath=}" - if system_dir "$arg"; then - append return_system_rpath_dirs_list "$arg" - else - append return_rpath_dirs_list "$arg" - fi + path_order "$arg" + case $? in + 0) append return_spack_store_rpath_dirs_list "$arg" ;; + 1) append return_rpath_dirs_list "$arg" ;; + 2) append return_system_rpath_dirs_list "$arg" ;; + esac ;; --rpath=*) arg="${1#--rpath=}" - if system_dir "$arg"; then - append return_system_rpath_dirs_list "$arg" - else - append return_rpath_dirs_list "$arg" - fi + path_order "$arg" + case $? in + 0) append return_spack_store_rpath_dirs_list "$arg" ;; + 1) append return_rpath_dirs_list "$arg" ;; + 2) append return_system_rpath_dirs_list "$arg" ;; + esac ;; -rpath|--rpath) xlinker_expect_rpath=yes @@ -661,16 +677,25 @@ categorize_arguments() { } categorize_arguments "$@" - include_dirs_list="$return_include_dirs_list" - lib_dirs_list="$return_lib_dirs_list" - rpath_dirs_list="$return_rpath_dirs_list" - system_include_dirs_list="$return_system_include_dirs_list" - system_lib_dirs_list="$return_system_lib_dirs_list" - system_rpath_dirs_list="$return_system_rpath_dirs_list" - isystem_was_used="$return_isystem_was_used" - isystem_system_include_dirs_list="$return_isystem_system_include_dirs_list" - isystem_include_dirs_list="$return_isystem_include_dirs_list" - other_args_list="$return_other_args_list" + +spack_store_include_dirs_list="$return_spack_store_include_dirs_list" +system_include_dirs_list="$return_system_include_dirs_list" +include_dirs_list="$return_include_dirs_list" + +spack_store_lib_dirs_list="$return_spack_store_lib_dirs_list" +system_lib_dirs_list="$return_system_lib_dirs_list" +lib_dirs_list="$return_lib_dirs_list" + +spack_store_rpath_dirs_list="$return_spack_store_rpath_dirs_list" +system_rpath_dirs_list="$return_system_rpath_dirs_list" +rpath_dirs_list="$return_rpath_dirs_list" + +isystem_spack_store_include_dirs_list="$return_isystem_spack_store_include_dirs_list" +isystem_system_include_dirs_list="$return_isystem_system_include_dirs_list" +isystem_include_dirs_list="$return_isystem_include_dirs_list" + +isystem_was_used="$return_isystem_was_used" +other_args_list="$return_other_args_list" # # Add flags from Spack's cppflags, cflags, cxxflags, fcflags, fflags, and @@ -738,16 +763,25 @@ esac IFS="$lsep" categorize_arguments $spack_flags_list unset IFS - spack_flags_include_dirs_list="$return_include_dirs_list" - spack_flags_lib_dirs_list="$return_lib_dirs_list" - spack_flags_rpath_dirs_list="$return_rpath_dirs_list" - spack_flags_system_include_dirs_list="$return_system_include_dirs_list" - spack_flags_system_lib_dirs_list="$return_system_lib_dirs_list" - spack_flags_system_rpath_dirs_list="$return_system_rpath_dirs_list" - spack_flags_isystem_was_used="$return_isystem_was_used" - spack_flags_isystem_system_include_dirs_list="$return_isystem_system_include_dirs_list" - spack_flags_isystem_include_dirs_list="$return_isystem_include_dirs_list" - spack_flags_other_args_list="$return_other_args_list" + +spack_flags_isystem_spack_store_include_dirs_list="$return_isystem_spack_store_include_dirs_list" +spack_flags_isystem_system_include_dirs_list="$return_isystem_system_include_dirs_list" +spack_flags_isystem_include_dirs_list="$return_isystem_include_dirs_list" + +spack_flags_spack_store_include_dirs_list="$return_spack_store_include_dirs_list" +spack_flags_system_include_dirs_list="$return_system_include_dirs_list" +spack_flags_include_dirs_list="$return_include_dirs_list" + +spack_flags_spack_store_lib_dirs_list="$return_spack_store_lib_dirs_list" +spack_flags_system_lib_dirs_list="$return_system_lib_dirs_list" +spack_flags_lib_dirs_list="$return_lib_dirs_list" + +spack_flags_spack_store_rpath_dirs_list="$return_spack_store_rpath_dirs_list" +spack_flags_system_rpath_dirs_list="$return_system_rpath_dirs_list" +spack_flags_rpath_dirs_list="$return_rpath_dirs_list" + +spack_flags_isystem_was_used="$return_isystem_was_used" +spack_flags_other_args_list="$return_other_args_list" # On macOS insert headerpad_max_install_names linker flag @@ -767,11 +801,13 @@ if [ "$mode" = ccld ] || [ "$mode" = ld ]; then # Append RPATH directories. Note that in the case of the # top-level package these directories may not exist yet. For dependencies # it is assumed that paths have already been confirmed. + extend spack_store_rpath_dirs_list SPACK_STORE_RPATH_DIRS extend rpath_dirs_list SPACK_RPATH_DIRS fi fi if [ "$mode" = ccld ] || [ "$mode" = ld ]; then + extend spack_store_lib_dirs_list SPACK_STORE_LINK_DIRS extend lib_dirs_list SPACK_LINK_DIRS fi @@ -798,38 +834,50 @@ case "$mode" in ;; esac +case "$mode" in + cpp|cc|as|ccld) + if [ "$spack_flags_isystem_was_used" = "true" ] || [ "$isystem_was_used" = "true" ]; then + extend isystem_spack_store_include_dirs_list SPACK_STORE_INCLUDE_DIRS + extend isystem_include_dirs_list SPACK_INCLUDE_DIRS + else + extend spack_store_include_dirs_list SPACK_STORE_INCLUDE_DIRS + extend include_dirs_list SPACK_INCLUDE_DIRS + fi + ;; +esac + # # Finally, reassemble the command line. # args_list="$flags_list" -# Insert include directories just prior to any system include directories +# Include search paths partitioned by (in store, non-sytem, system) # NOTE: adding ${lsep} to the prefix here turns every added element into two -extend args_list spack_flags_include_dirs_list "-I" -extend args_list include_dirs_list "-I" +extend args_list spack_flags_spack_store_include_dirs_list -I +extend args_list spack_store_include_dirs_list -I + +extend args_list spack_flags_include_dirs_list -I +extend args_list include_dirs_list -I + +extend args_list spack_flags_isystem_spack_store_include_dirs_list "-isystem${lsep}" +extend args_list isystem_spack_store_include_dirs_list "-isystem${lsep}" + extend args_list spack_flags_isystem_include_dirs_list "-isystem${lsep}" extend args_list isystem_include_dirs_list "-isystem${lsep}" -case "$mode" in - cpp|cc|as|ccld) - if [ "$spack_flags_isystem_was_used" = "true" ]; then - extend args_list SPACK_INCLUDE_DIRS "-isystem${lsep}" - elif [ "$isystem_was_used" = "true" ]; then - extend args_list SPACK_INCLUDE_DIRS "-isystem${lsep}" - else - extend args_list SPACK_INCLUDE_DIRS "-I" - fi - ;; -esac - extend args_list spack_flags_system_include_dirs_list -I extend args_list system_include_dirs_list -I + extend args_list spack_flags_isystem_system_include_dirs_list "-isystem${lsep}" extend args_list isystem_system_include_dirs_list "-isystem${lsep}" -# Library search paths +# Library search paths partitioned by (in store, non-sytem, system) +extend args_list spack_flags_spack_store_lib_dirs_list "-L" +extend args_list spack_store_lib_dirs_list "-L" + extend args_list spack_flags_lib_dirs_list "-L" extend args_list lib_dirs_list "-L" + extend args_list spack_flags_system_lib_dirs_list "-L" extend args_list system_lib_dirs_list "-L" @@ -839,8 +887,12 @@ case "$mode" in if [ -n "$dtags_to_add" ] ; then append args_list "$linker_arg$dtags_to_add" fi + extend args_list spack_flags_spack_store_rpath_dirs_list "$rpath" + extend args_list spack_store_rpath_dirs_list "$rpath" + extend args_list spack_flags_rpath_dirs_list "$rpath" extend args_list rpath_dirs_list "$rpath" + extend args_list spack_flags_system_rpath_dirs_list "$rpath" extend args_list system_rpath_dirs_list "$rpath" ;; @@ -848,8 +900,12 @@ case "$mode" in if [ -n "$dtags_to_add" ] ; then append args_list "$dtags_to_add" fi + extend args_list spack_flags_spack_store_rpath_dirs_list "-rpath${lsep}" + extend args_list spack_store_rpath_dirs_list "-rpath${lsep}" + extend args_list spack_flags_rpath_dirs_list "-rpath${lsep}" extend args_list rpath_dirs_list "-rpath${lsep}" + extend args_list spack_flags_system_rpath_dirs_list "-rpath${lsep}" extend args_list system_rpath_dirs_list "-rpath${lsep}" ;; |