Skip to content

Commit 6c5e85f

Browse files
committed
---
yaml --- r: 276426 b: refs/heads/master c: 52f48bd h: refs/heads/master
1 parent d67d4a9 commit 6c5e85f

File tree

116 files changed

+2551
-1584
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

116 files changed

+2551
-1584
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 84843b73dc8e54f1e8c1e4418b7d56dbd513dd65
2+
refs/heads/master: 52f48bdcb5260fa82df840c8224338dd28b7b818
33
refs/heads/snap-stage3: 235d77457d80b549dad3ac36d94f235208a1eafb
44
refs/heads/try: 49312a405e14a449b98fe0056b12a40ac128be4a
55
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

trunk/Makefile.in

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,8 @@
5959
# * check-stage$(stage)-$(crate) - Test a crate in a specific stage
6060
# * check-stage$(stage)-{rpass,rfail,cfail,rmake,...} - Run tests in src/test/
6161
# * check-stage1-T-$(target)-H-$(host) - Run cross-compiled-tests
62-
# * tidy-basic - show file / line stats
63-
# * tidy-errors - show the highest rustc error code
64-
# * tidy-features - show the status of language and lib features
62+
# * tidy - Basic style check, show highest rustc error code and
63+
# the status of language and lib features
6564
# * rustc-stage$(stage) - Only build up to a specific stage
6665
#
6766
# Then mix in some of these environment variables to harness the

trunk/configure

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,7 @@ valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
632632
valopt android-cross-path "" "Android NDK standalone path (deprecated)"
633633
valopt i686-linux-android-ndk "" "i686-linux-android NDK standalone path"
634634
valopt arm-linux-androideabi-ndk "" "arm-linux-androideabi NDK standalone path"
635+
valopt armv7-linux-androideabi-ndk "" "armv7-linux-androideabi NDK standalone path"
635636
valopt aarch64-linux-android-ndk "" "aarch64-linux-android NDK standalone path"
636637
valopt nacl-cross-path "" "NaCl SDK path (Pepper Canary is recommended). Must be absolute!"
637638
valopt release-channel "dev" "the name of the release channel to build"
@@ -1144,6 +1145,15 @@ do
11441145

11451146
case $i in
11461147
*android*)
1148+
case $i in
1149+
armv7-linux-androideabi)
1150+
cmd_prefix="arm-linux-androideabi"
1151+
;;
1152+
*)
1153+
cmd_prefix=$i
1154+
;;
1155+
esac
1156+
11471157
upper_snake_target=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
11481158
eval ndk=\$"CFG_${upper_snake_target}_NDK"
11491159
if [ -z "$ndk" ]
@@ -1154,7 +1164,7 @@ do
11541164
fi
11551165

11561166
# Perform a basic sanity check of the NDK
1157-
for android_ndk_tool in "$ndk/bin/$i-gcc" "$ndk/bin/$i-g++" "$ndk/bin/$i-ar"
1167+
for android_ndk_tool in "$ndk/bin/$cmd_prefix-gcc" "$ndk/bin/$cmd_prefix-g++" "$ndk/bin/$cmd_prefix-ar"
11581168
do
11591169
if [ ! -f $android_ndk_tool ]
11601170
then
@@ -1786,6 +1796,7 @@ putvar CFG_LIBDIR_RELATIVE
17861796
putvar CFG_DISABLE_MANAGE_SUBMODULES
17871797
putvar CFG_AARCH64_LINUX_ANDROID_NDK
17881798
putvar CFG_ARM_LINUX_ANDROIDEABI_NDK
1799+
putvar CFG_ARMV7_LINUX_ANDROIDEABI_NDK
17891800
putvar CFG_I686_LINUX_ANDROID_NDK
17901801
putvar CFG_NACL_CROSS_PATH
17911802
putvar CFG_MANDIR
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# armv7-linux-androideabi configuration
2+
CC_armv7-linux-androideabi=$(CFG_ARMV7_LINUX_ANDROIDEABI_NDK)/bin/arm-linux-androideabi-gcc
3+
CXX_armv7-linux-androideabi=$(CFG_ARMV7_LINUX_ANDROIDEABI_NDK)/bin/arm-linux-androideabi-g++
4+
CPP_armv7-linux-androideabi=$(CFG_ARMV7_LINUX_ANDROIDEABI_NDK)/bin/arm-linux-androideabi-gcc -E
5+
AR_armv7-linux-androideabi=$(CFG_ARMV7_LINUX_ANDROIDEABI_NDK)/bin/arm-linux-androideabi-ar
6+
CFG_LIB_NAME_armv7-linux-androideabi=lib$(1).so
7+
CFG_STATIC_LIB_NAME_armv7-linux-androideabi=lib$(1).a
8+
CFG_LIB_GLOB_armv7-linux-androideabi=lib$(1)-*.so
9+
CFG_LIB_DSYM_GLOB_armv7-linux-androideabi=lib$(1)-*.dylib.dSYM
10+
CFG_JEMALLOC_CFLAGS_armv7-linux-androideabi := -D__arm__ -DANDROID -D__ANDROID__ $(CFLAGS)
11+
CFG_GCCISH_CFLAGS_armv7-linux-androideabi := -Wall -g -fPIC -D__arm__ -mfloat-abi=softfp -march=armv7-a -mfpu=vfpv3-d16 -DANDROID -D__ANDROID__ $(CFLAGS)
12+
CFG_GCCISH_CXXFLAGS_armv7-linux-androideabi := -fno-rtti $(CXXFLAGS)
13+
CFG_GCCISH_LINK_FLAGS_armv7-linux-androideabi := -shared -fPIC -ldl -g -lm -lsupc++
14+
CFG_GCCISH_DEF_FLAG_armv7-linux-androideabi := -Wl,--export-dynamic,--dynamic-list=
15+
CFG_LLC_FLAGS_armv7-linux-androideabi :=
16+
CFG_INSTALL_NAME_armv7-linux-androideabi =
17+
CFG_EXE_SUFFIX_armv7-linux-androideabi :=
18+
CFG_WINDOWSY_armv7-linux-androideabi :=
19+
CFG_UNIXY_armv7-linux-androideabi := 1
20+
CFG_LDPATH_armv7-linux-androideabi :=
21+
CFG_RUN_armv7-linux-androideabi=
22+
CFG_RUN_TARG_armv7-linux-androideabi=
23+
RUSTC_FLAGS_armv7-linux-androideabi :=
24+
RUSTC_CROSS_FLAGS_armv7-linux-androideabi :=
25+
CFG_GNU_TRIPLE_armv7-linux-androideabi := arm-linux-androideabi

