2015-04-09 04:17:46 +08:00
#!/bin/sh
2011-03-17 00:17:32 +08:00
2016-01-26 22:15:10 +08:00
# /bin/sh on Solaris is not a POSIX compatible shell, but /usr/bin/bash is.
2016-01-22 00:30:22 +08:00
if [ `uname -s` = 'SunOS' -a "${POSIX_SHELL}" != "true" ]; then
POSIX_SHELL="true"
export POSIX_SHELL
2016-01-26 22:15:10 +08:00
exec /usr/bin/env bash $0 "$@"
2016-01-22 00:30:22 +08:00
fi
2016-01-26 22:15:10 +08:00
unset POSIX_SHELL # clear it so if we invoke other scripts, they run as bash as well
2016-01-22 00:30:22 +08:00
2011-03-18 14:51:45 +08:00
msg() {
2015-05-22 12:25:01 +08:00
echo "configure: $*"
2011-03-18 14:51:45 +08:00
}
2011-03-17 08:36:49 +08:00
2011-03-30 12:45:09 +08:00
step_msg() {
msg
msg "$1"
msg
}
2011-09-24 01:50:06 +08:00
warn() {
echo "configure: WARNING: $1"
}
2011-03-18 14:51:45 +08:00
err() {
echo "configure: error: $1"
exit 1
}
2015-04-27 15:58:31 +08:00
run() {
msg "$@"
"$@"
}
2012-01-06 10:59:54 +08:00
need_ok() {
if [ $? -ne 0 ]
then
2014-03-02 13:39:05 +08:00
err "$1"
2012-01-06 10:59:54 +08:00
fi
}
2011-03-20 09:31:59 +08:00
need_cmd() {
2014-03-29 12:16:41 +08:00
if command -v $1 >/dev/null 2>&1
2015-05-22 12:20:04 +08:00
then msg "found program '$1'"
else err "program '$1' is missing, please install it"
2011-03-20 09:31:59 +08:00
fi
}
2011-03-18 14:51:45 +08:00
make_dir() {
if [ ! -d $1 ]
then
2015-04-27 15:58:31 +08:00
run mkdir -p $1
2011-03-18 14:51:45 +08:00
fi
}
2012-02-29 04:05:05 +08:00
copy_if_changed() {
if cmp -s $1 $2
then
msg "leaving $2 unchanged"
else
2015-04-27 15:58:31 +08:00
run cp -f $1 $2
2012-02-29 10:41:54 +08:00
chmod u-w $2 # make copied artifact read-only
2012-02-29 04:05:05 +08:00
fi
}
move_if_changed() {
if cmp -s $1 $2
then
msg "leaving $2 unchanged"
else
2015-04-27 15:58:31 +08:00
run mv -f $1 $2
2012-02-29 10:41:54 +08:00
chmod u-w $2 # make moved artifact read-only
2012-02-29 04:05:05 +08:00
fi
2011-03-18 14:51:45 +08:00
}
2011-03-17 00:17:32 +08:00
2011-03-17 08:36:49 +08:00
putvar() {
local T
eval T=\$$1
2011-03-20 09:32:19 +08:00
eval TLEN=\${#$1}
if [ $TLEN -gt 35 ]
then
printf "configure: %-20s := %.35s ...\n" $1 "$T"
else
2012-04-10 18:25:59 +08:00
printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
2011-03-20 09:32:19 +08:00
fi
2012-02-29 04:05:05 +08:00
printf "%-20s := %s\n" $1 "$T" >>config.tmp
2011-03-17 08:36:49 +08:00
}
2014-11-06 07:33:18 +08:00
putpathvar() {
local T
eval T=\$$1
eval TLEN=\${#$1}
if [ $TLEN -gt 35 ]
then
printf "configure: %-20s := %.35s ...\n" $1 "$T"
else
printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
fi
2014-11-07 21:17:11 +08:00
if [ -z "$T" ]
then
printf "%-20s := \n" $1 >>config.tmp
else
printf "%-20s := \"%s\"\n" $1 "$T" >>config.tmp
fi
2014-11-06 07:33:18 +08:00
}
2011-03-17 08:36:49 +08:00
probe() {
local V=$1
2012-01-20 05:08:01 +08:00
shift
local P
2011-03-17 08:36:49 +08:00
local T
2012-01-20 05:08:01 +08:00
for P
do
2014-03-29 12:16:41 +08:00
T=$(command -v $P 2>&1)
2012-01-20 05:08:01 +08:00
if [ $? -eq 0 ]
then
2015-05-08 18:35:40 +08:00
VER0=$($P --version 2>/dev/null \
| grep -o '[vV]\?[0-9][0-9.][a-z0-9.-]*' | head -1 )
2012-04-10 18:25:59 +08:00
if [ $? -eq 0 -a "x${VER0}" != "x" ]
then
VER="($VER0)"
else
VER=""
fi
2012-01-20 05:08:01 +08:00
break
else
2012-04-10 18:25:59 +08:00
VER=""
2012-01-20 05:08:01 +08:00
T=""
fi
done
2011-03-17 08:36:49 +08:00
eval $V=\$T
2014-11-06 07:33:18 +08:00
putpathvar $V "$VER"
2011-03-17 08:36:49 +08:00
}
2011-03-18 14:51:45 +08:00
probe_need() {
2012-01-20 05:08:01 +08:00
probe $*
2016-06-03 19:53:46 +08:00
local V=$1
shift
2011-03-18 14:51:45 +08:00
eval VV=\$$V
if [ -z "$VV" ]
then
2016-06-03 19:53:46 +08:00
err "$V needed, but unable to find any of: $*"
2011-03-18 14:51:45 +08:00
fi
}
2012-12-01 12:20:18 +08:00
validate_opt () {
for arg in $CFG_CONFIGURE_ARGS
do
isArgValid=0
for option in $BOOL_OPTIONS
do
if test --disable-$option = $arg
then
isArgValid=1
fi
if test --enable-$option = $arg
then
isArgValid=1
fi
done
for option in $VAL_OPTIONS
do
if echo "$arg" | grep -q -- "--$option="
then
isArgValid=1
fi
done
2013-03-23 09:21:43 +08:00
if [ "$arg" = "--help" ]
2012-12-01 12:20:18 +08:00
then
2013-06-06 20:07:31 +08:00
echo
2013-03-23 09:21:43 +08:00
echo "No more help available for Configure options,"
echo "check the Wiki or join our IRC channel"
break
else
if test $isArgValid -eq 0
then
err "Option '$arg' is not recognized"
fi
2012-12-01 12:20:18 +08:00
fi
done
}
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
# `valopt OPTION_NAME DEFAULT DOC` extracts a string-valued option
# from command line, using provided default value for the option if
# not present, and saves it to the generated config.mk.
#
# `valopt_nosave` is much the same, except that it does not save the
# result to config.mk (instead the script should use `putvar` itself
# later on to save it). `valopt_core` is the core upon which the
# other two are built.
2012-12-01 12:20:18 +08:00
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
valopt_core() {
VAL_OPTIONS="$VAL_OPTIONS $2"
local SAVE=$1
local OP=$2
local DEFAULT=$3
shift
2011-11-03 06:58:21 +08:00
shift
shift
local DOC="$*"
if [ $HELP -eq 0 ]
then
2011-12-14 08:46:08 +08:00
local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
2011-11-03 07:03:34 +08:00
local V="CFG_${UOP}"
2015-04-14 15:43:59 +08:00
local V_PROVIDED="${V}_PROVIDED"
2011-11-03 07:03:34 +08:00
eval $V="$DEFAULT"
2011-11-03 06:58:21 +08:00
for arg in $CFG_CONFIGURE_ARGS
do
if echo "$arg" | grep -q -- "--$OP="
then
val=$(echo "$arg" | cut -f2 -d=)
eval $V=$val
2015-04-14 15:43:59 +08:00
eval $V_PROVIDED=1
2011-11-03 06:58:21 +08:00
fi
done
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
if [ "$SAVE" = "save" ]
then
putvar $V
fi
2011-11-03 06:58:21 +08:00
else
2011-11-03 07:03:34 +08:00
if [ -z "$DEFAULT" ]
then
DEFAULT="<none>"
fi
OP="${OP}=[${DEFAULT}]"
printf " --%-30s %s\n" "$OP" "$DOC"
2011-11-03 06:58:21 +08:00
fi
}
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
valopt_nosave() {
valopt_core nosave "$@"
}
valopt() {
valopt_core save "$@"
}
2012-12-01 12:20:18 +08:00
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
# `opt OPTION_NAME DEFAULT DOC` extracts a boolean-valued option from
# command line, using the provided default value (0/1) for the option
# if not present, and saves it to the generated config.mk.
#
# `opt_nosave` is much the same, except that it does not save the
# result to config.mk (instead the script should use `putvar` itself
# later on to save it). `opt_core` is the core upon which the other
# two are built.
opt_core() {
BOOL_OPTIONS="$BOOL_OPTIONS $2"
local SAVE=$1
local OP=$2
local DEFAULT=$3
shift
2011-03-30 12:45:09 +08:00
shift
shift
local DOC="$*"
local FLAG=""
if [ $DEFAULT -eq 0 ]
then
FLAG="enable"
2015-04-14 15:43:59 +08:00
DEFAULT_FLAG="disable"
2011-03-30 12:45:09 +08:00
else
FLAG="disable"
2015-04-14 15:43:59 +08:00
DEFAULT_FLAG="enable"
2011-03-30 12:45:09 +08:00
DOC="don't $DOC"
fi
if [ $HELP -eq 0 ]
then
for arg in $CFG_CONFIGURE_ARGS
do
if [ "$arg" = "--${FLAG}-${OP}" ]
then
2011-06-28 02:53:04 +08:00
OP=$(echo $OP | tr 'a-z-' 'A-Z_')
2011-03-30 12:45:09 +08:00
FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
local V="CFG_${FLAG}_${OP}"
2015-04-14 15:43:59 +08:00
local V_PROVIDED="CFG_${FLAG}_${OP}_PROVIDED"
2011-03-30 12:45:09 +08:00
eval $V=1
2015-04-14 15:43:59 +08:00
eval $V_PROVIDED=1
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
if [ "$SAVE" = "save" ]
then
putvar $V
fi
2015-04-14 15:43:59 +08:00
elif [ "$arg" = "--${DEFAULT_FLAG}-${OP}" ]
then
OP=$(echo $OP | tr 'a-z-' 'A-Z_')
DEFAULT_FLAG=$(echo $DEFAULT_FLAG | tr 'a-z' 'A-Z')
local V_PROVIDED="CFG_${DEFAULT_FLAG}_${OP}_PROVIDED"
eval $V_PROVIDED=1
2011-03-30 12:45:09 +08:00
fi
done
else
2015-07-27 05:18:30 +08:00
if [ -n "$META" ]
2011-03-30 12:45:09 +08:00
then
OP="$OP=<$META>"
fi
printf " --%-30s %s\n" "$FLAG-$OP" "$DOC"
fi
}
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
opt_nosave() {
opt_core nosave "$@"
}
opt() {
opt_core save "$@"
}
Make configure respect (and save) values for `CC`, `CXX`, `CFLAGS`, etc.
I mostly tried to remain backwards compatible with old invocations of
the `configure` script; if you do not want to use `CC` et al., you
should not have to; you can keep using `--enable-clang` and/or
`--enable-ccache`.
The overall intention is to capture the following precedences for
guessing the C compiler:
1. Value of `CC` at make invocation time.
2. Value of `CC` at configure invocation time.
3. Compiler inferred at configure invocation time (`gcc` or `clang`).
The strategy is to check (at `configure` time) if each of the
environment variables is set, and if so, save its value in a
corresponding `CFG_` variable (e.g. `CFG_CC`).
Then, in the makefiles, if `CC` is not set but `CFG_CC` is, then we
use the `CFG_CC` setting as `CC`.
Also, I fold the potential user-provided `CFLAGS` and `CXXFLAGS`
values into all of the per-platform `CFLAGS` and `CXXFLAGS` settings.
(This was opposed to adding `$(CFLAGS)` in an ad-hoc manner to various
parts of the mk files.)
Fix #13805.
----
Note that if you try to set the compiler to clang via the `CC` and
`CXX` environment variables, you will probably need to also set
`CXXFLAGS` to `--enable-libcpp` so that LLVM will be configured
properly.
----
Introduce CFG_USING_CLANG, which is distinguished from
CFG_ENABLE_CLANG because the former represents "we think we're using
clang, choose appropriate warning-control options" while the latter
represents "we asked configure (or the host required) that we attempt
to use clang, so check that we have an appropriate version of clang."
The main reason I added this is that I wanted to allow the user to
choose clang via setting the `CC` environment variable, but I did not
want that method of selection to get confused with the user passing
the `--enable-clang` option.
----
A digression: The `configure` script does not infer the compiler
setting if `CC` is set; but if `--enable-clang` was passed, then it
*does* still attempt to validate that the clang version is compatible.
Supporting this required revising `CLANG_VERSION` check to be robust
in face of user-provided `CC` value.
In particular, on Travis, the `CC` is set to `gcc` and so the natural
thing to do is to attempt to use `gcc` as the compiler, but Travis is
also passing `--enable-clang` to configure. So, what is the right
answer in the face of these contradictory requests?
One approach would be to have `--enable-clang` supersede the setting
for `CC` (and instead just call whatever we inferred for `CFG_CLANG`).
That sounds maximally inflexible to me (pnkfelix): a developer
requesting a `CC` value probably wants it respected, and should be
able to set it to something else; it is harder for that developer to
hack our configure script to change its inferred path to clang.
A second approach would be to blindly use the `CC` value but keep
going through the clang version check when `--enable-clang` is turned
on. But on Travis (a Linux host), the `gcc` invocation won't print a
clang version, so we would not get past the CLANG_VERSION check in
that context.
A third approach would be to never run the CLANG_VERSION check if `CC`
is explicitly set. That is not a terrible idea; but if the user uses
`CC` to pass in a path to some other version of clang that they want
to test, probably should still send that through the `CLANG_VERSION`
check.
So in the end I (pnkfelix) took a fourth approach: do the
CLANG_VERSION check if `CC` is unset *or* if `CC` is set to a string
ending with `clang`. This way setting `CC` to things like
`path/to/clang` or `ccache clang` will still go through the
CLANG_VERSION check, while setting `CC` to `gcc` or some unknown
compiler will skip the CLANG_VERSION check (regardless of whether the
user passed --enable-clang to `configure`).
----
Drive-by fixes:
* The call that sets `CFG_CLANG_VERSION` was quoting `"$CFG_CC"` in
its invocation, but that does not play nicely with someone who sets
`$CFG_CC` to e.g. `ccache clang`, since you do not want to intepret
that whole string as a command.
(On the other hand, a path with spaces might need the quoted
invocation. Not sure which one of these corner use-cases is more
important to support.)
* Fix chk_cc error message to point user at `gcc` not `cc`.
2014-04-29 00:57:26 +08:00
envopt() {
local NAME=$1
local V="CFG_${NAME}"
eval VV=\$$V
# If configure didn't set a value already, then check environment.
#
# (It is recommended that the configure script always check the
# environment before setting any values to envopt variables; see
# e.g. how CFG_CC is handled, where it first checks `-z "$CC"`,
# and issues msg if it ends up employing that provided value.)
if [ -z "$VV" ]
then
eval $V=\$$NAME
eval VV=\$$V
fi
# If script or environment provided a value, save it.
2015-07-27 05:18:30 +08:00
if [ -n "$VV" ]
Make configure respect (and save) values for `CC`, `CXX`, `CFLAGS`, etc.
I mostly tried to remain backwards compatible with old invocations of
the `configure` script; if you do not want to use `CC` et al., you
should not have to; you can keep using `--enable-clang` and/or
`--enable-ccache`.
The overall intention is to capture the following precedences for
guessing the C compiler:
1. Value of `CC` at make invocation time.
2. Value of `CC` at configure invocation time.
3. Compiler inferred at configure invocation time (`gcc` or `clang`).
The strategy is to check (at `configure` time) if each of the
environment variables is set, and if so, save its value in a
corresponding `CFG_` variable (e.g. `CFG_CC`).
Then, in the makefiles, if `CC` is not set but `CFG_CC` is, then we
use the `CFG_CC` setting as `CC`.
Also, I fold the potential user-provided `CFLAGS` and `CXXFLAGS`
values into all of the per-platform `CFLAGS` and `CXXFLAGS` settings.
(This was opposed to adding `$(CFLAGS)` in an ad-hoc manner to various
parts of the mk files.)
Fix #13805.
----
Note that if you try to set the compiler to clang via the `CC` and
`CXX` environment variables, you will probably need to also set
`CXXFLAGS` to `--enable-libcpp` so that LLVM will be configured
properly.
----
Introduce CFG_USING_CLANG, which is distinguished from
CFG_ENABLE_CLANG because the former represents "we think we're using
clang, choose appropriate warning-control options" while the latter
represents "we asked configure (or the host required) that we attempt
to use clang, so check that we have an appropriate version of clang."
The main reason I added this is that I wanted to allow the user to
choose clang via setting the `CC` environment variable, but I did not
want that method of selection to get confused with the user passing
the `--enable-clang` option.
----
A digression: The `configure` script does not infer the compiler
setting if `CC` is set; but if `--enable-clang` was passed, then it
*does* still attempt to validate that the clang version is compatible.
Supporting this required revising `CLANG_VERSION` check to be robust
in face of user-provided `CC` value.
In particular, on Travis, the `CC` is set to `gcc` and so the natural
thing to do is to attempt to use `gcc` as the compiler, but Travis is
also passing `--enable-clang` to configure. So, what is the right
answer in the face of these contradictory requests?
One approach would be to have `--enable-clang` supersede the setting
for `CC` (and instead just call whatever we inferred for `CFG_CLANG`).
That sounds maximally inflexible to me (pnkfelix): a developer
requesting a `CC` value probably wants it respected, and should be
able to set it to something else; it is harder for that developer to
hack our configure script to change its inferred path to clang.
A second approach would be to blindly use the `CC` value but keep
going through the clang version check when `--enable-clang` is turned
on. But on Travis (a Linux host), the `gcc` invocation won't print a
clang version, so we would not get past the CLANG_VERSION check in
that context.
A third approach would be to never run the CLANG_VERSION check if `CC`
is explicitly set. That is not a terrible idea; but if the user uses
`CC` to pass in a path to some other version of clang that they want
to test, probably should still send that through the `CLANG_VERSION`
check.
So in the end I (pnkfelix) took a fourth approach: do the
CLANG_VERSION check if `CC` is unset *or* if `CC` is set to a string
ending with `clang`. This way setting `CC` to things like
`path/to/clang` or `ccache clang` will still go through the
CLANG_VERSION check, while setting `CC` to `gcc` or some unknown
compiler will skip the CLANG_VERSION check (regardless of whether the
user passed --enable-clang to `configure`).
----
Drive-by fixes:
* The call that sets `CFG_CLANG_VERSION` was quoting `"$CFG_CC"` in
its invocation, but that does not play nicely with someone who sets
`$CFG_CC` to e.g. `ccache clang`, since you do not want to intepret
that whole string as a command.
(On the other hand, a path with spaces might need the quoted
invocation. Not sure which one of these corner use-cases is more
important to support.)
* Fix chk_cc error message to point user at `gcc` not `cc`.
2014-04-29 00:57:26 +08:00
then
putvar $V
fi
}
2015-07-20 16:07:53 +08:00
enable_if_not_disabled() {
local OP=$1
local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
local ENAB_V="CFG_ENABLE_$UOP"
local EXPLICITLY_DISABLED="CFG_DISABLE_${UOP}_PROVIDED"
eval VV=\$$EXPLICITLY_DISABLED
if [ -z "$VV" ]; then
eval $ENAB_V=1
fi
}
2014-07-24 02:56:36 +08:00
to_gnu_triple() {
case $1 in
i686-pc-windows-gnu) echo i686-w64-mingw32 ;;
x86_64-pc-windows-gnu) echo x86_64-w64-mingw32 ;;
*) echo $1 ;;
esac
}
2015-04-23 05:52:35 +08:00
# Prints the absolute path of a directory to stdout
abs_path() {
local _path="$1"
# Unset CDPATH because it causes havok: it makes the destination unpredictable
# and triggers 'cd' to print the path to stdout. Route `cd`'s output to /dev/null
# for good measure.
(unset CDPATH && cd "$_path" > /dev/null && pwd)
}
2016-09-01 21:19:35 +08:00
HELP=0
for arg; do
case "$arg" in
--help) HELP=1;;
esac
done
2011-03-20 09:31:59 +08:00
msg "looking for configure programs"
2012-02-29 04:05:05 +08:00
need_cmd cmp
2011-03-20 09:31:59 +08:00
need_cmd mkdir
need_cmd printf
2011-03-22 14:06:42 +08:00
need_cmd cut
2012-10-19 04:05:02 +08:00
need_cmd head
2011-03-22 14:06:42 +08:00
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
2011-03-24 04:26:17 +08:00
need_cmd uname
need_cmd date
2011-03-24 07:30:26 +08:00
need_cmd tr
2011-05-05 09:28:30 +08:00
need_cmd sed
2013-04-11 13:49:43 +08:00
need_cmd file
2015-01-23 11:44:43 +08:00
need_cmd make
2011-11-04 05:13:22 +08:00
2011-03-24 04:26:17 +08:00
msg "inspecting environment"
CFG_OSTYPE=$(uname -s)
CFG_CPUTYPE=$(uname -m)
2011-09-22 02:24:59 +08:00
2011-05-09 11:45:29 +08:00
if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
then
# Darwin's `uname -s` lies and always returns i386. We have to use sysctl
# instead.
2012-02-29 10:42:28 +08:00
if sysctl hw.optional.x86_64 | grep -q ': 1'
2011-05-09 11:45:29 +08:00
then
CFG_CPUTYPE=x86_64
fi
fi
2011-03-24 04:26:17 +08:00
2011-09-22 02:24:59 +08:00
# The goal here is to come up with the same triple as LLVM would,
# at least for the subset of platforms we're willing to target.
case $CFG_OSTYPE in
Linux)
CFG_OSTYPE=unknown-linux-gnu
;;
FreeBSD)
CFG_OSTYPE=unknown-freebsd
;;
2014-07-29 22:44:39 +08:00
DragonFly)
CFG_OSTYPE=unknown-dragonfly
;;
2015-01-17 15:51:04 +08:00
Bitrig)
CFG_OSTYPE=unknown-bitrig
;;
2015-01-29 15:19:28 +08:00
OpenBSD)
2015-01-17 15:51:04 +08:00
CFG_OSTYPE=unknown-openbsd
2015-01-29 15:19:28 +08:00
;;
2015-07-01 11:37:11 +08:00
NetBSD)
CFG_OSTYPE=unknown-netbsd
;;
2011-09-22 02:24:59 +08:00
Darwin)
CFG_OSTYPE=apple-darwin
;;
2016-01-22 00:30:22 +08:00
SunOS)
CFG_OSTYPE=sun-solaris
CFG_CPUTYPE=$(isainfo -n)
;;
2016-09-25 12:49:11 +08:00
Haiku)
CFG_OSTYPE=unknown-haiku
;;
2014-08-23 00:45:15 +08:00
MINGW*)
# msys' `uname` does not print gcc configuration, but prints msys
# configuration. so we cannot believe `uname -m`:
# msys1 is always i686 and msys2 is always x86_64.
# instead, msys defines $MSYSTEM which is MINGW32 on i686 and
# MINGW64 on x86_64.
CFG_CPUTYPE=i686
2014-07-24 02:56:36 +08:00
CFG_OSTYPE=pc-windows-gnu
2014-08-23 00:45:15 +08:00
if [ "$MSYSTEM" = MINGW64 ]
then
CFG_CPUTYPE=x86_64
fi
2014-03-30 03:34:26 +08:00
;;
2014-07-24 02:56:36 +08:00
MSYS*)
CFG_OSTYPE=pc-windows-gnu
;;
2015-03-28 23:09:51 +08:00
# Thad's Cygwin identifiers below
2013-03-23 09:21:43 +08:00
# Vista 32 bit
CYGWIN_NT-6.0)
2014-07-24 02:56:36 +08:00
CFG_OSTYPE=pc-windows-gnu
2013-03-23 09:21:43 +08:00
CFG_CPUTYPE=i686
;;
# Vista 64 bit
CYGWIN_NT-6.0-WOW64)
2014-07-24 02:56:36 +08:00
CFG_OSTYPE=pc-windows-gnu
2013-03-23 09:21:43 +08:00
CFG_CPUTYPE=x86_64
;;
# Win 7 32 bit
CYGWIN_NT-6.1)
2014-07-24 02:56:36 +08:00
CFG_OSTYPE=pc-windows-gnu
2013-03-23 09:21:43 +08:00
CFG_CPUTYPE=i686
;;
2011-09-22 02:24:59 +08:00
2013-03-23 09:21:43 +08:00
# Win 7 64 bit
CYGWIN_NT-6.1-WOW64)
2014-07-24 02:56:36 +08:00
CFG_OSTYPE=pc-windows-gnu
2013-03-23 09:21:43 +08:00
CFG_CPUTYPE=x86_64
;;
2015-03-07 16:44:02 +08:00
# Win 8 # uname -s on 64-bit cygwin does not contain WOW64, so simply use uname -m to detect arch (works in my install)
CYGWIN_NT-6.3)
CFG_OSTYPE=pc-windows-gnu
;;
2013-03-23 09:21:43 +08:00
# We do not detect other OS such as XP/2003 using 64 bit using uname.
# If we want to in the future, we will need to use Cygwin - Chuck's csih helper in /usr/lib/csih/winProductName.exe or alternative.
2011-09-22 02:24:59 +08:00
*)
err "unknown OS type: $CFG_OSTYPE"
;;
esac
case $CFG_CPUTYPE in
i386 | i486 | i686 | i786 | x86)
2011-11-04 04:49:00 +08:00
CFG_CPUTYPE=i686
2011-09-22 02:24:59 +08:00
;;
xscale | arm)
CFG_CPUTYPE=arm
;;
2016-10-30 16:27:58 +08:00
armv6l)
CFG_CPUTYPE=arm
CFG_OSTYPE="${CFG_OSTYPE}eabihf"
;;
2014-05-28 14:42:35 +08:00
armv7l)
2016-10-30 16:26:25 +08:00
CFG_CPUTYPE=armv7
2014-05-28 14:42:35 +08:00
CFG_OSTYPE="${CFG_OSTYPE}eabihf"
;;
2017-02-03 15:56:46 +08:00
aarch64 | arm64)
2014-12-13 07:39:27 +08:00
CFG_CPUTYPE=aarch64
;;
2015-12-29 05:09:06 +08:00
powerpc | ppc)
2015-01-10 11:49:54 +08:00
CFG_CPUTYPE=powerpc
;;
2015-12-29 05:09:06 +08:00
powerpc64 | ppc64)
CFG_CPUTYPE=powerpc64
;;
powerpc64le | ppc64le)
CFG_CPUTYPE=powerpc64le
;;
2016-09-10 05:00:23 +08:00
s390x)
CFG_CPUTYPE=s390x
;;
2011-12-30 16:18:55 +08:00
x86_64 | x86-64 | x64 | amd64)
2011-12-01 07:44:35 +08:00
CFG_CPUTYPE=x86_64
2011-09-22 02:24:59 +08:00
;;
2016-12-28 20:56:29 +08:00
mips | mips64)
if [ "$CFG_CPUTYPE" = "mips64" ]; then
CFG_OSTYPE="${CFG_OSTYPE}abi64"
fi
ENDIAN=$(printf '\1' | od -dAn)
if [ "$ENDIAN" -eq 1 ]; then
CFG_CPUTYPE="${CFG_CPUTYPE}el"
elif [ "$ENDIAN" -ne 256 ]; then
err "unknown endianness: $ENDIAN (expecting 1 for little or 256 for big)"
fi
;;
2016-09-25 12:49:11 +08:00
BePC)
CFG_CPUTYPE=i686
;;
2011-09-22 02:24:59 +08:00
*)
err "unknown CPU type: $CFG_CPUTYPE"
esac
2012-10-17 06:12:07 +08:00
# Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
if [ $CFG_OSTYPE = unknown-linux-gnu -a $CFG_CPUTYPE = x86_64 ]
then
2015-03-24 05:27:09 +08:00
# $SHELL does not exist in standard 'sh', so probably only exists
# if configure is running in an interactive bash shell. /usr/bin/env
# exists *everywhere*.
BIN_TO_PROBE="$SHELL"
2015-12-07 11:19:03 +08:00
if [ ! -r "$BIN_TO_PROBE" ]; then
if [ -r "/usr/bin/env" ]; then
BIN_TO_PROBE="/usr/bin/env"
else
warn "Cannot check if the userland is i686 or x86_64"
fi
fi
file -L "$BIN_TO_PROBE" | grep -q "x86[_-]64"
if [ $? != 0 ]; then
msg "i686 userland on x86_64 Linux kernel"
CFG_CPUTYPE=i686
2012-10-17 06:12:07 +08:00
fi
fi
2013-10-21 17:18:21 +08:00
DEFAULT_BUILD="${CFG_CPUTYPE}-${CFG_OSTYPE}"
2011-09-22 02:24:59 +08:00
2015-04-23 05:52:35 +08:00
CFG_SRC_DIR="$(abs_path $(dirname $0))/"
2015-06-13 01:40:07 +08:00
CFG_SRC_DIR_RELATIVE="$(dirname $0)/"
2012-05-01 06:40:04 +08:00
CFG_BUILD_DIR="$(pwd)/"
2014-03-02 13:39:05 +08:00
CFG_SELF="$0"
2011-03-26 01:29:45 +08:00
CFG_CONFIGURE_ARGS="$@"
2015-11-16 19:06:46 +08:00
2016-01-18 03:06:39 +08:00
case "${CFG_SRC_DIR}" in
2015-11-16 19:06:46 +08:00
*\ * )
err "The path to the rust source directory contains spaces, which is not supported"
;;
*)
;;
esac
2011-03-30 12:45:09 +08:00
OPTIONS=""
2016-09-01 21:19:35 +08:00
if [ "$HELP" -eq 1 ]
2011-03-30 12:45:09 +08:00
then
2013-06-06 20:07:31 +08:00
echo
2011-03-30 12:45:09 +08:00
echo "Usage: $CFG_SELF [options]"
2013-06-06 20:07:31 +08:00
echo
2011-03-30 12:45:09 +08:00
echo "Options:"
2013-06-06 20:07:31 +08:00
echo
2011-03-30 12:45:09 +08:00
else
2012-02-29 04:05:05 +08:00
msg "recreating config.tmp"
echo '' >config.tmp
2011-03-30 12:45:09 +08:00
step_msg "processing $CFG_SELF args"
fi
2011-03-18 14:51:45 +08:00
2012-12-01 12:20:18 +08:00
BOOL_OPTIONS=""
VAL_OPTIONS=""
2015-04-28 22:24:44 +08:00
opt debug 0 "debug mode; disables optimization unless \`--enable-optimize\` given"
2012-10-16 04:30:06 +08:00
opt valgrind 0 "run tests with valgrind (memcheck by default)"
2012-03-03 06:07:43 +08:00
opt helgrind 0 "run tests with helgrind instead of memcheck"
2014-10-09 07:11:37 +08:00
opt valgrind-rpass 1 "run rpass-valgrind tests with valgrind"
2015-03-28 11:01:19 +08:00
opt docs 1 "build standard library documentation"
opt compiler-docs 0 "build compiler documentation"
2013-08-11 15:29:45 +08:00
opt optimize-tests 1 "build tests with optimizations"
2015-04-29 23:18:44 +08:00
opt debuginfo-tests 0 "build tests with debugger metadata"
2016-10-30 09:58:52 +08:00
opt quiet-tests 0 "enable quieter output when running tests"
2016-06-13 07:05:32 +08:00
opt libcpp 1 "build llvm with libc++ instead of libstdc++ when using clang"
2015-04-09 04:27:12 +08:00
opt llvm-assertions 0 "build LLVM with assertions"
2015-04-09 04:25:20 +08:00
opt debug-assertions 0 "build with debugging assertions"
2012-02-11 04:07:01 +08:00
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
2013-05-30 05:18:09 +08:00
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
2016-12-13 03:36:52 +08:00
opt sccache 0 "invoke gcc/clang via sccache to reuse object files between builds"
2012-04-06 06:40:34 +08:00
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
2016-07-15 01:32:53 +08:00
opt local-rebuild 0 "assume local-rust matches the current version, for rebuilds; implies local-rust, and is implied if local-rust already matches the current version"
2014-04-17 01:45:04 +08:00
opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM"
2016-11-17 15:28:14 +08:00
opt llvm-link-shared 0 "prefer shared linking to LLVM (llvm-config --link-shared)"
2015-12-13 01:01:52 +08:00
opt rpath 1 "build rpaths into rustc itself"
2015-09-29 06:01:48 +08:00
opt stage0-landing-pads 1 "enable landing pads during bootstrap with stage0"
2014-07-23 08:20:15 +08:00
# This is used by the automation to produce single-target nightlies
opt dist-host-only 0 "only install bins for the host architecture"
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
opt inject-std-version 1 "inject the current compiler version of libstd into programs"
2015-05-31 09:12:32 +08:00
opt llvm-version-check 1 "check if the LLVM version is supported, build anyway"
2016-03-10 11:11:02 +08:00
opt codegen-tests 1 "run the src/test/codegen tests"
2016-02-03 23:29:53 +08:00
opt option-checking 1 "complain about unrecognized options in this configure script"
2016-07-02 07:47:30 +08:00
opt ninja 0 "build LLVM using the Ninja generator (for MSVC, requires building in the correct environment)"
2017-02-11 04:59:40 +08:00
opt locked-deps 0 "force Cargo.lock to be up to date"
2016-11-02 04:46:38 +08:00
opt vendor 0 "enable usage of vendored Rust crates"
2017-02-04 07:58:47 +08:00
opt sanitizers 0 "build the sanitizer runtimes (asan, lsan, msan, tsan)"
2017-02-15 01:54:58 +08:00
opt dist-src 1 "when building tarballs enables building a source tarball"
2013-10-21 17:18:21 +08:00
2015-04-09 05:21:36 +08:00
# Optimization and debugging options. These may be overridden by the release channel, etc.
opt_nosave optimize 1 "build optimized rust code"
opt_nosave optimize-cxx 1 "build optimized C++ code"
opt_nosave optimize-llvm 1 "build optimized LLVM"
opt_nosave llvm-assertions 0 "build LLVM with assertions"
opt_nosave debug-assertions 0 "build with debugging assertions"
2016-11-14 02:38:10 +08:00
opt_nosave llvm-release-debuginfo 0 "build LLVM with debugger metadata"
2015-04-09 05:21:36 +08:00
opt_nosave debuginfo 0 "build with debugger metadata"
2016-10-20 00:48:46 +08:00
opt_nosave debuginfo-lines 0 "build with line number debugger metadata"
2017-01-11 12:01:54 +08:00
opt_nosave debuginfo-only-std 0 "build only libstd with debugging information"
2015-04-09 06:12:08 +08:00
opt_nosave debug-jemalloc 0 "build jemalloc with --enable-debug --enable-fill"
2015-04-09 05:21:36 +08:00
2013-10-21 17:18:21 +08:00
valopt localstatedir "/var/lib" "local state directory"
valopt sysconfdir "/etc" "install system configuration files"
2013-10-22 12:35:45 +08:00
valopt datadir "${CFG_PREFIX}/share" "install data"
valopt infodir "${CFG_PREFIX}/share/info" "install additional info"
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
valopt llvm-root "" "set LLVM root"
2015-06-03 06:16:30 +08:00
valopt python "" "set path to python"
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
valopt jemalloc-root "" "set directory where libjemalloc_pic.a is located"
valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
2016-01-15 08:19:41 +08:00
valopt android-cross-path "" "Android NDK standalone path (deprecated)"
2015-08-09 13:15:50 +08:00
valopt i686-linux-android-ndk "" "i686-linux-android NDK standalone path"
2015-07-21 07:39:47 +08:00
valopt arm-linux-androideabi-ndk "" "arm-linux-androideabi NDK standalone path"
2016-05-05 06:08:14 +08:00
valopt armv7-linux-androideabi-ndk "" "armv7-linux-androideabi NDK standalone path"
2015-07-21 07:39:47 +08:00
valopt aarch64-linux-android-ndk "" "aarch64-linux-android NDK standalone path"
2015-12-16 05:34:06 +08:00
valopt nacl-cross-path "" "NaCl SDK path (Pepper Canary is recommended). Must be absolute!"
2016-10-06 02:00:55 +08:00
valopt musl-root "/usr/local" "MUSL root installation directory (deprecated)"
2016-11-17 04:31:19 +08:00
valopt musl-root-x86_64 "" "x86_64-unknown-linux-musl install directory"
valopt musl-root-i686 "" "i686-unknown-linux-musl install directory"
valopt musl-root-arm "" "arm-unknown-linux-musleabi install directory"
valopt musl-root-armhf "" "arm-unknown-linux-musleabihf install directory"
valopt musl-root-armv7 "" "armv7-unknown-linux-musleabihf install directory"
2015-12-29 08:11:42 +08:00
valopt extra-filename "" "Additional data that is hashed and passed to the -C extra-filename flag"
2017-01-29 05:38:06 +08:00
valopt qemu-armhf-rootfs "" "rootfs in qemu testing, you probably don't want to use this"
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
2016-05-31 04:29:29 +08:00
if [ -e ${CFG_SRC_DIR}.git ]
then
valopt release-channel "dev" "the name of the release channel to build"
else
# If we have no git directory then we are probably a tarball distribution
# and should default to stable channel - Issue 28322
probe CFG_GIT git
msg "git: no git directory. Changing default release channel to stable"
valopt release-channel "stable" "the name of the release channel to build"
fi
2015-08-11 07:09:21 +08:00
# Used on systems where "cc" and "ar" are unavailable
valopt default-linker "cc" "the default linker"
valopt default-ar "ar" "the default ar"
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
# Many of these are saved below during the "writing configuration" step
# (others are conditionally saved).
opt_nosave manage-submodules 1 "let the build manage the git submodules"
opt_nosave clang 0 "prefer clang to gcc for building the runtime"
2015-04-03 08:27:19 +08:00
opt_nosave jemalloc 1 "build liballoc with jemalloc"
2015-05-28 14:24:27 +08:00
opt elf-tls 1 "elf thread local storage on platforms where supported"
rustbuild: Compile rustc twice, not thrice
This commit switches the rustbuild build system to compiling the
compiler twice for a normal bootstrap rather than the historical three
times.
Rust is a bootstrapped language which means that a previous version of
the compiler is used to build the next version of the compiler. Over
time, however, we change many parts of compiler artifacts such as the
metadata format, symbol names, etc. These changes make artifacts from
one compiler incompatible from another compiler. Consequently if a
compiler wants to be able to use some artifacts then it itself must have
compiled the artifacts.
Historically the rustc build system has achieved this by compiling the
compiler three times:
* An older compiler (stage0) is downloaded to kick off the chain.
* This compiler now compiles a new compiler (stage1)
* The stage1 compiler then compiles another compiler (stage2)
* Finally, the stage2 compiler needs libraries to link against, so it
compiles all the libraries again.
This entire process amounts in compiling the compiler three times.
Additionally, this process always guarantees that the Rust source tree
can compile itself because the stage2 compiler (created by a freshly
created compiler) would successfully compile itself again. This
property, ensuring Rust can compile itself, is quite important!
In general, though, this third compilation is not required for general
purpose development on the compiler. The third compiler (stage2) can
reuse the libraries that were created during the second compile. In
other words, the second compilation can produce both a compiler and the
libraries that compiler will use. These artifacts *must* be compatible
due to the way plugins work today anyway, and they were created by the
same source code so they *should* be compatible as well.
So given all that, this commit switches the default build process to
only compile the compiler three times, avoiding this third compilation
by copying artifacts from the previous one. Along the way a new entry in
the Travis matrix was also added to ensure that our full bootstrap can
succeed. This entry does not run tests, though, as it should not be
necessary.
To restore the old behavior of a full bootstrap (three compiles) you can
either pass:
./configure --enable-full-bootstrap
or if you're using config.toml:
[build]
full-bootstrap = true
Overall this will hopefully be an easy 33% win in build times of the
compiler. If we do 33% less work we should be 33% faster! This in turn
should affect cycle times and such on Travis and AppVeyor positively as
well as making it easier to work on the compiler itself.
2016-12-26 07:20:33 +08:00
opt full-bootstrap 0 "build three compilers instead of two"
2017-01-21 09:03:06 +08:00
opt extended 0 "build an extended rust tool set"
2014-01-08 00:51:15 +08:00
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
valopt_nosave prefix "/usr/local" "set installation prefix"
valopt_nosave local-rust-root "/usr/local" "set prefix for local rust binary"
valopt_nosave host "${CFG_BUILD}" "GNUs ./configure syntax LLVM host triples"
valopt_nosave target "${CFG_HOST}" "GNUs ./configure syntax LLVM target triples"
valopt_nosave mandir "${CFG_PREFIX}/share/man" "install man pages in PATH"
2016-09-16 01:26:16 +08:00
valopt_nosave docdir "${CFG_PREFIX}/share/doc/rust" "install documentation in PATH"
mk: Update how the build deals with version labels. #16677
Adds a new configure flag, --release-channel, which determines how the version
number should be augmented with a release label, as well as how the distribution
artifacts will be named. This is entirely for use by the build automation.
--release-channel can be either 'source', 'nightly', 'beta', or 'stable'.
Here's a summary of the affect of these values on version number and
artifact naming, respectively:
* source - '0.12.0-pre', 'rust-0.12.0-pre-...'
* nightly - '0.12.0-nightly', 'rust-nightly-...'
* beta - '0.12.0-beta', 'rust-beta-...'
* stable - '0.12.0', 'rust-0.12.0-...'
Per http://discuss.rust-lang.org/t/rfc-impending-changes-to-the-release-process/508/1
2014-09-16 04:40:30 +08:00
2015-11-01 14:26:12 +08:00
# On Windows this determines root of the subtree for target libraries.
# Host runtime libs always go to 'bin'.
valopt libdir "${CFG_PREFIX}/lib" "install libraries"
2014-11-23 22:36:36 +08:00
case "$CFG_LIBDIR" in
"$CFG_PREFIX"/*) CAT_INC=2;;
"$CFG_PREFIX"*) CAT_INC=1;;
*)
err "libdir must begin with the prefix. Use --prefix to set it accordingly.";;
esac
CFG_LIBDIR_RELATIVE=`echo ${CFG_LIBDIR} | cut -c$((${#CFG_PREFIX}+${CAT_INC}))-`
2014-01-08 00:51:15 +08:00
2011-11-03 07:25:22 +08:00
if [ $HELP -eq 1 ]
then
2013-06-06 20:07:31 +08:00
echo
2011-11-03 07:25:22 +08:00
exit 0
fi
2014-03-02 13:39:05 +08:00
# Validate Options
2016-01-22 01:18:43 +08:00
if [ -z "$CFG_DISABLE_OPTION_CHECKING" ]
then
step_msg "validating $CFG_SELF args"
validate_opt
fi
2011-03-17 08:36:49 +08:00
2015-04-10 02:51:46 +08:00
# Validate the release channel, and configure options
mk: Update how the build deals with version labels. #16677
Adds a new configure flag, --release-channel, which determines how the version
number should be augmented with a release label, as well as how the distribution
artifacts will be named. This is entirely for use by the build automation.
--release-channel can be either 'source', 'nightly', 'beta', or 'stable'.
Here's a summary of the affect of these values on version number and
artifact naming, respectively:
* source - '0.12.0-pre', 'rust-0.12.0-pre-...'
* nightly - '0.12.0-nightly', 'rust-nightly-...'
* beta - '0.12.0-beta', 'rust-beta-...'
* stable - '0.12.0', 'rust-0.12.0-...'
Per http://discuss.rust-lang.org/t/rfc-impending-changes-to-the-release-process/508/1
2014-09-16 04:40:30 +08:00
case "$CFG_RELEASE_CHANNEL" in
2015-04-10 02:51:46 +08:00
nightly )
msg "overriding settings for $CFG_RELEASE_CHANNEL"
2017-01-14 07:35:58 +08:00
enable_if_not_disabled llvm-assertions
2017-01-11 12:01:54 +08:00
# FIXME(stage0) re-enable this on the next stage0 now that #35566 is
# fixed
2016-10-24 01:25:01 +08:00
case "$CFG_BUILD" in
*-pc-windows-gnu)
;;
*)
2017-01-11 12:01:54 +08:00
CFG_ENABLE_DEBUGINFO_LINES=1
CFG_ENABLE_DEBUGINFO_ONLY_STD=1
2016-10-24 01:25:01 +08:00
;;
esac
2017-01-11 12:01:54 +08:00
mk: Update how the build deals with version labels. #16677
Adds a new configure flag, --release-channel, which determines how the version
number should be augmented with a release label, as well as how the distribution
artifacts will be named. This is entirely for use by the build automation.
--release-channel can be either 'source', 'nightly', 'beta', or 'stable'.
Here's a summary of the affect of these values on version number and
artifact naming, respectively:
* source - '0.12.0-pre', 'rust-0.12.0-pre-...'
* nightly - '0.12.0-nightly', 'rust-nightly-...'
* beta - '0.12.0-beta', 'rust-beta-...'
* stable - '0.12.0', 'rust-0.12.0-...'
Per http://discuss.rust-lang.org/t/rfc-impending-changes-to-the-release-process/508/1
2014-09-16 04:40:30 +08:00
;;
2016-10-20 00:48:46 +08:00
beta | stable)
msg "overriding settings for $CFG_RELEASE_CHANNEL"
2016-10-24 01:25:01 +08:00
case "$CFG_BUILD" in
*-pc-windows-gnu)
;;
*)
2017-01-11 12:01:54 +08:00
CFG_ENABLE_DEBUGINFO_LINES=1
CFG_ENABLE_DEBUGINFO_ONLY_STD=1
2016-10-24 01:25:01 +08:00
;;
esac
2016-10-20 00:48:46 +08:00
;;
dev)
2015-04-10 02:51:46 +08:00
;;
*)
2014-09-26 06:28:00 +08:00
err "release channel must be 'dev', 'nightly', 'beta' or 'stable'"
mk: Update how the build deals with version labels. #16677
Adds a new configure flag, --release-channel, which determines how the version
number should be augmented with a release label, as well as how the distribution
artifacts will be named. This is entirely for use by the build automation.
--release-channel can be either 'source', 'nightly', 'beta', or 'stable'.
Here's a summary of the affect of these values on version number and
artifact naming, respectively:
* source - '0.12.0-pre', 'rust-0.12.0-pre-...'
* nightly - '0.12.0-nightly', 'rust-nightly-...'
* beta - '0.12.0-beta', 'rust-beta-...'
* stable - '0.12.0', 'rust-0.12.0-...'
Per http://discuss.rust-lang.org/t/rfc-impending-changes-to-the-release-process/508/1
2014-09-16 04:40:30 +08:00
;;
esac
2015-04-09 05:21:36 +08:00
# Adjust perf and debug options for debug mode
if [ -n "$CFG_ENABLE_DEBUG" ]; then
msg "debug mode enabled, setting performance options"
2015-04-14 15:58:57 +08:00
if [ -z "$CFG_ENABLE_OPTIMIZE_PROVIDED" ]; then
msg "optimization not explicitly enabled, disabling optimization"
CFG_DISABLE_OPTIMIZE=1
CFG_DISABLE_OPTIMIZE_CXX=1
fi
2015-07-20 16:07:53 +08:00
# Set following variables to 1 unless setting already provided
enable_if_not_disabled debug-assertions
enable_if_not_disabled debug-jemalloc
enable_if_not_disabled debuginfo
enable_if_not_disabled llvm-assertions
2015-04-09 05:21:36 +08:00
fi
# OK, now write the debugging options
if [ -n "$CFG_DISABLE_OPTIMIZE" ]; then putvar CFG_DISABLE_OPTIMIZE; fi
if [ -n "$CFG_DISABLE_OPTIMIZE_CXX" ]; then putvar CFG_DISABLE_OPTIMIZE_CXX; fi
if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]; then putvar CFG_DISABLE_OPTIMIZE_LLVM; fi
if [ -n "$CFG_ENABLE_LLVM_ASSERTIONS" ]; then putvar CFG_ENABLE_LLVM_ASSERTIONS; fi
if [ -n "$CFG_ENABLE_DEBUG_ASSERTIONS" ]; then putvar CFG_ENABLE_DEBUG_ASSERTIONS; fi
2016-11-14 02:38:10 +08:00
if [ -n "$CFG_ENABLE_LLVM_RELEASE_DEBUGINFO" ]; then putvar CFG_ENABLE_LLVM_RELEASE_DEBUGINFO; fi
2015-04-09 05:21:36 +08:00
if [ -n "$CFG_ENABLE_DEBUGINFO" ]; then putvar CFG_ENABLE_DEBUGINFO; fi
2016-10-20 00:48:46 +08:00
if [ -n "$CFG_ENABLE_DEBUGINFO_LINES" ]; then putvar CFG_ENABLE_DEBUGINFO_LINES; fi
2017-01-11 12:01:54 +08:00
if [ -n "$CFG_ENABLE_DEBUGINFO_ONLY_STD" ]; then putvar CFG_ENABLE_DEBUGINFO_ONLY_STD; fi
2015-04-09 06:12:08 +08:00
if [ -n "$CFG_ENABLE_DEBUG_JEMALLOC" ]; then putvar CFG_ENABLE_DEBUG_JEMALLOC; fi
2015-04-09 05:21:36 +08:00
2011-03-30 12:45:09 +08:00
step_msg "looking for build programs"
2011-11-04 05:13:22 +08:00
2016-06-03 19:53:46 +08:00
probe_need CFG_CURL curl
2015-06-03 06:16:30 +08:00
if [ -z "$CFG_PYTHON_PROVIDED" ]; then
2016-02-14 04:19:44 +08:00
probe_need CFG_PYTHON python2.7 python2 python
2015-06-03 06:16:30 +08:00
fi
2012-06-26 08:18:09 +08:00
python_version=$($CFG_PYTHON -V 2>&1)
2016-02-14 04:19:44 +08:00
if [ $(echo $python_version | grep -c '^Python 2\.7') -ne 1 ]; then
err "Found $python_version, but Python 2.7 is required"
2012-06-26 08:18:09 +08:00
fi
2012-03-01 02:18:04 +08:00
# If we have no git directory then we are probably a tarball distribution
# and shouldn't attempt to load submodules
if [ ! -e ${CFG_SRC_DIR}.git ]
then
2012-03-01 03:48:29 +08:00
probe CFG_GIT git
2012-03-01 02:18:04 +08:00
msg "git: no git directory. disabling submodules"
CFG_DISABLE_MANAGE_SUBMODULES=1
else
2012-03-01 03:48:29 +08:00
probe_need CFG_GIT git
2012-03-01 02:18:04 +08:00
fi
2015-05-08 18:26:26 +08:00
# Use `md5sum` on GNU platforms, or `md5 -q` on BSD
probe CFG_MD5 md5
probe CFG_MD5SUM md5sum
if [ -n "$CFG_MD5" ]
then
2015-05-20 19:54:14 +08:00
CFG_HASH_COMMAND="$CFG_MD5 -q | cut -c 1-8"
2015-05-08 18:26:26 +08:00
elif [ -n "$CFG_MD5SUM" ]
then
2015-05-20 19:54:14 +08:00
CFG_HASH_COMMAND="$CFG_MD5SUM | cut -c 1-8"
2015-05-08 18:26:26 +08:00
else
err 'could not find one of: md5 md5sum'
fi
putvar CFG_HASH_COMMAND
2011-05-10 01:16:56 +08:00
probe CFG_CLANG clang++
2013-05-30 05:18:09 +08:00
probe CFG_CCACHE ccache
2011-05-09 12:10:04 +08:00
probe CFG_GCC gcc
2012-04-10 18:25:59 +08:00
probe CFG_LD ld
2011-03-17 08:36:49 +08:00
probe CFG_VALGRIND valgrind
2011-09-14 06:06:21 +08:00
probe CFG_PERF perf
2012-01-26 08:02:53 +08:00
probe CFG_ISCC iscc
2014-07-15 15:18:17 +08:00
probe CFG_ANTLR4 antlr4
probe CFG_GRUN grun
2015-01-21 10:46:44 +08:00
probe CFG_FLEX flex
probe CFG_BISON bison
2013-02-11 06:17:28 +08:00
probe CFG_GDB gdb
2014-04-24 17:35:48 +08:00
probe CFG_LLDB lldb
2016-07-02 07:47:30 +08:00
if [ -n "$CFG_ENABLE_NINJA" ]
then
probe CFG_NINJA ninja
if [ -z "$CFG_NINJA" ]
then
# On Debian and Fedora, the `ninja` binary is an IRC bot, so the build tool was
# renamed. Handle this case.
probe CFG_NINJA ninja-build
fi
fi
2016-06-02 08:41:27 +08:00
# For building LLVM
2016-12-02 22:43:03 +08:00
if [ -z "$CFG_LLVM_ROOT" ]
then
probe_need CFG_CMAKE cmake
fi
2016-06-02 08:41:27 +08:00
2015-04-03 21:05:54 +08:00
# On MacOS X, invoking `javac` pops up a dialog if the JDK is not
# installed. Since `javac` is only used if `antlr4` is available,
# probe for it only in this case.
2015-07-27 05:18:30 +08:00
if [ -n "$CFG_ANTLR4" ]
2015-04-03 21:05:54 +08:00
then
2016-07-23 19:51:54 +08:00
CFG_ANTLR4_JAR="\"$(find /usr/ -name antlr-complete.jar 2>/dev/null | head -n 1)\""
2016-11-22 06:10:51 +08:00
if [ "x" = "x$CFG_ANTLR4_JAR" ]
2016-07-23 19:51:54 +08:00
then
CFG_ANTLR4_JAR="\"$(find ~ -name antlr-complete.jar 2>/dev/null | head -n 1)\""
fi
putvar CFG_ANTLR4_JAR $CFG_ANTLR4_JAR
2015-04-03 21:05:54 +08:00
probe CFG_JAVAC javac
fi
2015-04-27 16:04:22 +08:00
# the valgrind rpass tests will fail if you don't have a valgrind, but they're
# only disabled if you opt out.
if [ -z "$CFG_VALGRIND" ]
then
2015-04-28 14:54:30 +08:00
# If the user has explicitly asked for valgrind tests, then fail
if [ -n "$CFG_ENABLE_VALGRIND" ] && [ -n "$CFG_ENABLE_VALGRIND_PROVIDED" ]
then
err "No valgrind present, but valgrind tests explicitly requested"
else
CFG_DISABLE_VALGRIND_RPASS=1
putvar CFG_DISABLE_VALGRIND_RPASS
fi
2015-04-27 16:04:22 +08:00
fi
2015-07-27 05:18:30 +08:00
if [ -n "$CFG_LLDB" ]
2014-04-24 17:35:48 +08:00
then
2014-10-02 17:35:24 +08:00
# Store LLDB's version
CFG_LLDB_VERSION=$($CFG_LLDB --version 2>/dev/null | head -1)
putvar CFG_LLDB_VERSION
2014-04-24 17:35:48 +08:00
# If CFG_LLDB_PYTHON_DIR is not already set from the outside and valid, try to read it from
# LLDB via the -P commandline options.
if [ -z "$CFG_LLDB_PYTHON_DIR" ] || [ ! -d "$CFG_LLDB_PYTHON_DIR" ]
then
CFG_LLDB_PYTHON_DIR=$($CFG_LLDB -P)
# If CFG_LLDB_PYTHON_DIR is not a valid directory, set it to something more readable
if [ ! -d "$CFG_LLDB_PYTHON_DIR" ]
then
CFG_LLDB_PYTHON_DIR="LLDB_PYTHON_DIRECTORY_NOT_FOUND"
fi
putvar CFG_LLDB_PYTHON_DIR
fi
fi
2016-04-20 00:44:19 +08:00
# LLDB tests on OSX require /usr/bin/python, not something like Homebrew's
# /usr/local/bin/python. We're loading a compiled module for LLDB tests which is
# only compatible with the system.
case $CFG_BUILD in
*-apple-darwin)
CFG_LLDB_PYTHON=/usr/bin/python
;;
*)
CFG_LLDB_PYTHON=$CFG_PYTHON
;;
esac
putvar CFG_LLDB_PYTHON
2016-12-23 06:00:21 +08:00
# Do some sanity checks if running on buildbot
# (these env vars are set by rust-buildbot)
if [ -n "$RUST_DIST_SERVER" -a -n "$ALLOW_NONZERO_RLIMIT_CORE" ]; then
# Frequently the llvm submodule directory is broken by the build
# being killed
llvm_lock="${CFG_SRC_DIR}/.git/modules/src/llvm/index.lock"
if [ -e "$llvm_lock" ]; then
step_msg "removing $llvm_lock"
rm -f "$llvm_lock"
fi
fi
2013-05-03 23:46:52 +08:00
step_msg "looking for target specific programs"
probe CFG_ADB adb
2013-11-21 11:29:40 +08:00
BIN_SUF=
2015-03-05 06:58:59 +08:00
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] || [ "$CFG_OSTYPE" = "pc-windows-msvc" ]
2013-11-21 11:29:40 +08:00
then
BIN_SUF=.exe
fi
2016-05-22 07:36:25 +08:00
# --enable-local-rebuild implies --enable-local-rust too
if [ -n "$CFG_ENABLE_LOCAL_REBUILD" ]
then
if [ -z "$CFG_ENABLE_LOCAL_RUST" ]
then
CFG_ENABLE_LOCAL_RUST=1
putvar CFG_ENABLE_LOCAL_RUST
fi
fi
2015-07-27 05:18:30 +08:00
if [ -n "$CFG_ENABLE_LOCAL_RUST" ]
2012-04-06 06:40:34 +08:00
then
2014-08-07 20:00:35 +08:00
system_rustc=$(which rustc)
if [ -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
2012-04-20 06:46:09 +08:00
then
2014-08-07 20:00:35 +08:00
: # everything already configured
elif [ -n "$system_rustc" ]
then
# we assume that rustc is in a /bin directory
CFG_LOCAL_RUST_ROOT=${system_rustc%/bin/rustc}
2012-04-20 06:46:09 +08:00
else
2014-08-07 20:00:35 +08:00
err "no local rust to use"
2012-04-20 06:46:09 +08:00
fi
2014-08-07 20:00:35 +08:00
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
CMD="${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF}"
2016-09-03 20:06:38 +08:00
LRV=`LD_LIBRARY_PATH=${CFG_LOCAL_RUST_ROOT}/lib $CMD --version`
config.mk: Added variants of `valopt`/`opt` that do not automatically `putvar`.
Used aforementioned variants to extract options that have explicit
`putvar` calls associated with them in the subsequent code. When the
explicit `putvar` call was conditional on some potentially complex
condition, moved the `putvar` call out to the main control flow of the
script so that it always runs if necessary.
----
As a driveby fix, captured the error exit when doing the test run of
`rustc --version` from `CFG_LOCAL_RUST_ROOT`, and signal explicit
configure failure when it did not run successfully. (If we cannot run
`rustc`, we really shouldn't try to keep going.)
----
Finally, in response to review feedback, went through and identified
cases where we had been calling `putvar` manually (and thus my naive
translation used `opt_nosave`/`valopt_nosave`), and then verified
whether a manual `putvar` was necessary (i.e., was each variable in
question manually computed somewhere in the `configure` script).
In cases that did not meet this criteria, I revised the code to use
the `opt`/`valopt` directly and removed the corresponding `putvar`,
cleaning things up a teeny bit.
----
Fix #17887.
2014-10-09 22:26:46 +08:00
if [ $? -ne 0 ]
then
step_msg "failure while running $CMD --version"
exit 1
fi
2014-08-07 20:00:35 +08:00
step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
putvar CFG_LOCAL_RUST_ROOT
2012-04-06 06:40:34 +08:00
fi
2015-04-03 08:27:19 +08:00
# Same with jemalloc. save the setting here.
2015-07-27 05:18:30 +08:00
if [ -n "$CFG_DISABLE_JEMALLOC" ]
2015-04-03 08:27:19 +08:00
then
putvar CFG_DISABLE_JEMALLOC
fi
Make configure respect (and save) values for `CC`, `CXX`, `CFLAGS`, etc.
I mostly tried to remain backwards compatible with old invocations of
the `configure` script; if you do not want to use `CC` et al., you
should not have to; you can keep using `--enable-clang` and/or
`--enable-ccache`.
The overall intention is to capture the following precedences for
guessing the C compiler:
1. Value of `CC` at make invocation time.
2. Value of `CC` at configure invocation time.
3. Compiler inferred at configure invocation time (`gcc` or `clang`).
The strategy is to check (at `configure` time) if each of the
environment variables is set, and if so, save its value in a
corresponding `CFG_` variable (e.g. `CFG_CC`).
Then, in the makefiles, if `CC` is not set but `CFG_CC` is, then we
use the `CFG_CC` setting as `CC`.
Also, I fold the potential user-provided `CFLAGS` and `CXXFLAGS`
values into all of the per-platform `CFLAGS` and `CXXFLAGS` settings.
(This was opposed to adding `$(CFLAGS)` in an ad-hoc manner to various
parts of the mk files.)
Fix #13805.
----
Note that if you try to set the compiler to clang via the `CC` and
`CXX` environment variables, you will probably need to also set
`CXXFLAGS` to `--enable-libcpp` so that LLVM will be configured
properly.
----
Introduce CFG_USING_CLANG, which is distinguished from
CFG_ENABLE_CLANG because the former represents "we think we're using
clang, choose appropriate warning-control options" while the latter
represents "we asked configure (or the host required) that we attempt
to use clang, so check that we have an appropriate version of clang."
The main reason I added this is that I wanted to allow the user to
choose clang via setting the `CC` environment variable, but I did not
want that method of selection to get confused with the user passing
the `--enable-clang` option.
----
A digression: The `configure` script does not infer the compiler
setting if `CC` is set; but if `--enable-clang` was passed, then it
*does* still attempt to validate that the clang version is compatible.
Supporting this required revising `CLANG_VERSION` check to be robust
in face of user-provided `CC` value.
In particular, on Travis, the `CC` is set to `gcc` and so the natural
thing to do is to attempt to use `gcc` as the compiler, but Travis is
also passing `--enable-clang` to configure. So, what is the right
answer in the face of these contradictory requests?
One approach would be to have `--enable-clang` supersede the setting
for `CC` (and instead just call whatever we inferred for `CFG_CLANG`).
That sounds maximally inflexible to me (pnkfelix): a developer
requesting a `CC` value probably wants it respected, and should be
able to set it to something else; it is harder for that developer to
hack our configure script to change its inferred path to clang.
A second approach would be to blindly use the `CC` value but keep
going through the clang version check when `--enable-clang` is turned
on. But on Travis (a Linux host), the `gcc` invocation won't print a
clang version, so we would not get past the CLANG_VERSION check in
that context.
A third approach would be to never run the CLANG_VERSION check if `CC`
is explicitly set. That is not a terrible idea; but if the user uses
`CC` to pass in a path to some other version of clang that they want
to test, probably should still send that through the `CLANG_VERSION`
check.
So in the end I (pnkfelix) took a fourth approach: do the
CLANG_VERSION check if `CC` is unset *or* if `CC` is set to a string
ending with `clang`. This way setting `CC` to things like
`path/to/clang` or `ccache clang` will still go through the
CLANG_VERSION check, while setting `CC` to `gcc` or some unknown
compiler will skip the CLANG_VERSION check (regardless of whether the
user passed --enable-clang to `configure`).
----
Drive-by fixes:
* The call that sets `CFG_CLANG_VERSION` was quoting `"$CFG_CC"` in
its invocation, but that does not play nicely with someone who sets
`$CFG_CC` to e.g. `ccache clang`, since you do not want to intepret
that whole string as a command.
(On the other hand, a path with spaces might need the quoted
invocation. Not sure which one of these corner use-cases is more
important to support.)
* Fix chk_cc error message to point user at `gcc` not `cc`.
2014-04-29 00:57:26 +08:00
# All safeguards based on $CFG_ENABLE_CLANG should occur before this
# point in the script; after this point, script logic should inspect
# $CFG_USING_CLANG rather than $CFG_ENABLE_CLANG.
2015-11-20 22:48:19 +08:00
# Set CFG_{CC,CXX,CPP,CFLAGS,CXXFLAGS,LDFLAGS}
Make configure respect (and save) values for `CC`, `CXX`, `CFLAGS`, etc.
I mostly tried to remain backwards compatible with old invocations of
the `configure` script; if you do not want to use `CC` et al., you
should not have to; you can keep using `--enable-clang` and/or
`--enable-ccache`.
The overall intention is to capture the following precedences for
guessing the C compiler:
1. Value of `CC` at make invocation time.
2. Value of `CC` at configure invocation time.
3. Compiler inferred at configure invocation time (`gcc` or `clang`).
The strategy is to check (at `configure` time) if each of the
environment variables is set, and if so, save its value in a
corresponding `CFG_` variable (e.g. `CFG_CC`).
Then, in the makefiles, if `CC` is not set but `CFG_CC` is, then we
use the `CFG_CC` setting as `CC`.
Also, I fold the potential user-provided `CFLAGS` and `CXXFLAGS`
values into all of the per-platform `CFLAGS` and `CXXFLAGS` settings.
(This was opposed to adding `$(CFLAGS)` in an ad-hoc manner to various
parts of the mk files.)
Fix #13805.
----
Note that if you try to set the compiler to clang via the `CC` and
`CXX` environment variables, you will probably need to also set
`CXXFLAGS` to `--enable-libcpp` so that LLVM will be configured
properly.
----
Introduce CFG_USING_CLANG, which is distinguished from
CFG_ENABLE_CLANG because the former represents "we think we're using
clang, choose appropriate warning-control options" while the latter
represents "we asked configure (or the host required) that we attempt
to use clang, so check that we have an appropriate version of clang."
The main reason I added this is that I wanted to allow the user to
choose clang via setting the `CC` environment variable, but I did not
want that method of selection to get confused with the user passing
the `--enable-clang` option.
----
A digression: The `configure` script does not infer the compiler
setting if `CC` is set; but if `--enable-clang` was passed, then it
*does* still attempt to validate that the clang version is compatible.
Supporting this required revising `CLANG_VERSION` check to be robust
in face of user-provided `CC` value.
In particular, on Travis, the `CC` is set to `gcc` and so the natural
thing to do is to attempt to use `gcc` as the compiler, but Travis is
also passing `--enable-clang` to configure. So, what is the right
answer in the face of these contradictory requests?
One approach would be to have `--enable-clang` supersede the setting
for `CC` (and instead just call whatever we inferred for `CFG_CLANG`).
That sounds maximally inflexible to me (pnkfelix): a developer
requesting a `CC` value probably wants it respected, and should be
able to set it to something else; it is harder for that developer to
hack our configure script to change its inferred path to clang.
A second approach would be to blindly use the `CC` value but keep
going through the clang version check when `--enable-clang` is turned
on. But on Travis (a Linux host), the `gcc` invocation won't print a
clang version, so we would not get past the CLANG_VERSION check in
that context.
A third approach would be to never run the CLANG_VERSION check if `CC`
is explicitly set. That is not a terrible idea; but if the user uses
`CC` to pass in a path to some other version of clang that they want
to test, probably should still send that through the `CLANG_VERSION`
check.
So in the end I (pnkfelix) took a fourth approach: do the
CLANG_VERSION check if `CC` is unset *or* if `CC` is set to a string
ending with `clang`. This way setting `CC` to things like
`path/to/clang` or `ccache clang` will still go through the
CLANG_VERSION check, while setting `CC` to `gcc` or some unknown
compiler will skip the CLANG_VERSION check (regardless of whether the
user passed --enable-clang to `configure`).
----
Drive-by fixes:
* The call that sets `CFG_CLANG_VERSION` was quoting `"$CFG_CC"` in
its invocation, but that does not play nicely with someone who sets
`$CFG_CC` to e.g. `ccache clang`, since you do not want to intepret
that whole string as a command.
(On the other hand, a path with spaces might need the quoted
invocation. Not sure which one of these corner use-cases is more
important to support.)
* Fix chk_cc error message to point user at `gcc` not `cc`.
2014-04-29 00:57:26 +08:00
envopt CC
envopt CXX
envopt CPP
envopt CFLAGS
envopt CXXFLAGS
2015-11-20 22:48:19 +08:00
envopt LDFLAGS
Make configure respect (and save) values for `CC`, `CXX`, `CFLAGS`, etc.
I mostly tried to remain backwards compatible with old invocations of
the `configure` script; if you do not want to use `CC` et al., you
should not have to; you can keep using `--enable-clang` and/or
`--enable-ccache`.
The overall intention is to capture the following precedences for
guessing the C compiler:
1. Value of `CC` at make invocation time.
2. Value of `CC` at configure invocation time.
3. Compiler inferred at configure invocation time (`gcc` or `clang`).
The strategy is to check (at `configure` time) if each of the
environment variables is set, and if so, save its value in a
corresponding `CFG_` variable (e.g. `CFG_CC`).
Then, in the makefiles, if `CC` is not set but `CFG_CC` is, then we
use the `CFG_CC` setting as `CC`.
Also, I fold the potential user-provided `CFLAGS` and `CXXFLAGS`
values into all of the per-platform `CFLAGS` and `CXXFLAGS` settings.
(This was opposed to adding `$(CFLAGS)` in an ad-hoc manner to various
parts of the mk files.)
Fix #13805.
----
Note that if you try to set the compiler to clang via the `CC` and
`CXX` environment variables, you will probably need to also set
`CXXFLAGS` to `--enable-libcpp` so that LLVM will be configured
properly.
----
Introduce CFG_USING_CLANG, which is distinguished from
CFG_ENABLE_CLANG because the former represents "we think we're using
clang, choose appropriate warning-control options" while the latter
represents "we asked configure (or the host required) that we attempt
to use clang, so check that we have an appropriate version of clang."
The main reason I added this is that I wanted to allow the user to
choose clang via setting the `CC` environment variable, but I did not
want that method of selection to get confused with the user passing
the `--enable-clang` option.
----
A digression: The `configure` script does not infer the compiler
setting if `CC` is set; but if `--enable-clang` was passed, then it
*does* still attempt to validate that the clang version is compatible.
Supporting this required revising `CLANG_VERSION` check to be robust
in face of user-provided `CC` value.
In particular, on Travis, the `CC` is set to `gcc` and so the natural
thing to do is to attempt to use `gcc` as the compiler, but Travis is
also passing `--enable-clang` to configure. So, what is the right
answer in the face of these contradictory requests?
One approach would be to have `--enable-clang` supersede the setting
for `CC` (and instead just call whatever we inferred for `CFG_CLANG`).
That sounds maximally inflexible to me (pnkfelix): a developer
requesting a `CC` value probably wants it respected, and should be
able to set it to something else; it is harder for that developer to
hack our configure script to change its inferred path to clang.
A second approach would be to blindly use the `CC` value but keep
going through the clang version check when `--enable-clang` is turned
on. But on Travis (a Linux host), the `gcc` invocation won't print a
clang version, so we would not get past the CLANG_VERSION check in
that context.
A third approach would be to never run the CLANG_VERSION check if `CC`
is explicitly set. That is not a terrible idea; but if the user uses
`CC` to pass in a path to some other version of clang that they want
to test, probably should still send that through the `CLANG_VERSION`
check.
So in the end I (pnkfelix) took a fourth approach: do the
CLANG_VERSION check if `CC` is unset *or* if `CC` is set to a string
ending with `clang`. This way setting `CC` to things like
`path/to/clang` or `ccache clang` will still go through the
CLANG_VERSION check, while setting `CC` to `gcc` or some unknown
compiler will skip the CLANG_VERSION check (regardless of whether the
user passed --enable-clang to `configure`).
----
Drive-by fixes:
* The call that sets `CFG_CLANG_VERSION` was quoting `"$CFG_CC"` in
its invocation, but that does not play nicely with someone who sets
`$CFG_CC` to e.g. `ccache clang`, since you do not want to intepret
that whole string as a command.
(On the other hand, a path with spaces might need the quoted
invocation. Not sure which one of these corner use-cases is more
important to support.)
* Fix chk_cc error message to point user at `gcc` not `cc`.
2014-04-29 00:57:26 +08:00
2012-01-31 08:29:13 +08:00
# a little post-processing of various config values
CFG_PREFIX=${CFG_PREFIX%/}
2013-10-21 17:18:21 +08:00
CFG_MANDIR=${CFG_MANDIR%/}
2016-09-09 14:18:20 +08:00
CFG_DOCDIR=${CFG_DOCDIR%/}
2013-10-21 17:18:21 +08:00
CFG_HOST="$(echo $CFG_HOST | tr ',' ' ')"
CFG_TARGET="$(echo $CFG_TARGET | tr ',' ' ')"
2014-11-20 03:53:18 +08:00
CFG_SUPPORTED_TARGET=""
for target_file in ${CFG_SRC_DIR}mk/cfg/*.mk; do
CFG_SUPPORTED_TARGET="${CFG_SUPPORTED_TARGET} $(basename "$target_file" .mk)"
done
2011-12-03 08:04:17 +08:00
2015-06-22 11:53:34 +08:00
# copy build-triples to host-triples so that builds are a subset of hosts
V_TEMP=""
for i in $CFG_BUILD $CFG_HOST;
do
echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
CFG_HOST=$V_TEMP
2013-03-02 20:25:12 +08:00
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
2013-10-21 17:18:21 +08:00
for i in $CFG_HOST $CFG_TARGET;
2013-03-02 20:25:12 +08:00
do
echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
2013-10-21 17:18:21 +08:00
CFG_TARGET=$V_TEMP
2013-03-02 20:25:12 +08:00
2011-11-04 05:13:22 +08:00
step_msg "writing configuration"
putvar CFG_SRC_DIR
2015-06-13 01:40:07 +08:00
putvar CFG_SRC_DIR_RELATIVE
2011-11-04 05:13:22 +08:00
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
2012-01-31 08:29:13 +08:00
putvar CFG_PREFIX
2013-10-21 17:18:21 +08:00
putvar CFG_HOST
putvar CFG_TARGET
2014-01-14 08:45:33 +08:00
putvar CFG_LIBDIR_RELATIVE
2012-03-01 03:48:29 +08:00
putvar CFG_DISABLE_MANAGE_SUBMODULES
2015-07-21 07:39:47 +08:00
putvar CFG_AARCH64_LINUX_ANDROID_NDK
putvar CFG_ARM_LINUX_ANDROIDEABI_NDK
2016-05-05 06:08:14 +08:00
putvar CFG_ARMV7_LINUX_ANDROIDEABI_NDK
2015-08-09 13:15:50 +08:00
putvar CFG_I686_LINUX_ANDROID_NDK
2015-12-16 05:34:06 +08:00
putvar CFG_NACL_CROSS_PATH
2013-10-21 17:18:21 +08:00
putvar CFG_MANDIR
2016-09-09 14:18:20 +08:00
putvar CFG_DOCDIR
2015-08-22 12:43:56 +08:00
putvar CFG_USING_LIBCPP
2013-10-21 17:18:21 +08:00
2013-05-30 05:18:09 +08:00
# Avoid spurious warnings from clang by feeding it original source on
# ccache-miss rather than preprocessed input.
2015-07-27 05:18:30 +08:00
if [ -n "$CFG_ENABLE_CCACHE" ] && [ -n "$CFG_USING_CLANG" ]
2013-05-30 05:18:09 +08:00
then
CFG_CCACHE_CPP2=1
putvar CFG_CCACHE_CPP2
fi
2015-07-27 05:18:30 +08:00
if [ -n "$CFG_ENABLE_CCACHE" ]
2013-05-30 22:26:12 +08:00
then
CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
putvar CFG_CCACHE_BASEDIR
fi
2011-11-04 05:13:22 +08:00
putvar CFG_LLVM_SRC_DIR
2013-10-21 17:18:21 +08:00
for t in $CFG_HOST
2011-11-04 05:13:22 +08:00
do
CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
2011-11-03 07:21:17 +08:00
putvar $CFG_LLVM_BUILD_DIR
putvar $CFG_LLVM_INST_DIR
done
2011-11-02 06:22:07 +08:00
2011-11-04 05:13:22 +08:00
msg
2017-01-24 07:47:43 +08:00
copy_if_changed ${CFG_SRC_DIR}src/bootstrap/mk/Makefile.in ./Makefile
2012-02-29 04:05:05 +08:00
move_if_changed config.tmp config.mk
rm -f config.tmp
2012-03-27 08:58:43 +08:00
touch config.stamp
2011-03-17 08:36:49 +08:00
2015-04-09 05:21:36 +08:00
if [ -z "$CFG_ENABLE_DEBUG" ]; then
step_msg "configured in release mode. for development consider --enable-debug"
else
step_msg "complete"
fi
2016-12-09 07:09:20 +08:00
if [ "$CFG_SRC_DIR" = `pwd` ]; then
X_PY=x.py
else
X_PY=${CFG_SRC_DIR_RELATIVE}x.py
fi
2017-01-24 07:47:43 +08:00
msg "run \`python ${X_PY} --help\`"
2014-02-14 19:34:18 +08:00
msg