summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2016-03-27 13:38:06 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2016-03-27 13:38:06 -0700
commitec107b290f0ad949f4f4008715b6860798220a7e (patch)
tree0f431e0506be36e196ac7ae98d398b6391c41495
parentb0b882cbb3d903a85413acb0439a02d6ac9e26fc (diff)
parentf3ea0420f80f418a0f3e628479c782f197e6a43e (diff)
downloadspack-ec107b290f0ad949f4f4008715b6860798220a7e.tar.gz
spack-ec107b290f0ad949f4f4008715b6860798220a7e.tar.bz2
spack-ec107b290f0ad949f4f4008715b6860798220a7e.tar.xz
spack-ec107b290f0ad949f4f4008715b6860798220a7e.zip
Merge branch 'correct-cc' of git://github.com/eschnett/spack into eschnett-correct-cc
-rwxr-xr-xlib/spack/env/cc254
1 files changed, 128 insertions, 126 deletions
diff --git a/lib/spack/env/cc b/lib/spack/env/cc
index 4a3e6eddc9..c6a09724e9 100755
--- a/lib/spack/env/cc
+++ b/lib/spack/env/cc
@@ -65,7 +65,7 @@ function die {
}
for param in $parameters; do
- if [ -z "${!param}" ]; then
+ if [[ -z ${!param} ]]; then
die "Spack compiler must be run from spack! Input $param was missing!"
fi
done
@@ -78,10 +78,11 @@ done
# 'command' is set based on the input command to $SPACK_[CC|CXX|F77|F90]
#
# 'mode' is set to one of:
+# cpp preprocess
# cc compile
+# as assemble
# ld link
# ccld compile & link
-# cpp preprocessor
# vcheck version check
#
command=$(basename "$0")
@@ -131,6 +132,9 @@ if [ -z "$mode" ]; then
if [ "$arg" = -E ]; then
mode=cpp
break
+ elif [ "$arg" = -S ]; then
+ mode=as
+ break
elif [ "$arg" = -c ]; then
mode=cc
break
@@ -146,96 +150,98 @@ fi
# Check that at least one of the real commands was actually selected,
# otherwise we don't know what to execute.
-if [ -z "$command" ]; then
+if [[ -z $command ]]; then
die "ERROR: Compiler '$SPACK_COMPILER_SPEC' does not support compiling $language programs."
fi
-# Save original command for debug logging
-input_command="$@"
-
if [ "$mode" == vcheck ] ; then
exec ${command} "$@"
fi
-#
-# Now do real parsing of 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.
-#
-includes=()
-libraries=()
-libs=()
-rpaths=()
-other_args=()
+# Save original command for debug logging
+input_command="$@"
+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
- libraries+=("$arg")
- ;;
- -l*)
- arg="${1#-l}"
- if [ -z "$arg" ]; then shift; arg="$1"; fi
- libs+=("$arg")
- ;;
- -Wl,*)
- arg="${1#-Wl,}"
- # TODO: Handle multiple -Wl, continuations of -Wl,-rpath
- if [[ $arg == -rpath=* ]]; then
- arg="${arg#-rpath=}"
- for rpath in ${arg//,/ }; do
- rpaths+=("$rpath")
- done
- elif [[ $arg == -rpath,* ]]; then
- arg="${arg#-rpath,}"
- for rpath in ${arg//,/ }; do
- rpaths+=("$rpath")
- done
- elif [[ $arg == -rpath ]]; then
- shift; arg="$1"
- if [[ $arg != '-Wl,'* ]]; then
- die "-Wl,-rpath was not followed by -Wl,*"
+# Dump parsed values for unit testing if asked for
+if [[ -n $SPACK_TEST_COMMAND ]]; then
+
+ #
+ # Now do real parsing of 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.
+ #
+ includes=()
+ libraries=()
+ 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
+ libraries+=("$arg")
+ ;;
+ -l*)
+ arg="${1#-l}"
+ if [ -z "$arg" ]; then shift; arg="$1"; fi
+ libs+=("$arg")
+ ;;
+ -Wl,*)
+ arg="${1#-Wl,}"
+ # TODO: Handle multiple -Wl, continuations of -Wl,-rpath
+ if [[ $arg == -rpath=* ]]; then
+ arg="${arg#-rpath=}"
+ for rpath in ${arg//,/ }; do
+ rpaths+=("$rpath")
+ done
+ elif [[ $arg == -rpath,* ]]; then
+ arg="${arg#-rpath,}"
+ for rpath in ${arg//,/ }; do
+ rpaths+=("$rpath")
+ done
+ elif [[ $arg == -rpath ]]; then
+ shift; arg="$1"
+ if [[ $arg != '-Wl,'* ]]; then
+ die "-Wl,-rpath was not followed by -Wl,*"
+ fi
+ arg="${arg#-Wl,}"
+ for rpath in ${arg//,/ }; do
+ rpaths+=("$rpath")
+ done
+ else
+ other_args+=("-Wl,$arg")
fi
- arg="${arg#-Wl,}"
- for rpath in ${arg//,/ }; do
- rpaths+=("$rpath")
- done
- else
- other_args+=("-Wl,$arg")
- fi
- ;;
- -Xlinker)
- shift; arg="$1";
- 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 <arg>"
+ ;;
+ -Xlinker)
+ shift; arg="$1";
+ 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 <arg>"
+ fi
+ shift; arg="$1"
+ rpaths+=("$arg")
+ else
+ other_args+=("-Xlinker")
+ other_args+=("$arg")
fi
- shift; arg="$1"
- rpaths+=("$arg")
- else
- other_args+=("-Xlinker")
- other_args+=("$arg")
- fi
- ;;
- *)
- other_args+=("$1")
- ;;
- esac
- shift
-done
+ ;;
+ *)
+ other_args+=("$1")
+ ;;
+ esac
+ shift
+ done
-# Dump parsed values for unit testing if asked for
-if [ -n "$SPACK_TEST_COMMAND" ]; then
IFS=$'\n'
case "$SPACK_TEST_COMMAND" in
dump-includes) echo "${includes[*]}";;
@@ -260,8 +266,8 @@ if [ -n "$SPACK_TEST_COMMAND" ]; then
echo "${other_args[*]}"
;;
*)
- echo "ERROR: Unknown test command"
- exit 1 ;;
+ die "ERROR: Unknown test command"
+ ;;
esac
exit
fi
@@ -269,45 +275,46 @@ fi
# Read spack dependencies from the path environment variable
IFS=':' read -ra deps <<< "$SPACK_DEPENDENCIES"
for dep in "${deps[@]}"; do
- if [ -d "$dep/include" ]; then
- includes+=("$dep/include")
+ if [[ -d $dep/include ]]; then
+ if [[ $mode = cpp || $mode = cc || $mode = as || $mode = ccld ]]; then
+ args=("-I$dep/include" "${args[@]}")
+ fi
fi
- if [ -d "$dep/lib" ]; then
- libraries+=("$dep/lib")
- rpaths+=("$dep/lib")
+ if [[ -d $dep/lib ]]; then
+ # libraries+=("$dep/lib")
+ if [[ $mode = ccld ]]; then
+ args=("-L$dep/lib" "-Wl,-rpath,$dep/lib" "${args[@]}")
+ elif [[ $mode = ld ]]; then
+ args=("-L$dep/lib" "-rpath" "$dep/lib" "${args[@]}")
+ fi
fi
- if [ -d "$dep/lib64" ]; then
- libraries+=("$dep/lib64")
- rpaths+=("$dep/lib64")
+ if [[ -d $dep/lib64 ]]; then
+ # libraries+=("$dep/lib64")
+ if [[ $mode = ccld ]]; then
+ args=("-L$dep/lib" "-Wl,-rpath,$dep/lib" "${args[@]}")
+ elif [[ $mode = ld ]]; then
+ args=("-L$dep/lib" "-rpath" "$dep/lib" "${args[@]}")
+ fi
fi
done
# Include all -L's and prefix/whatever dirs in rpath
-for dir in "${libraries[@]}"; do
- [[ dir = $SPACK_INSTALL* ]] && rpaths+=("$dir")
-done
-rpaths+=("$SPACK_PREFIX/lib")
-rpaths+=("$SPACK_PREFIX/lib64")
-
-# Put the arguments together
-args=()
-for dir in "${includes[@]}"; do args+=("-I$dir"); done
-args+=("${other_args[@]}")
-for dir in "${libraries[@]}"; do args+=("-L$dir"); done
-for lib in "${libs[@]}"; do args+=("-l$lib"); done
-
-if [ "$mode" = ccld ]; then
- for dir in "${rpaths[@]}"; do
- args+=("-Wl,-rpath")
- args+=("-Wl,$dir");
- done
-elif [ "$mode" = ld ]; then
- for dir in "${rpaths[@]}"; do
- args+=("-rpath")
- args+=("$dir");
- done
+if [[ $mode = ccld ]]; then
+ # for dir in "${libraries[@]}"; do
+ # if [[ dir = $SPACK_INSTALL* ]]; then
+ # args=("-Wl,-rpath,$dir" "${args[@]}")
+ # fi
+ # done
+ args=("-Wl,-rpath,$SPACK_PREFIX/lib" "-Wl,-rpath,$SPACK_PREFIX/lib64" "${args[@]}")
+elif [[ $mode = ld ]]; then
+ # for dir in "${libraries[@]}"; do
+ # if [[ dir = $SPACK_INSTALL* ]]; then
+ # args=("-rpath" "$dir" "${args[@]}")
+ # fi
+ # done
+ args=("-rpath" "$SPACK_PREFIX/lib" "-rpath" "$SPACK_PREFIX/lib64" "${args[@]}")
fi
#
@@ -323,33 +330,28 @@ unset DYLD_LIBRARY_PATH
#
IFS=':' read -ra env_path <<< "$PATH"
IFS=':' read -ra spack_env_dirs <<< "$SPACK_ENV_PATH"
-spack_env_dirs+=(".")
+spack_env_dirs+=("" ".")
PATH=""
for dir in "${env_path[@]}"; do
remove=""
for rm_dir in "${spack_env_dirs[@]}"; do
- if [ "$dir" = "$rm_dir" ]; then remove=True; fi
+ if [[ $dir = $rm_dir ]]; then remove=True; fi
done
- if [ -z "$remove" ]; then
- if [ -z "$PATH" ]; then
- PATH="$dir"
- else
- PATH="$PATH:$dir"
- fi
+ if [[ -z $remove ]]; then
+ PATH="${PATH:+$PATH:}$dir"
fi
done
export PATH
-full_command=("$command")
-full_command+=("${args[@]}")
+full_command=("$command" "${args[@]}")
#
# Write the input and output commands to debug logs if it's asked for.
#
-if [ "$SPACK_DEBUG" = "TRUE" ]; then
+if [[ $SPACK_DEBUG = TRUE ]]; then
input_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_SHORT_SPEC.in.log"
output_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_SHORT_SPEC.out.log"
- echo "$input_command" >> $input_log
+ echo "$input_command" >> $input_log
echo "$mode ${full_command[@]}" >> $output_log
fi