summaryrefslogtreecommitdiff
path: root/lib/spack/env/cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/spack/env/cc')
-rwxr-xr-xlib/spack/env/cc244
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}"
;;