Skip to content

Commit e7b6195

Browse files
Migrate build.sh script to rust
1 parent 6be1f36 commit e7b6195

File tree

12 files changed

+541
-133
lines changed

12 files changed

+541
-133
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ jobs:
119119
- name: Build
120120
run: |
121121
./y.sh prepare --only-libcore
122-
${{ matrix.libgccjit_version.env_extra }} ./build.sh ${{ matrix.libgccjit_version.extra }}
122+
${{ matrix.libgccjit_version.env_extra }} ./y.sh build ${{ matrix.libgccjit_version.extra }}
123123
${{ matrix.libgccjit_version.env_extra }} cargo test ${{ matrix.libgccjit_version.extra }}
124124
./clean_all.sh
125125

.github/workflows/release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ jobs:
8686
- name: Build
8787
run: |
8888
./y.sh prepare --only-libcore
89-
EMBED_LTO_BITCODE=1 ./build.sh --release --release-sysroot
89+
EMBED_LTO_BITCODE=1 ./y.sh build --release --release-sysroot
9090
cargo test
9191
./clean_all.sh
9292

.github/workflows/stdarch.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ jobs:
100100
- name: Build
101101
run: |
102102
./y.sh prepare --only-libcore
103-
./build.sh --release --release-sysroot
103+
./y.sh build --release --release-sysroot
104104
cargo test
105105
106106
- name: Clean

Readme.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ Then you can run commands like this:
6666

6767
```bash
6868
$ ./y.sh prepare # download and patch sysroot src and install hyperfine for benchmarking
69-
$ LIBRARY_PATH=$(cat gcc_path) LD_LIBRARY_PATH=$(cat gcc_path) ./build.sh --release
69+
$ LIBRARY_PATH=$(cat gcc_path) LD_LIBRARY_PATH=$(cat gcc_path) ./y.sh build --release
7070
```
7171

7272
To run the tests:

build.sh

-67
This file was deleted.

build_sysroot/build_sysroot.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
set -e
66
cd $(dirname "$0")
77

8-
pushd ../ >/dev/null
8+
pushd ../
99
source ./config.sh
10-
popd >/dev/null
10+
popd
1111

1212
# Cleanup for previous run
1313
# v Clean target dir except for build scripts and incremental cache

build_system/src/build.rs