trunk/src/bootstrap/README.md

Lines changed: 136 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Bootstrapping Rust
1+
# rustbuild - Bootstrapping Rust
22

33
This is an in-progress README which is targeted at helping to explain how Rust
44
is bootstrapped and in general some of the technical details of the build
@@ -8,20 +8,64 @@ system.
88
> intended to be the primarily used one just yet. The makefiles are currently
99
> the ones that are still "guaranteed to work" as much as possible at least.
1010
11-
## Using the new build system
11+
## Using rustbuild
1212

1313
When configuring Rust via `./configure`, pass the following to enable building
1414
via this build system:
1515

1616
```
1717
./configure --enable-rustbuild
18+
make
1819
```
1920

20-
## ...
21+
Afterwards the `Makefile` which is generated will have a few commands like
22+
`make check`, `make tidy`, etc. For finer-grained control, the
23+
`bootstrap.py` entry point can be used:
24+
25+
```
26+
python src/bootstrap/bootstrap.py
27+
```
28+
29+
This accepts a number of options like `--stage` and `--step` which can configure
30+
what's actually being done.
31+
32+
## Configuring rustbuild
33+
34+
There are currently two primary methods for configuring the rustbuild build
35+
system. First, the `./configure` options serialized in `config.mk` will be
36+
parsed and read. That is, if any `./configure` options are passed, they'll be
37+
handled naturally.
38+
39+
Next, rustbuild offers a TOML-based configuration system with a `config.toml`
40+
file in the same location as `config.mk`. An example of this configuration can
41+
be found at `src/bootstrap/config.toml.example`, and the configuration file
42+
can also be passed as `--config path/to/config.toml` if the build system is
43+
being invoked manually (via the python script).
44+
45+
## Build stages
46+
47+
The rustbuild build system goes through a few phases to actually build the
48+
compiler. What actually happens when you invoke rustbuild is:
49+
50+
1. The entry point script, `src/bootstrap/bootstrap.py` is run. This script is
51+
responsible for downloading the stage0 compiler/Cargo binaries, and it then
52+
compiles the build system itself (this folder). Finally, it then invokes the
53+
actual `boostrap` binary build system.
54+
2. In Rust, `bootstrap` will slurp up all configuration, perform a number of
55+
sanity checks (compilers exist for example), and then start building the
56+
stage0 artifacts.
57+
3. The stage0 `cargo` downloaded earlier is used to build the standard library
58+
and the compiler, and then these binaries are then copied to the `stage1`
59+
directory. That compiler is then used to generate the stage1 artifacts which
60+
are then copied to the stage2 directory, and then finally the stage2
61+
artifacts are generated using that compiler.
62+
63+
The goal of each stage is to (a) leverage Cargo as much as possible and failing
64+
that (b) leverage Rust as much as possible!
2165

2266
## Directory Layout
2367

