cc: don't use sed to filter system directories

- filtering using sed causes most builds to slow down quite a bit, as the
  compiler wrapper has to run sed many times, and *it* runs many times

- do the system directory parsing directly in bash
This commit is contained in:
Todd Gamblin 2018-08-06 03:29:53 -07:00
parent 0e81f6cba5
commit b84067f6db
2 changed files with 93 additions and 42 deletions

99
lib/spack/env/cc vendored
View file

@ -74,6 +74,18 @@ function die {
exit 1
}
# test whether a path is a system directory
function system_dir {
path="$1"
for sd in ${SPACK_SYSTEM_DIRS[@]}; do
if [ "${path}" == "${sd}" -o "${path}" == "${sd}/" ]; then
# success if path starts with a system prefix
return 0
fi
done
return 1 # fail if path starts no system prefix
}
for param in ${parameters[@]}; do
if [[ -z ${!param} ]]; then
die "Spack compiler must be run from Spack! Input '$param' is missing."
@ -255,21 +267,33 @@ args=()
#
includes=()
libdirs=()
libs=()
rpaths=()
system_includes=()
system_libdirs=()
system_rpaths=()
libs=()
other_args=()
while [ -n "$1" ]; do
rp=""
case "$1" in
-I*)
arg="${1#-I}"
if [ -z "$arg" ]; then shift; arg="$1"; fi
includes+=("$arg")
if system_dir "$arg"; then
system_includes+=("$arg")
else
includes+=("$arg")
fi
;;
-L*)
arg="${1#-L}"
if [ -z "$arg" ]; then shift; arg="$1"; fi
libdirs+=("$arg")
if system_dir "$arg"; then
system_libdirs+=("$arg")
else
libdirs+=("$arg")
fi
;;
-l*)
arg="${1#-l}"
@ -280,15 +304,15 @@ while [ -n "$1" ]; do
arg="${1#-Wl,}"
if [ -z "$arg" ]; then shift; arg="$1"; fi
if [[ "$arg" = -rpath=* ]]; then
rpaths+=("${arg#-rpath=}")
rp="${arg#-rpath=}"
elif [[ "$arg" = -rpath,* ]]; then
rpaths+=("${arg#-rpath,}")
rp="${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,}")
rp="${arg#-Wl,}"
else
other_args+=("-Wl,$arg")
fi
@ -297,13 +321,13 @@ while [ -n "$1" ]; do
arg="${1#-Xlinker,}"
if [ -z "$arg" ]; then shift; arg="$1"; fi
if [[ "$arg" = -rpath=* ]]; then
rpaths+=("${arg#-rpath=}")
rp="${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,}")
rp="${arg#-Xlinker,}"
else
other_args+=("-Xlinker,$arg")
fi
@ -314,7 +338,7 @@ while [ -n "$1" ]; do
die "-Xlinker,-rpath was not followed by -Xlinker,*"
fi
shift 3;
rpaths+=("$1")
rp="$1"
else
other_args+=("$1")
fi
@ -323,6 +347,15 @@ while [ -n "$1" ]; do
other_args+=("$1")
;;
esac
# test rpaths against system directories in one place.
if [ -n "$rp" ]; then
if system_dir "$rp"; then
system_rpaths+=("$rp")
else
rpaths+=("$rp")
fi
fi
shift
done
@ -417,44 +450,26 @@ case "$mode" in
;;
esac
# 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 back together in one list
# Includes first
for dir in "${includes[@]}"; do
args+=("-I$dir");
done
# Includes and system includes first
for dir in "${includes[@]}"; do args+=("-I$dir"); done
for dir in "${system_includes[@]}"; do args+=("-I$dir"); done
# Library search paths
for dir in "${libdirs[@]}"; do
args+=("-L$dir");
done
for dir in "${libdirs[@]}"; do args+=("-L$dir"); done
for dir in "${system_libdirs[@]}"; do args+=("-L$dir"); done
# RPATHs arguments
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
case "$mode" in
ccld)
for dir in "${rpaths[@]}"; do args+=("$rpath$dir"); done
for dir in "${system_rpaths[@]}"; do args+=("$rpath$dir"); done
;;
ld)
for dir in "${rpaths[@]}"; do args+=("-rpath" "$dir"); done
for dir in "${system_rpaths[@]}"; do args+=("-rpath" "$dir"); done
;;
esac
# Other arguments from the input command
args+=("${other_args[@]}")

View file

@ -432,6 +432,42 @@ def test_cc_deps(dep1, dep2, dep3, dep4):
test_args_without_paths)
def test_ccld_with_system_dirs(dep1, dep2, dep3, dep4):
"""Ensure all flags are added in ccld mode."""
deps = ':'.join((dep1, dep2, dep3, dep4))
with set_env(SPACK_DEPENDENCIES=deps,
SPACK_RPATH_DEPS=deps,
SPACK_LINK_DEPS=deps):
sys_path_args = ['-I/usr/include',
'-L/usr/local/lib',
'-Wl,-rpath,/usr/lib64',
'-I/usr/local/include',
'-L/lib64/']
check_cc(
'dump-args', sys_path_args + test_args,
[real_cc] +
test_include_paths +
['-I' + dep1 + '/include',
'-I' + dep3 + '/include',
'-I' + dep4 + '/include'] +
['-I/usr/include',
'-I/usr/local/include'] +
test_library_paths +
['-L' + dep1 + '/lib',
'-L' + dep2 + '/lib64',
'-L' + dep3 + '/lib64'] +
['-L/usr/local/lib',
'-L/lib64/'] +
test_wl_rpaths +
pkg_wl_rpaths +
['-Wl,-rpath,' + dep1 + '/lib',
'-Wl,-rpath,' + dep2 + '/lib64',
'-Wl,-rpath,' + dep3 + '/lib64'] +
['-Wl,-rpath,/usr/lib64'] +
test_args_without_paths)
def test_ld_deps(dep1, dep2, dep3, dep4):
"""Ensure no (extra) -I args or -Wl, are passed in ld mode."""
deps = ':'.join((dep1, dep2, dep3, dep4))