1
Fork 0

Auto merge of #77133 - tmandry:bootstrap-host, r=Mark-Simulacrum

bootstrap: Always build for host, even when target is given

This changes the behavior from *not* building for host whenever an
explicit target is specified. I find this much less confusing.

You can still disable host steps by passing an explicit empty list for
host.

Fixes #76990.

r? `@Mark-Simulacrum`
This commit is contained in:
bors 2020-09-30 00:59:12 +00:00
commit 0d9afb6717
17 changed files with 52 additions and 86 deletions

View file

@ -6,6 +6,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Non-breaking changes since the last major version] ## [Non-breaking changes since the last major version]
None.
## [Version 2] - 2020-09-25
- `host` now defaults to the value of `build` in all cases
+ Previously `host` defaulted to an empty list when `target` was overridden, and to `build` otherwise
### Non-breaking changes
- Add `x.py setup` [#76631](https://github.com/rust-lang/rust/pull/76631) - Add `x.py setup` [#76631](https://github.com/rust-lang/rust/pull/76631)
- Add a changelog for x.py [#76626](https://github.com/rust-lang/rust/pull/76626) - Add a changelog for x.py [#76626](https://github.com/rust-lang/rust/pull/76626)
- Optionally, download LLVM from CI on Linux and NixOS - Optionally, download LLVM from CI on Linux and NixOS
@ -21,7 +30,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
[#77120](https://github.com/rust-lang/rust/pull/77120). [#77120](https://github.com/rust-lang/rust/pull/77120).
## [Version 0] - 2020-09-11 ## [Version 1] - 2020-09-11
This is the first changelog entry, and it does not attempt to be an exhaustive list of features in x.py. This is the first changelog entry, and it does not attempt to be an exhaustive list of features in x.py.
Instead, this documents the changes to bootstrap in the past 2 months. Instead, this documents the changes to bootstrap in the past 2 months.

View file

@ -40,7 +40,7 @@ fn main() {
} }
fn check_version(config: &Config) -> Option<String> { fn check_version(config: &Config) -> Option<String> {
const VERSION: usize = 1; const VERSION: usize = 2;
let mut msg = String::new(); let mut msg = String::new();

View file

@ -172,15 +172,7 @@ impl StepDescription {
} }
// Determine the targets participating in this rule. // Determine the targets participating in this rule.
let targets = if self.only_hosts { let targets = if self.only_hosts { &builder.hosts } else { &builder.targets };
if builder.config.skip_only_host_steps {
return; // don't run anything
} else {
&builder.hosts
}
} else {
&builder.targets
};
for target in targets { for target in targets {
let run = RunConfig { builder, path: pathset.path(builder), target: *target }; let run = RunConfig { builder, path: pathset.path(builder), target: *target };

View file

@ -6,7 +6,6 @@ fn configure(cmd: &str, host: &[&str], target: &[&str]) -> Config {
let mut config = Config::parse(&[cmd.to_owned()]); let mut config = Config::parse(&[cmd.to_owned()]);
// don't save toolstates // don't save toolstates
config.save_toolstates = None; config.save_toolstates = None;
config.skip_only_host_steps = false;
config.dry_run = true; config.dry_run = true;
config.ninja_in_file = false; config.ninja_in_file = false;
// try to avoid spurious failures in dist where we create/delete each others file // try to avoid spurious failures in dist where we create/delete each others file
@ -20,16 +19,8 @@ fn configure(cmd: &str, host: &[&str], target: &[&str]) -> Config {
t!(fs::create_dir_all(&dir)); t!(fs::create_dir_all(&dir));
config.out = dir; config.out = dir;
config.build = TargetSelection::from_user("A"); config.build = TargetSelection::from_user("A");
config.hosts = vec![config.build] config.hosts = host.iter().map(|s| TargetSelection::from_user(s)).collect();
.into_iter() config.targets = target.iter().map(|s| TargetSelection::from_user(s)).collect();
.chain(host.iter().map(|s| TargetSelection::from_user(s)))
.collect::<Vec<_>>();
config.targets = config
.hosts
.clone()
.into_iter()
.chain(target.iter().map(|s| TargetSelection::from_user(s)))
.collect::<Vec<_>>();
config config
} }
@ -45,7 +36,7 @@ mod defaults {
#[test] #[test]
fn build_default() { fn build_default() {
let build = Build::new(configure("build", &[], &[])); let build = Build::new(configure("build", &["A"], &["A"]));
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]);
@ -73,7 +64,7 @@ mod defaults {
#[test] #[test]
fn build_stage_0() { fn build_stage_0() {
let config = Config { stage: 0, ..configure("build", &[], &[]) }; let config = Config { stage: 0, ..configure("build", &["A"], &["A"]) };
let build = Build::new(config); let build = Build::new(config);
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]);
@ -95,7 +86,7 @@ mod defaults {
#[test] #[test]
fn build_cross_compile() { fn build_cross_compile() {
let config = Config { stage: 1, ..configure("build", &["B"], &["B"]) }; let config = Config { stage: 1, ..configure("build", &["A", "B"], &["A", "B"]) };
let build = Build::new(config); let build = Build::new(config);
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]);
@ -143,7 +134,7 @@ mod defaults {
#[test] #[test]
fn doc_default() { fn doc_default() {
let mut config = configure("doc", &[], &[]); let mut config = configure("doc", &["A"], &["A"]);
config.compiler_docs = true; config.compiler_docs = true;
config.cmd = Subcommand::Doc { paths: Vec::new(), open: false }; config.cmd = Subcommand::Doc { paths: Vec::new(), open: false };
let build = Build::new(config); let build = Build::new(config);
@ -182,7 +173,7 @@ mod dist {
#[test] #[test]
fn dist_baseline() { fn dist_baseline() {
let build = Build::new(configure(&[], &[])); let build = Build::new(configure(&["A"], &["A"]));
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]);
@ -208,7 +199,7 @@ mod dist {
#[test] #[test]
fn dist_with_targets() { fn dist_with_targets() {
let build = Build::new(configure(&[], &["B"])); let build = Build::new(configure(&["A"], &["A", "B"]));
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]);
@ -239,7 +230,7 @@ mod dist {
#[test] #[test]
fn dist_with_hosts() { fn dist_with_hosts() {
let build = Build::new(configure(&["B"], &[])); let build = Build::new(configure(&["A", "B"], &["A", "B"]));
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]);
@ -285,7 +276,7 @@ mod dist {
fn dist_only_cross_host() { fn dist_only_cross_host() {
let a = TargetSelection::from_user("A"); let a = TargetSelection::from_user("A");
let b = TargetSelection::from_user("B"); let b = TargetSelection::from_user("B");
let mut build = Build::new(configure(&["B"], &[])); let mut build = Build::new(configure(&["A", "B"], &["A", "B"]));
build.config.docs = false; build.config.docs = false;
build.config.extended = true; build.config.extended = true;
build.hosts = vec![b]; build.hosts = vec![b];
@ -307,7 +298,7 @@ mod dist {
#[test] #[test]
fn dist_with_targets_and_hosts() { fn dist_with_targets_and_hosts() {
let build = Build::new(configure(&["B"], &["C"])); let build = Build::new(configure(&["A", "B"], &["A", "B", "C"]));
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]);
@ -342,40 +333,26 @@ mod dist {
} }
#[test] #[test]
fn dist_with_target_flag() { fn dist_with_empty_host() {
let mut config = configure(&["B"], &["C"]); let config = configure(&[], &["C"]);
config.skip_only_host_steps = true; // as-if --target=C was passed
let build = Build::new(config); let build = Build::new(config);
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]);
let a = TargetSelection::from_user("A"); let a = TargetSelection::from_user("A");
let b = TargetSelection::from_user("B");
let c = TargetSelection::from_user("C"); let c = TargetSelection::from_user("C");
assert_eq!( assert_eq!(first(builder.cache.all::<dist::Docs>()), &[dist::Docs { host: c },]);
first(builder.cache.all::<dist::Docs>()), assert_eq!(first(builder.cache.all::<dist::Mingw>()), &[dist::Mingw { host: c },]);
&[dist::Docs { host: a }, dist::Docs { host: b }, dist::Docs { host: c },]
);
assert_eq!(
first(builder.cache.all::<dist::Mingw>()),
&[dist::Mingw { host: a }, dist::Mingw { host: b }, dist::Mingw { host: c },]
);
assert_eq!(first(builder.cache.all::<dist::Rustc>()), &[]);
assert_eq!( assert_eq!(
first(builder.cache.all::<dist::Std>()), first(builder.cache.all::<dist::Std>()),
&[ &[dist::Std { compiler: Compiler { host: a, stage: 2 }, target: c },]
dist::Std { compiler: Compiler { host: a, stage: 1 }, target: a },
dist::Std { compiler: Compiler { host: a, stage: 1 }, target: b },
dist::Std { compiler: Compiler { host: a, stage: 2 }, target: c },
]
); );
assert_eq!(first(builder.cache.all::<dist::Src>()), &[]);
} }
#[test] #[test]
fn dist_with_same_targets_and_hosts() { fn dist_with_same_targets_and_hosts() {
let build = Build::new(configure(&["B"], &["B"])); let build = Build::new(configure(&["A", "B"], &["A", "B"]));
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Dist), &[]);
@ -428,7 +405,7 @@ mod dist {
#[test] #[test]
fn build_all() { fn build_all() {
let build = Build::new(configure(&["B"], &["C"])); let build = Build::new(configure(&["A", "B"], &["A", "B", "C"]));
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions( builder.run_step_descriptions(
&Builder::get_step_descriptions(Kind::Build), &Builder::get_step_descriptions(Kind::Build),
@ -464,15 +441,13 @@ mod dist {
} }
#[test] #[test]
fn build_with_target_flag() { fn build_with_empty_host() {
let mut config = configure(&["B"], &["C"]); let config = configure(&[], &["C"]);
config.skip_only_host_steps = true;
let build = Build::new(config); let build = Build::new(config);
let mut builder = Builder::new(&build); let mut builder = Builder::new(&build);
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]); builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]);
let a = TargetSelection::from_user("A"); let a = TargetSelection::from_user("A");
let b = TargetSelection::from_user("B");
let c = TargetSelection::from_user("C"); let c = TargetSelection::from_user("C");
assert_eq!( assert_eq!(
@ -480,9 +455,6 @@ mod dist {
&[ &[
compile::Std { compiler: Compiler { host: a, stage: 0 }, target: a }, compile::Std { compiler: Compiler { host: a, stage: 0 }, target: a },
compile::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, compile::Std { compiler: Compiler { host: a, stage: 1 }, target: a },
compile::Std { compiler: Compiler { host: a, stage: 2 }, target: a },
compile::Std { compiler: Compiler { host: a, stage: 1 }, target: b },
compile::Std { compiler: Compiler { host: a, stage: 2 }, target: b },
compile::Std { compiler: Compiler { host: a, stage: 2 }, target: c }, compile::Std { compiler: Compiler { host: a, stage: 2 }, target: c },
] ]
); );
@ -505,7 +477,7 @@ mod dist {
#[test] #[test]
fn test_with_no_doc_stage0() { fn test_with_no_doc_stage0() {
let mut config = configure(&[], &[]); let mut config = configure(&["A"], &["A"]);
config.stage = 0; config.stage = 0;
config.cmd = Subcommand::Test { config.cmd = Subcommand::Test {
paths: vec!["library/std".into()], paths: vec!["library/std".into()],
@ -545,7 +517,7 @@ mod dist {
#[test] #[test]
fn test_exclude() { fn test_exclude() {
let mut config = configure(&[], &[]); let mut config = configure(&["A"], &["A"]);
config.exclude = vec!["src/tools/tidy".into()]; config.exclude = vec!["src/tools/tidy".into()];
config.cmd = Subcommand::Test { config.cmd = Subcommand::Test {
paths: Vec::new(), paths: Vec::new(),
@ -572,7 +544,7 @@ mod dist {
#[test] #[test]
fn doc_ci() { fn doc_ci() {
let mut config = configure(&[], &[]); let mut config = configure(&["A"], &["A"]);
config.compiler_docs = true; config.compiler_docs = true;
config.cmd = Subcommand::Doc { paths: Vec::new(), open: false }; config.cmd = Subcommand::Doc { paths: Vec::new(), open: false };
let build = Build::new(config); let build = Build::new(config);
@ -601,7 +573,7 @@ mod dist {
#[test] #[test]
fn test_docs() { fn test_docs() {
// Behavior of `x.py test` doing various documentation tests. // Behavior of `x.py test` doing various documentation tests.
let mut config = configure(&[], &[]); let mut config = configure(&["A"], &["A"]);
config.cmd = Subcommand::Test { config.cmd = Subcommand::Test {
paths: vec![], paths: vec![],
test_args: vec![], test_args: vec![],

View file

@ -66,8 +66,6 @@ pub struct Config {
pub test_compare_mode: bool, pub test_compare_mode: bool,
pub llvm_libunwind: bool, pub llvm_libunwind: bool,
pub skip_only_host_steps: bool,
pub on_fail: Option<String>, pub on_fail: Option<String>,
pub stage: u32, pub stage: u32,
pub keep_stage: Vec<u32>, pub keep_stage: Vec<u32>,
@ -586,11 +584,6 @@ impl Config {
let build = toml.build.unwrap_or_default(); let build = toml.build.unwrap_or_default();
// If --target was specified but --host wasn't specified, don't run any host-only tests.
let has_hosts = build.host.is_some() || flags.host.is_some();
let has_targets = build.target.is_some() || flags.target.is_some();
config.skip_only_host_steps = !has_hosts && has_targets;
config.hosts = if let Some(arg_host) = flags.host { config.hosts = if let Some(arg_host) = flags.host {
arg_host arg_host
} else if let Some(file_host) = build.host { } else if let Some(file_host) = build.host {

View file

@ -679,7 +679,7 @@ impl Subcommand {
} }
fn split(s: &[String]) -> Vec<String> { fn split(s: &[String]) -> Vec<String> {
s.iter().flat_map(|s| s.split(',')).map(|s| s.to_string()).collect() s.iter().flat_map(|s| s.split(',')).filter(|s| !s.is_empty()).map(|s| s.to_string()).collect()
} }
fn parse_deny_warnings(matches: &getopts::Matches) -> Option<bool> { fn parse_deny_warnings(matches: &getopts::Matches) -> Option<bool> {

View file

@ -31,7 +31,7 @@ ENV TARGETS=arm-linux-androideabi
ENV RUST_CONFIGURE_ARGS --arm-linux-androideabi-ndk=/android/ndk/arm-14 ENV RUST_CONFIGURE_ARGS --arm-linux-androideabi-ndk=/android/ndk/arm-14
ENV SCRIPT python3 ../x.py --stage 2 test --target $TARGETS ENV SCRIPT python3 ../x.py --stage 2 test --host='' --target $TARGETS
COPY scripts/sccache.sh /scripts/ COPY scripts/sccache.sh /scripts/
RUN sh /scripts/sccache.sh RUN sh /scripts/sccache.sh

View file

@ -79,6 +79,6 @@ COPY scripts/sccache.sh /scripts/
RUN sh /scripts/sccache.sh RUN sh /scripts/sccache.sh
ENV RUST_CONFIGURE_ARGS --qemu-armhf-rootfs=/tmp/rootfs ENV RUST_CONFIGURE_ARGS --qemu-armhf-rootfs=/tmp/rootfs
ENV SCRIPT python3 ../x.py --stage 2 test --target arm-unknown-linux-gnueabihf ENV SCRIPT python3 ../x.py --stage 2 test --host='' --target arm-unknown-linux-gnueabihf
ENV NO_CHANGE_USER=1 ENV NO_CHANGE_USER=1

View file

@ -34,7 +34,7 @@ ENV EMCC_CFLAGS=-O1
# Emscripten installation is user-specific # Emscripten installation is user-specific
ENV NO_CHANGE_USER=1 ENV NO_CHANGE_USER=1
ENV SCRIPT python3 ../x.py --stage 2 test --target $TARGETS ENV SCRIPT python3 ../x.py --stage 2 test --host='' --target $TARGETS
# This is almost identical to the wasm32-unknown-emscripten target, so # This is almost identical to the wasm32-unknown-emscripten target, so
# running with assertions again is not useful # running with assertions again is not useful

View file

@ -19,4 +19,4 @@ ENV \
CXX_x86_64_unknown_redox=x86_64-unknown-redox-g++ CXX_x86_64_unknown_redox=x86_64-unknown-redox-g++
ENV RUST_CONFIGURE_ARGS --enable-extended ENV RUST_CONFIGURE_ARGS --enable-extended
ENV SCRIPT python3 ../x.py dist --target x86_64-unknown-redox ENV SCRIPT python3 ../x.py dist --host='' --target x86_64-unknown-redox

View file

@ -32,7 +32,7 @@ ENV RUST_CONFIGURE_ARGS \
--x86_64-linux-android-ndk=/android/ndk/x86_64-21 \ --x86_64-linux-android-ndk=/android/ndk/x86_64-21 \
--disable-docs --disable-docs
ENV SCRIPT python3 ../x.py dist --target $TARGETS ENV SCRIPT python3 ../x.py dist --host='' --target $TARGETS
COPY scripts/sccache.sh /scripts/ COPY scripts/sccache.sh /scripts/
RUN sh /scripts/sccache.sh RUN sh /scripts/sccache.sh

View file

@ -47,5 +47,5 @@ ENV CFLAGS_i586_unknown_linux_musl=-Wa,-mrelax-relocations=no
ENV TARGETS=i586-unknown-linux-gnu,i686-unknown-linux-musl ENV TARGETS=i586-unknown-linux-gnu,i686-unknown-linux-musl
ENV SCRIPT \ ENV SCRIPT \
python3 ../x.py --stage 2 test --target $TARGETS && \ python3 ../x.py --stage 2 test --host='' --target $TARGETS && \
python3 ../x.py dist --target $TARGETS,i586-unknown-linux-musl python3 ../x.py dist --host='' --target $TARGETS,i586-unknown-linux-musl

View file

@ -187,8 +187,8 @@ ENV RUST_CONFIGURE_ARGS \
--disable-docs --disable-docs
ENV SCRIPT \ ENV SCRIPT \
python3 ../x.py --stage 2 test --target $RUN_MAKE_TARGETS src/test/run-make && \ python3 ../x.py --stage 2 test --host='' --target $RUN_MAKE_TARGETS src/test/run-make && \
python3 ../x.py dist --target $TARGETS python3 ../x.py dist --host='' --target $TARGETS
# sccache # sccache
COPY scripts/sccache.sh /scripts/ COPY scripts/sccache.sh /scripts/

View file

@ -110,4 +110,4 @@ ENV RUST_CONFIGURE_ARGS --enable-extended --enable-lld --disable-docs \
--set target.wasm32-wasi.wasi-root=/wasm32-wasi \ --set target.wasm32-wasi.wasi-root=/wasm32-wasi \
--musl-root-armv7=/musl-armv7 --musl-root-armv7=/musl-armv7
ENV SCRIPT python3 ../x.py dist --target $TARGETS ENV SCRIPT python3 ../x.py dist --host='' --target $TARGETS

View file

@ -41,7 +41,7 @@ ENV RUST_CONFIGURE_ARGS \
ENV NO_DEBUG_ASSERTIONS=1 ENV NO_DEBUG_ASSERTIONS=1
ENV WASM_TARGETS=wasm32-unknown-unknown ENV WASM_TARGETS=wasm32-unknown-unknown
ENV WASM_SCRIPT python3 /checkout/x.py --stage 2 test --target $WASM_TARGETS \ ENV WASM_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $WASM_TARGETS \
src/test/run-make \ src/test/run-make \
src/test/ui \ src/test/ui \
src/test/compile-fail \ src/test/compile-fail \
@ -50,13 +50,13 @@ ENV WASM_SCRIPT python3 /checkout/x.py --stage 2 test --target $WASM_TARGETS \
library/core library/core
ENV NVPTX_TARGETS=nvptx64-nvidia-cuda ENV NVPTX_TARGETS=nvptx64-nvidia-cuda
ENV NVPTX_SCRIPT python3 /checkout/x.py --stage 2 test --target $NVPTX_TARGETS \ ENV NVPTX_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $NVPTX_TARGETS \
src/test/run-make \ src/test/run-make \
src/test/assembly src/test/assembly
ENV MUSL_TARGETS=x86_64-unknown-linux-musl \ ENV MUSL_TARGETS=x86_64-unknown-linux-musl \
CC_x86_64_unknown_linux_musl=x86_64-linux-musl-gcc \ CC_x86_64_unknown_linux_musl=x86_64-linux-musl-gcc \
CXX_x86_64_unknown_linux_musl=x86_64-linux-musl-g++ CXX_x86_64_unknown_linux_musl=x86_64-linux-musl-g++
ENV MUSL_SCRIPT python3 /checkout/x.py --stage 2 test --target $MUSL_TARGETS ENV MUSL_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $MUSL_TARGETS
ENV SCRIPT $WASM_SCRIPT && $NVPTX_SCRIPT && $MUSL_SCRIPT ENV SCRIPT $WASM_SCRIPT && $NVPTX_SCRIPT && $MUSL_SCRIPT

View file

@ -53,7 +53,7 @@ ENV NO_CHANGE_USER=1
# FIXME: Re-enable these tests once https://github.com/rust-lang/cargo/pull/7476 # FIXME: Re-enable these tests once https://github.com/rust-lang/cargo/pull/7476
# is picked up by CI # is picked up by CI
ENV SCRIPT python3 ../x.py test --stage 2 --target $TARGETS \ ENV SCRIPT python3 ../x.py test --stage 2 --host='' --target $TARGETS \
--exclude library/core \ --exclude library/core \
--exclude library/alloc \ --exclude library/alloc \
--exclude library/proc_macro \ --exclude library/proc_macro \

View file

@ -45,7 +45,7 @@ ENV SCRIPT python2.7 ../x.py --stage 2 test --exclude src/tools/tidy && \
# on the `x86_64` host when they're built as `armv5te` binaries. # on the `x86_64` host when they're built as `armv5te` binaries.
# (we're only interested in the MIR output, so this doesn't matter) # (we're only interested in the MIR output, so this doesn't matter)
python2.7 ../x.py --stage 2 test src/test/mir-opt --pass=build \ python2.7 ../x.py --stage 2 test src/test/mir-opt --pass=build \
--target=armv5te-unknown-linux-gnueabi && \ --host='' --target=armv5te-unknown-linux-gnueabi && \
# Run the UI test suite again, but in `--pass=check` mode # Run the UI test suite again, but in `--pass=check` mode
# #
# This is intended to make sure that both `--pass=check` continues to # This is intended to make sure that both `--pass=check` continues to