24-
This build system houses all output under the `target` directory, which looks
68+
This build system houses all output under the `build` directory, which looks
2569
like this:
2670

2771
```
@@ -42,6 +86,12 @@ build/
4286
debug/
4387
release/
4488
89+
# Output of the dist-related steps like dist-std, dist-rustc, and dist-docs
90+
dist/
91+
92+
# Temporary directory used for various input/output as part of various stages
93+
tmp/
94+
4595
# Each remaining directory is scoped by the "host" triple of compilation at
4696
# hand.
4797
x86_64-unknown-linux-gnu/
@@ -50,7 +100,8 @@ build/
50100
# folder is under. The exact layout here will likely depend on the platform,
51101
# and this is also built with CMake so the build system is also likely
52102
# different.
53-
compiler-rt/build/
103+
compiler-rt/
104+
build/
54105
55106
# Output folder for LLVM if it is compiled for this target
56107
llvm/
@@ -67,6 +118,17 @@ build/
67118
share/
68119
...
69120
121+
# Output folder for all documentation of this target. This is what's filled
122+
# in whenever the `doc` step is run.
123+
doc/
124+
125+
# Output for all compiletest-based test suites
126+
test/
127+
run-pass/
128+
compile-fail/
129+
debuginfo/
130+
...
131+
70132
# Location where the stage0 Cargo and Rust compiler are unpacked. This
71133
# directory is purely an extracted and overlaid tarball of these two (done
72134
# by the bootstrapy python script). In theory the build system does not
@@ -82,7 +144,9 @@ build/
82144
# invocation. The build system instruments calling Cargo in the right order
83145
# with the right variables to ensure these are filled in correctly.
84146
stageN-std/
147+
stageN-test/
85148
stageN-rustc/
149+
stageN-tools/
86150
87151
# This is a special case of the above directories, **not** filled in via
88152
# Cargo but rather the build system itself. The stage0 compiler already has
@@ -96,7 +160,7 @@ build/
96160
# Basically this directory is just a temporary artifact use to configure the
97161
# stage0 compiler to ensure that the libstd we just built is used to
98162
# compile the stage1 compiler.
99-
stage0-rustc/lib/
163+
stage0-sysroot/lib/
100164
101165
# These output directories are intended to be standalone working
102166
# implementations of the compiler (corresponding to each stage). The build
@@ -108,3 +172,69 @@ build/
108172
stage2/
109173
stage3/
110174
```
175+
176+
## Cargo projects
177+
178+
The current build is unfortunately not quite as simple as `cargo build` in a
179+
directory, but rather the compiler is split into three different Cargo projects:
180+
181+
* `src/rustc/std_shim` - a project which builds and compiles libstd
182+
* `src/rustc/test_shim` - a project which builds and compiles libtest
183+
* `src/rustc` - the actual compiler itself
184+
185+
Each "project" has a corresponding Cargo.lock file with all dependencies, and
186+
this means that building the compiler involves running Cargo three times. The
187+
structure here serves two goals:
188+
189+
1. Facilitating dependencies coming from crates.io. These dependencies don't
190+
depend on `std`, so libstd is a separate project compiled ahead of time
191+
before the actual compiler builds.
192+
2. Splitting "host artifacts" from "target artifacts". That is, when building
193+
code for an arbitrary target you don't need the entire compiler, but you'll
194+
end up needing libraries like libtest that depend on std but also want to use
195+
crates.io dependencies. Hence, libtest is split out as its own project that
196+
is sequenced after `std` but before `rustc`. This project is built for all
197+
targets.
198+
199+
There is some loss in build parallelism here because libtest can be compiled in
200+
parallel with a number of rustc artifacts, but in theory the loss isn't too bad!
201+
202+
## Build tools
203+
204+
We've actually got quite a few tools that we use in the compiler's build system
205+
and for testing. To organize these, each tool is a project in `src/tools` with a
206+
corresponding `Cargo.toml`. All tools are compiled with Cargo (currently having
207+
independent `Cargo.lock` files) and do not currently explicitly depend on the
208+
compiler or standard library. Compiling each tool is sequenced after the
209+
appropriate libstd/libtest/librustc compile above.
210+
211+
## Extending rustbuild
212+
213+
So you'd like to add a feature to the rustbuild build system or just fix a bug.
214+
Great! One of the major motivational factors for moving away from `make` is that
215+
Rust is in theory much easier to read, modify, and write. If you find anything
216+
excessively confusing, please open an issue on this and we'll try to get it
217+
documented or simplified pronto.
218+
219+
First up, you'll probably want to read over the documentation above as that'll
220+
give you a high level overview of what rustbuild is doing. You also probably
221+
want to play around a bit yourself by just getting it up and running before you
222+
dive too much into the actual build system itself.
223+
224+
After that, each module in rustbuild should have enough documentation to keep
225+
you up and running. Some general areas that you may be interested in modifying
226+
are:
227+
228+
* Adding a new build tool? Take a look at `build/step.rs` for examples of other
229+
tools, as well as `build/mod.rs`.
230+
* Adding a new compiler crate? Look no further! Adding crates can be done by
231+
adding a new directory with `Cargo.toml` followed by configuring all
232+
`Cargo.toml` files accordingly.
233+
* Adding a new dependency from crates.io? We're still working on that, so hold
234+
off on that for now.
235+
* Adding a new configuration option? Take a look at `build/config.rs` or perhaps
236+
`build/flags.rs` and then modify the build elsewhere to read that option.
237+
* Adding a sanity check? Take a look at `build/sanity.rs`.
238+
239+
If you have any questions feel free to reach out on `#rust-internals` on IRC or
240+
open an issue in the bug tracker!