+215
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,218 @@
1+
use crate::config::set_config;
2+
use crate::utils::{get_gcc_path, run_command_with_env, run_command_with_output, walk_dir};
3+
use std::collections::HashMap;
4+
use std::ffi::OsStr;
5+
use std::fs;
6+
use std::path::Path;
7+
8+
#[derive(Default)]
9+
struct BuildArg {
10+
codegen_release_channel: bool,
11+
sysroot_release_channel: bool,
12+
no_default_features: bool,
13+
features: Vec<String>,
14+
gcc_path: String,
15+
}
16+
17+
impl BuildArg {
18+
fn new() -> Result<Option<Self>, String> {
19+
let gcc_path = get_gcc_path()?;
20+
let mut build_arg = Self {
21+
gcc_path,
22+
..Default::default()
23+
};
24+
let mut args = std::env::args().skip(2);
25+
26+
while let Some(arg) = args.next() {
27+
match arg.as_str() {
28+
"--release" => build_arg.codegen_release_channel = true,
29+
"--release-sysroot" => build_arg.sysroot_release_channel = true,
30+
"--no-default-features" => build_arg.no_default_features = true,
31+
"--features" => {
32+
if let Some(arg) = args.next() {
33+
build_arg.features.push(arg.as_str().into());
34+
} else {
35+
return Err(format!(
36+
"Expected a value after `--features`, found nothing"
37+
));
38+
}
39+
}
40+
"--help" => {
41+
Self::usage();
42+
return Ok(None);
43+
}
44+
a => return Err(format!("Unknown argument `{a}`")),
45+
}
46+
}
47+
Ok(Some(build_arg))
48+
}
49+
50+
fn usage() {
51+
println!(
52+
r#"
53+
`build` command help:
54+
55+
--release : Build codegen in release mode
56+
--release-sysroot : Build sysroot in release mode
57+
--no-default-features : Add `--no-default-features` flag
58+
--features [arg] : Add a new feature [arg]
59+
--help : Show this help
60+
"#
61+
)
62+
}
63+
}
64+
65+
fn build_sysroot(
66+
env: &mut HashMap<String, String>,
67+
release_mode: bool,
68+
target_triple: &str,
69+
) -> Result<(), String> {
70+
std::env::set_current_dir("build_sysroot")
71+
.map_err(|e| format!("Failed to go to `build_sysroot` directory: {e:?}"))?;
72+
// Cleanup for previous run
73+
// v Clean target dir except for build scripts and incremental cache
74+
walk_dir(
75+
"target",
76+
|dir: &Path| {
77+
for top in &["debug", "release"] {
78+
let _e = fs::remove_dir_all(dir.join(top).join("build"));
79+
let _e = fs::remove_dir_all(dir.join(top).join("deps"));
80+
let _e = fs::remove_dir_all(dir.join(top).join("examples"));
81+
let _e = fs::remove_dir_all(dir.join(top).join("native"));
82+
83+
let _e = walk_dir(
84+
dir.join(top),
85+
|sub_dir: &Path| {
86+
if sub_dir
87+
.file_name()
88+
.map(|s| s.to_str().unwrap().starts_with("libsysroot"))
89+
.unwrap_or(false)
90+
{
91+
let _e = fs::remove_dir_all(sub_dir);
92+
}
93+
Ok(())
94+
},
95+
|file: &Path| {
96+
if file
97+
.file_name()
98+
.map(|s| s.to_str().unwrap().starts_with("libsysroot"))
99+
.unwrap_or(false)
100+
{
101+
let _e = fs::remove_file(file);
102+
}
103+
Ok(())
104+
},
105+
);
106+
}
107+
Ok(())
108+
},
109+
|_| Ok(()),
110+
)?;
111+
112+
let _e = fs::remove_file("Cargo.lock");
113+
let _e = fs::remove_file("test_target/Cargo.lock");
114+
let _e = fs::remove_dir_all("sysroot");
115+
116+
// Builds libs
117+
let channel = if release_mode {
118+
let rustflags = env
119+
.get(&"RUSTFLAGS".to_owned())
120+
.cloned()
121+
.unwrap_or_default();
122+
env.insert(
123+
"RUSTFLAGS".to_owned(),
124+
format!("{rustflags} -Zmir-opt-level=3"),
125+
);
126+
run_command_with_output(
127+
&[
128+
&"cargo",
129+
&"build",
130+
&"--target",
131+
&target_triple,
132+
&"--release",
133+
],
134+
None,
135+
Some(&env),
136+
)?;
137+
"release"
138+
} else {
139+
run_command_with_output(
140+
&[
141+
&"cargo",
142+
&"build",
143+
&"--target",
144+
&target_triple,
145+
&"--features",
146+
&"compiler_builtins/c",
147+
],
148+
None,
149+
Some(env),
150+
)?;
151+
"debug"
152+
};
153+
154+
// Copy files to sysroot
155+
let sysroot_path = format!("sysroot/lib/rustlib/{target_triple}/lib/");
156+
fs::create_dir_all(&sysroot_path)
157+
.map_err(|e| format!("Failed to create directory `{sysroot_path}`: {e:?}"))?;
158+
let copier = |d: &Path| run_command_with_output(&[&"cp", &"-r", &d, &sysroot_path], None, None);
159+
walk_dir(
160+
&format!("target/{target_triple}/{channel}/deps"),
161+
copier,
162+
copier,
163+
)?;
164+
165+
Ok(())
166+
}
167+
168+
fn build_codegen(args: &BuildArg) -> Result<(), String> {
169+
let mut env = HashMap::new();
170+
171+
let current_dir =
172+
std::env::current_dir().map_err(|e| format!("`current_dir` failed: {e:?}"))?;
173+
env.insert(
174+
"RUST_COMPILER_RT_ROOT".to_owned(),
175+
format!("{}", current_dir.join("llvm/compiler-rt").display()),
176+
);
177+
env.insert("LD_LIBRARY_PATH".to_owned(), args.gcc_path.clone());
178+
env.insert("LIBRARY_PATH".to_owned(), args.gcc_path.clone());
179+
180+
let mut command: Vec<&dyn AsRef<OsStr>> = vec![&"cargo", &"rustc"];
181+
if args.codegen_release_channel {
182+
command.push(&"--release");
183+
env.insert("CHANNEL".to_owned(), "release".to_owned());
184+
env.insert("CARGO_INCREMENTAL".to_owned(), "1".to_owned());
185+
} else {
186+
env.insert("CHANNEL".to_owned(), "debug".to_owned());
187+
}
188+
let ref_features = args.features.iter().map(|s| s.as_str()).collect::<Vec<_>>();
189+
for feature in &ref_features {
190+
command.push(feature);
191+
}
192+
run_command_with_env(&command, None, Some(&env))?;
193+
194+
let config = set_config(&mut env, &[], Some(&args.gcc_path))?;
195+
196+
// We voluntarily ignore the error.
197+
let _e = fs::remove_dir_all("target/out");
198+
let gccjit_target = "target/out/gccjit";
199+
fs::create_dir_all(gccjit_target)
200+
.map_err(|e| format!("Failed to create directory `{gccjit_target}`: {e:?}"))?;
201+
202+
println!("[BUILD] sysroot");
203+
build_sysroot(
204+
&mut env,
205+
args.sysroot_release_channel,
206+
&config.target_triple,
207+
)?;
208+
Ok(())
209+
}
210+
1211
pub fn run() -> Result<(), String> {
212+
let args = match BuildArg::new()? {
213+
Some(a) => a,
214+
None => return Ok(()),
215+
};
216+
build_codegen(&args)?;
2217
Ok(())
3218
}

0 commit comments

Comments
 (0)