@@ -151,11 +151,22 @@ validate_opt () {
151151 done
152152}
153153
154- valopt () {
155- VAL_OPTIONS=" $VAL_OPTIONS $1 "
154+ # `valopt OPTION_NAME DEFAULT DOC` extracts a string-valued option
155+ # from command line, using provided default value for the option if
156+ # not present, and saves it to the generated config.mk.
157+ #
158+ # `valopt_nosave` is much the same, except that it does not save the
159+ # result to config.mk (instead the script should use `putvar` itself
160+ # later on to save it). `valopt_core` is the core upon which the
161+ # other two are built.
156162
157- local OP=$1
158- local DEFAULT=$2
163+ valopt_core () {
164+ VAL_OPTIONS=" $VAL_OPTIONS $2 "
165+
166+ local SAVE=$1
167+ local OP=$2
168+ local DEFAULT=$3
169+ shift
159170 shift
160171 shift
161172 local DOC=" $* "
@@ -172,7 +183,10 @@ valopt() {
172183 eval $V =$val
173184 fi
174185 done
175- putvar $V
186+ if [ " $SAVE " = " save" ]
187+ then
188+ putvar $V
189+ fi
176190 else
177191 if [ -z " $DEFAULT " ]
178192 then
@@ -183,11 +197,30 @@ valopt() {
183197 fi
184198}
185199
186- opt () {
187- BOOL_OPTIONS=" $BOOL_OPTIONS $1 "
200+ valopt_nosave () {
201+ valopt_core nosave " $@ "
202+ }
203+
204+ valopt () {
205+ valopt_core save " $@ "
206+ }
188207
189- local OP=$1
190- local DEFAULT=$2
208+ # `opt OPTION_NAME DEFAULT DOC` extracts a boolean-valued option from
209+ # command line, using the provided default value (0/1) for the option
210+ # if not present, and saves it to the generated config.mk.
211+ #
212+ # `opt_nosave` is much the same, except that it does not save the
213+ # result to config.mk (instead the script should use `putvar` itself
214+ # later on to save it). `opt_core` is the core upon which the other
215+ # two are built.
216+
217+ opt_core () {
218+ BOOL_OPTIONS=" $BOOL_OPTIONS $2 "
219+
220+ local SAVE=$1
221+ local OP=$2
222+ local DEFAULT=$3
223+ shift
191224 shift
192225 shift
193226 local DOC=" $* "
@@ -211,7 +244,10 @@ opt() {
211244 FLAG=$( echo $FLAG | tr ' a-z' ' A-Z' )
212245 local V=" CFG_${FLAG} _${OP} "
213246 eval $V =1
214- putvar $V
247+ if [ " $SAVE " = " save" ]
248+ then
249+ putvar $V
250+ fi
215251 fi
216252 done
217253 else
@@ -223,6 +259,14 @@ opt() {
223259 fi
224260}
225261
262+ opt_nosave () {
263+ opt_core nosave " $@ "
264+ }
265+
266+ opt () {
267+ opt_core save " $@ "
268+ }
269+
226270envopt () {
227271 local NAME=$1
228272 local V=" CFG_${NAME} "
@@ -422,38 +466,40 @@ opt llvm-assertions 1 "build LLVM with assertions"
422466opt debug 1 " build with extra debug fun"
423467opt ratchet-bench 0 " ratchet benchmarks"
424468opt fast-make 0 " use .gitmodules as timestamp for submodule deps"
425- opt manage-submodules 1 " let the build manage the git submodules"
426469opt mingw-cross 0 " cross-compile for win32 using mingw"
427- opt clang 0 " prefer clang to gcc for building the runtime"
428470opt ccache 0 " invoke gcc/clang via ccache to reuse object files between builds"
429471opt local-rust 0 " use an installed rustc rather than downloading a snapshot"
430- opt inject-std-version 1 " inject the current compiler version of libstd into programs"
431472opt llvm-static-stdcpp 0 " statically link to libstdc++ for LLVM"
432473opt rpath 0 " build rpaths into rustc itself"
433474opt nightly 0 " build nightly packages"
434475opt verify-install 1 " verify installed binaries work"
435- opt jemalloc 1 " build liballoc with jemalloc"
436476# This is used by the automation to produce single-target nightlies
437477opt dist-host-only 0 " only install bins for the host architecture"
438- valopt prefix " /usr/local" " set installation prefix"
439- valopt local-rust-root " /usr/local" " set prefix for local rust binary"
440- valopt llvm-root " " " set LLVM root"
441- valopt jemalloc-root " " " set directory where libjemalloc_pic.a is located"
442- valopt android-cross-path " /opt/ndk_standalone" " Android NDK standalone path"
443- valopt mingw32-cross-path " " " MinGW32 cross compiler path"
444-
445- valopt build " ${DEFAULT_BUILD} " " GNUs ./configure syntax LLVM build triple"
446- valopt host " ${CFG_BUILD} " " GNUs ./configure syntax LLVM host triples"
447- valopt target " ${CFG_HOST} " " GNUs ./configure syntax LLVM target triples"
478+ opt inject-std-version 1 " inject the current compiler version of libstd into programs"
479+ opt jemalloc 1 " build liballoc with jemalloc"
448480
449481valopt localstatedir " /var/lib" " local state directory"
450482valopt sysconfdir " /etc" " install system configuration files"
451483
452484valopt datadir " ${CFG_PREFIX} /share" " install data"
453485valopt infodir " ${CFG_PREFIX} /share/info" " install additional info"
454- valopt mandir " ${CFG_PREFIX} /share/man" " install man pages in PATH"
486+ valopt llvm-root " " " set LLVM root"
487+ valopt jemalloc-root " " " set directory where libjemalloc_pic.a is located"
488+ valopt build " ${DEFAULT_BUILD} " " GNUs ./configure syntax LLVM build triple"
489+ valopt android-cross-path " /opt/ndk_standalone" " Android NDK standalone path"
490+ valopt mingw32-cross-path " " " MinGW32 cross compiler path"
491+
492+ # Many of these are saved below during the "writing configuration" step
493+ # (others are conditionally saved).
494+ opt_nosave manage-submodules 1 " let the build manage the git submodules"
495+ opt_nosave clang 0 " prefer clang to gcc for building the runtime"
455496
456- valopt release-channel " dev" " the name of the release channel to build"
497+ valopt_nosave prefix " /usr/local" " set installation prefix"
498+ valopt_nosave local-rust-root " /usr/local" " set prefix for local rust binary"
499+ valopt_nosave host " ${CFG_BUILD} " " GNUs ./configure syntax LLVM host triples"
500+ valopt_nosave target " ${CFG_HOST} " " GNUs ./configure syntax LLVM target triples"
501+ valopt_nosave mandir " ${CFG_PREFIX} /share/man" " install man pages in PATH"
502+ valopt_nosave release-channel " dev" " the name of the release channel to build"
457503
458504# On windows we just store the libraries in the bin directory because
459505# there's no rpath. This is where the build system itself puts libraries;
491537if [ ! -z " $CFG_ENABLE_NIGHTLY " ]
492538then
493539 CFG_RELEASE_CHANNEL=nightly
494- putvar CFG_RELEASE_CHANNEL
495540fi
541+ putvar CFG_RELEASE_CHANNEL
496542
497543step_msg " looking for build programs"
498544
@@ -605,17 +651,27 @@ then
605651 err " no local rust to use"
606652 fi
607653
608- LRV=` ${CFG_LOCAL_RUST_ROOT} /bin/rustc${BIN_SUF} --version`
654+ CMD=" ${CFG_LOCAL_RUST_ROOT} /bin/rustc${BIN_SUF} "
655+ LRV=` $CMD --version`
656+ if [ $? -ne 0 ]
657+ then
658+ step_msg " failure while running $CMD --version"
659+ exit 1
660+ fi
609661 step_msg " using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV "
610662 putvar CFG_LOCAL_RUST_ROOT
663+ else
664+ if [ ! -z " $CFG_LOCAL_RUST_ROOT " ]
665+ then
666+ warn " Use of --local-rust-root without --enable-local-rust"
667+ fi
611668fi
612669
613670# Force freebsd to build with clang; gcc doesn't like us there
614671if [ $CFG_OSTYPE = unknown-freebsd ]
615672then
616673 step_msg " on FreeBSD, forcing use of clang"
617674 CFG_ENABLE_CLANG=1
618- putvar CFG_ENABLE_CLANG
619675fi
620676
621677if [ -z " $CFG_ENABLE_CLANG " -a -z " $CFG_GCC " ]
@@ -632,12 +688,10 @@ then
632688 then
633689 step_msg " on OS X 10.9, forcing use of clang"
634690 CFG_ENABLE_CLANG=1
635- putvar CFG_ENABLE_CLANG
636691 else
637692 if [ $( " $CFG_GCC " --version 2>&1 | grep -c ' 4\.[0-6]' ) -ne 0 ]; then
638693 step_msg " older GCC found, using clang instead"
639694 CFG_ENABLE_CLANG=1
640- putvar CFG_ENABLE_CLANG
641695 else
642696 # on OS X, with xcode 5 and newer, certain developers may have
643697 # cc, gcc and g++ point to a mixture of clang and gcc
@@ -663,6 +717,13 @@ then
663717 fi
664718fi
665719
720+ # Okay, at this point, we have made up our minds about whether we are
721+ # going to force CFG_ENABLE_CLANG or not; save the setting if so.
722+ if [ ! -z " $CFG_ENABLE_CLANG " ]
723+ then
724+ putvar CFG_ENABLE_CLANG
725+ fi
726+
666727if [ ! -z " $CFG_LLVM_ROOT " -a -e " $CFG_LLVM_ROOT /bin/llvm-config" ]
667728then
668729 step_msg " using custom LLVM at $CFG_LLVM_ROOT "
@@ -1203,18 +1264,11 @@ putvar CFG_OSTYPE
12031264putvar CFG_CPUTYPE
12041265putvar CFG_CONFIGURE_ARGS
12051266putvar CFG_PREFIX
1206- putvar CFG_BUILD
12071267putvar CFG_HOST
12081268putvar CFG_TARGET
1209- putvar CFG_LIBDIR
12101269putvar CFG_LIBDIR_RELATIVE
12111270putvar CFG_DISABLE_MANAGE_SUBMODULES
1212- putvar CFG_ANDROID_CROSS_PATH
1213- putvar CFG_MINGW32_CROSS_PATH
12141271putvar CFG_MANDIR
1215- putvar CFG_DISABLE_INJECT_STD_VERSION
1216- putvar CFG_JEMALLOC_ROOT
1217- putvar CFG_DISABLE_JEMALLOC
12181272
12191273# Avoid spurious warnings from clang by feeding it original source on
12201274# ccache-miss rather than preprocessed input.
@@ -1237,7 +1291,6 @@ then
12371291 putvar CFG_PANDOC
12381292fi
12391293
1240- putvar CFG_LLVM_ROOT
12411294putvar CFG_LLVM_SRC_DIR
12421295
12431296for t in $CFG_HOST
0 commit comments