trunk/src/bootstrap/bootstrap.py

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,46 @@
1616
import subprocess
1717
import sys
1818
import tarfile
19+
import tempfile
20+
1921

2022
def get(url, path, verbose=False):
21-
print("downloading " + url)
2223
sha_url = url + ".sha256"
23-
sha_path = path + ".sha256"
24-
for _url, _path in ((url, path), (sha_url, sha_path)):
25-
# see http://serverfault.com/questions/301128/how-to-download
26-
if sys.platform == 'win32':
27-
run(["PowerShell.exe", "/nologo", "-Command",
28-
"(New-Object System.Net.WebClient)"
29-
".DownloadFile('{}', '{}')".format(_url, _path)],
30-
verbose=verbose)
31-
else:
32-
run(["curl", "-o", _path, _url], verbose=verbose)
24+
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
25+
temp_path = temp_file.name
26+
with tempfile.NamedTemporaryFile(suffix=".sha256", delete=False) as sha_file:
27+
sha_path = sha_file.name
28+
29+
try:
30+
download(sha_path, sha_url, verbose)
31+
download(temp_path, url, verbose)
32+
verify(temp_path, sha_path, verbose)
33+
print("moving " + temp_path + " to " + path)
34+
shutil.move(temp_path, path)
35+
finally:
36+
delete_if_present(sha_path)
37+
delete_if_present(temp_path)
38+
39+
40+
def delete_if_present(path):
41+
if os.path.isfile(path):
42+
print("removing " + path)
43+
os.unlink(path)
44+
45+
46+
def download(path, url, verbose):
47+
print("downloading " + url + " to " + path)
48+
# see http://serverfault.com/questions/301128/how-to-download
49+
if sys.platform == 'win32':
50+
run(["PowerShell.exe", "/nologo", "-Command",
51+
"(New-Object System.Net.WebClient)"
52+
".DownloadFile('{}', '{}')".format(url, path)],
53+
verbose=verbose)
54+
else:
55+
run(["curl", "-o", path, url], verbose=verbose)
56+
57+
58+
def verify(path, sha_path, verbose):
3359
print("verifying " + path)
3460
with open(path, "rb") as f:
3561
found = hashlib.sha256(f.read()).hexdigest()
@@ -43,6 +69,7 @@ def get(url, path, verbose=False):
4369
raise RuntimeError(err)
4470
sys.exit(err)
4571

72+
4673
def unpack(tarball, dst, verbose=False, match=None):
4774
print("extracting " + tarball)
4875
fname = os.path.basename(tarball).replace(".tar.gz", "")

trunk/src/bootstrap/build/cc.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,29 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11+
//! C-compiler probing and detection.
12+
//!
13+
//! This module will fill out the `cc` and `cxx` maps of `Build` by looking for
14+
//! C and C++ compilers for each target configured. A compiler is found through
15+
//! a number of vectors (in order of precedence)
16+
//!
17+
//! 1. Configuration via `target.$target.cc` in `config.toml`.
18+
//! 2. Configuration via `target.$target.android-ndk` in `config.toml`, if
19+
//! applicable
20+
//! 3. Special logic to probe on OpenBSD
21+
//! 4. The `CC_$target` environment variable.
22+
//! 5. The `CC` environment variable.
23+
//! 6. "cc"
24+
//!
25+
//! Some of this logic is implemented here, but much of it is farmed out to the
26+
//! `gcc` crate itself, so we end up having the same fallbacks as there.
27+
//! Similar logic is then used to find a C++ compiler, just some s/cc/c++/ is
28+
//! used.
29+
//!
30+
//! It is intended that after this module has run no C/C++ compiler will
31+
//! ever be probed for. Instead the compilers found here will be used for
32+
//! everything.
33+
1134
use std::process::Command;
1235

1336
use build_helper::{cc2ar, output};

0 commit comments

Comments
 (0)