Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a11c26f

Browse files
committedMay 27, 2017
Auto merge of #42109 - Keruspe:master, r=alexcrichton
rustbuild: don't create a source tarball when installing This splits Install out of Dist as it is not a full dist anymore, and creates the source tarball only for the Dist command. This will allow splitting install in a few rules if we want as it's done for other phases.
2 parents 3e7908f + d0ea705 commit a11c26f

File tree

7 files changed

+210
-144
lines changed

7 files changed

+210
-144
lines changed
 

‎README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ Read ["Installing Rust"] from [The Book].
3535
3. Build and install:
3636

3737
```sh
38-
$ ./x.py build && sudo ./x.py dist --install
38+
$ ./x.py build && sudo ./x.py install
3939
```
4040

4141
> ***Note:*** Install locations can be adjusted by copying the config file
4242
> from `./src/bootstrap/config.toml.example` to `./config.toml`, and
4343
> adjusting the `prefix` option under `[install]`. Various other options are
4444
> also supported, and are documented in the config file.
4545

46-
When complete, `sudo ./x.py dist --install` will place several programs into
46+
When complete, `sudo ./x.py install` will place several programs into
4747
`/usr/local/bin`: `rustc`, the Rust compiler, and `rustdoc`, the
4848
API-documentation tool. This install does not include [Cargo],
4949
Rust's package manager, which you may also want to build.
@@ -96,7 +96,7 @@ build.
9696
4. Navigate to Rust's source code (or clone it), then build it:
9797

9898
```sh
99-
$ ./x.py build && ./x.py dist --install
99+
$ ./x.py build && ./x.py install
100100
```
101101

102102
#### MSVC

‎src/bootstrap/config.toml.example

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,9 @@
314314
# Note that this address should not contain a trailing slash as file names will
315315
# be appended to it.
316316
#upload-addr = "https://example.com/folder"
317+
318+
# Whether to build a plain source tarball to upload
319+
# We disable that on Windows not to override the one already uploaded on S3
320+
# as the one built on Windows will contain backslashes in paths causing problems
321+
# on linux
322+
#src-tarball = true

‎src/bootstrap/dist.rs

Lines changed: 91 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ use {Build, Compiler, Mode};
3030
use channel;
3131
use util::{cp_r, libdir, is_dylib, cp_filtered, copy, exe};
3232

33-
fn pkgname(build: &Build, component: &str) -> String {
33+
pub fn pkgname(build: &Build, component: &str) -> String {
3434
if component == "cargo" {
3535
format!("{}-{}", component, build.cargo_package_vers())
3636
} else if component == "rls" {
37-
format!("{}-{}", component, build.package_vers(&build.release_num("rls")))
37+
format!("{}-{}", component, build.rls_package_vers())
3838
} else {
3939
assert!(component.starts_with("rust"));
4040
format!("{}-{}", component, build.rust_package_vers())
@@ -489,38 +489,7 @@ pub fn analysis(build: &Build, compiler: &Compiler, target: &str) {
489489
t!(fs::remove_dir_all(&image));
490490
}
491491

492-
const CARGO_VENDOR_VERSION: &'static str = "0.1.4";
493-
494-
/// Creates the `rust-src` installer component and the plain source tarball
495-
pub fn rust_src(build: &Build) {
496-
if !build.config.rust_dist_src {
497-
return
498-
}
499-
500-
println!("Dist src");
501-
502-
// Make sure that the root folder of tarball has the correct name
503-
let plain_name = format!("rustc-{}-src", build.rust_package_vers());
504-
let plain_dst_src = tmpdir(build).join(&plain_name);
505-
let _ = fs::remove_dir_all(&plain_dst_src);
506-
t!(fs::create_dir_all(&plain_dst_src));
507-
508-
// This is the set of root paths which will become part of the source package
509-
let src_files = [
510-
"COPYRIGHT",
511-
"LICENSE-APACHE",
512-
"LICENSE-MIT",
513-
"CONTRIBUTING.md",
514-
"README.md",
515-
"RELEASES.md",
516-
"configure",
517-
"x.py",
518-
];
519-
let src_dirs = [
520-
"man",
521-
"src",
522-
];
523-
492+
fn copy_src_dirs(build: &Build, src_dirs: &[&str], dst_dir: &Path) {
524493
let filter_fn = move |path: &Path| {
525494
let spath = match path.to_str() {
526495
Some(path) => path,
@@ -549,60 +518,16 @@ pub fn rust_src(build: &Build) {
549518
};
550519

551520
// Copy the directories using our filter
552-
for item in &src_dirs {
553-
let dst = &plain_dst_src.join(item);
554-
t!(fs::create_dir(dst));
521+
for item in src_dirs {
522+
let dst = &dst_dir.join(item);
523+
t!(fs::create_dir_all(dst));
555524
cp_filtered(&build.src.join(item), dst, &filter_fn);
556525
}
557-
// Copy the files normally
558-
for item in &src_files {
559-
copy(&build.src.join(item), &plain_dst_src.join(item));
560-
}
561-
562-
// If we're building from git sources, we need to vendor a complete distribution.
563-
if build.src_is_git {
564-
// Get cargo-vendor installed, if it isn't already.
565-
let mut has_cargo_vendor = false;
566-
let mut cmd = Command::new(&build.cargo);
567-
for line in output(cmd.arg("install").arg("--list")).lines() {
568-
has_cargo_vendor |= line.starts_with("cargo-vendor ");
569-
}
570-
if !has_cargo_vendor {
571-
let mut cmd = Command::new(&build.cargo);
572-
cmd.arg("install")
573-
.arg("--force")
574-
.arg("--debug")
575-
.arg("--vers").arg(CARGO_VENDOR_VERSION)
576-
.arg("cargo-vendor")
577-
.env("RUSTC", &build.rustc);
578-
build.run(&mut cmd);
579-
}
580-
581-
// Vendor all Cargo dependencies
582-
let mut cmd = Command::new(&build.cargo);
583-
cmd.arg("vendor")
584-
.current_dir(&plain_dst_src.join("src"));
585-
build.run(&mut cmd);
586-
}
587-
588-
// Create the version file
589-
write_file(&plain_dst_src.join("version"), build.rust_version().as_bytes());
590-
591-
// Create plain source tarball
592-
let mut tarball = rust_src_location(build);
593-
tarball.set_extension(""); // strip .gz
594-
tarball.set_extension(""); // strip .tar
595-
if let Some(dir) = tarball.parent() {
596-
t!(fs::create_dir_all(dir));
597-
}
598-
let mut cmd = rust_installer(build);
599-
cmd.arg("tarball")
600-
.arg("--input").arg(&plain_name)
601-
.arg("--output").arg(&tarball)
602-
.arg("--work-dir=.")
603-
.current_dir(tmpdir(build));
604-
build.run(&mut cmd);
526+
}
605527

528+
/// Creates the `rust-src` installer component
529+
pub fn rust_src(build: &Build) {
530+
println!("Dist src");
606531

607532
let name = pkgname(build, "rust-src");
608533
let image = tmpdir(build).join(format!("{}-image", name));
@@ -636,11 +561,7 @@ pub fn rust_src(build: &Build) {
636561
"src/rustc/libc_shim",
637562
];
638563

639-
for item in &std_src_dirs {
640-
let dst = &dst_src.join(item);
641-
t!(fs::create_dir_all(dst));
642-
cp_r(&plain_dst_src.join(item), dst);
643-
}
564+
copy_src_dirs(build, &std_src_dirs[..], &dst_src);
644565

645566
// Create source tarball in rust-installer format
646567
let mut cmd = rust_installer(build);
@@ -657,7 +578,86 @@ pub fn rust_src(build: &Build) {
657578
build.run(&mut cmd);
658579

659580
t!(fs::remove_dir_all(&image));
660-
t!(fs::remove_dir_all(&plain_dst_src));
581+
}
582+
583+
const CARGO_VENDOR_VERSION: &'static str = "0.1.4";
584+
585+
/// Creates the plain source tarball
586+
pub fn plain_source_tarball(build: &Build) {
587+
println!("Create plain source tarball");
588+
589+
// Make sure that the root folder of tarball has the correct name
590+
let plain_name = format!("{}-src", pkgname(build, "rustc"));
591+
let plain_dst_src = tmpdir(build).join(&plain_name);
592+
let _ = fs::remove_dir_all(&plain_dst_src);
593+
t!(fs::create_dir_all(&plain_dst_src));
594+
595+
// This is the set of root paths which will become part of the source package
596+
let src_files = [
597+
"COPYRIGHT",
598+
"LICENSE-APACHE",
599+
"LICENSE-MIT",
600+
"CONTRIBUTING.md",
601+
"README.md",
602+
"RELEASES.md",
603+
"configure",
604+
"x.py",
605+
];
606+
let src_dirs = [
607+
"man",
608+
"src",
609+
];
610+
611+
copy_src_dirs(build, &src_dirs[..], &plain_dst_src);
612+
613+
// Copy the files normally
614+
for item in &src_files {
615+
copy(&build.src.join(item), &plain_dst_src.join(item));
616+
}
617+
618+
// Create the version file
619+
write_file(&plain_dst_src.join("version"), build.rust_version().as_bytes());
620+
621+
// If we're building from git sources, we need to vendor a complete distribution.
622+
if build.src_is_git {
623+
// Get cargo-vendor installed, if it isn't already.
624+
let mut has_cargo_vendor = false;
625+
let mut cmd = Command::new(&build.cargo);
626+
for line in output(cmd.arg("install").arg("--list")).lines() {
627+
has_cargo_vendor |= line.starts_with("cargo-vendor ");
628+
}
629+
if !has_cargo_vendor {
630+
let mut cmd = Command::new(&build.cargo);
631+
cmd.arg("install")
632+
.arg("--force")
633+
.arg("--debug")
634+
.arg("--vers").arg(CARGO_VENDOR_VERSION)
635+
.arg("cargo-vendor")
636+
.env("RUSTC", &build.rustc);
637+
build.run(&mut cmd);
638+
}
639+
640+
// Vendor all Cargo dependencies
641+
let mut cmd = Command::new(&build.cargo);
642+
cmd.arg("vendor")
643+
.current_dir(&plain_dst_src.join("src"));
644+
build.run(&mut cmd);
645+
}
646+
647+
// Create plain source tarball
648+
let mut tarball = rust_src_location(build);
649+
tarball.set_extension(""); // strip .gz
650+
tarball.set_extension(""); // strip .tar
651+
if let Some(dir) = tarball.parent() {
652+
t!(fs::create_dir_all(dir));
653+
}
654+
let mut cmd = rust_installer(build);
655+
cmd.arg("tarball")
656+
.arg("--input").arg(&plain_name)
657+
.arg("--output").arg(&tarball)
658+
.arg("--work-dir=.")
659+
.current_dir(tmpdir(build));
660+
build.run(&mut cmd);
661661
}
662662

663663
fn install(src: &Path, dstdir: &Path, perms: u32) {

‎src/bootstrap/flags.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ pub enum Subcommand {
6969
Clean,
7070
Dist {
7171
paths: Vec<PathBuf>,
72-
install: bool,
72+
},
73+
Install {
74+
paths: Vec<PathBuf>,
7375
},
7476
}
7577

@@ -85,7 +87,8 @@ Subcommands:
8587
bench Build and run some benchmarks
8688
doc Build documentation
8789
clean Clean out build directories
88-
dist Build and/or install distribution artifacts
90+
dist Build distribution artifacts
91+
install Install distribution artifacts
8992
9093
To learn more about a subcommand, run `./x.py <subcommand> -h`");
9194

@@ -125,7 +128,8 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`");
125128
|| (s == "bench")
126129
|| (s == "doc")
127130
|| (s == "clean")
128-
|| (s == "dist"));
131+
|| (s == "dist")
132+
|| (s == "install"));
129133
let subcommand = match possible_subcommands.first() {
130134
Some(s) => s,
131135
None => {
@@ -139,7 +143,6 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`");
139143
match subcommand.as_str() {
140144
"test" => { opts.optmulti("", "test-args", "extra arguments", "ARGS"); },
141145
"bench" => { opts.optmulti("", "test-args", "extra arguments", "ARGS"); },
142-
"dist" => { opts.optflag("", "install", "run installer as well"); },
143146
_ => { },
144147
};
145148

@@ -281,7 +284,11 @@ Arguments:
281284
"dist" => {
282285
Subcommand::Dist {
283286
paths: paths,
284-
install: matches.opt_present("install"),
287+
}
288+
}
289+
"install" => {
290+
Subcommand::Install {
291+
paths: paths,
285292
}
286293
}
287294
_ => {

‎src/bootstrap/install.rs

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use std::path::{Path, PathBuf, Component};
1919
use std::process::Command;
2020

2121
use Build;
22-
use dist::{sanitize_sh, tmpdir};
22+
use dist::{pkgname, sanitize_sh, tmpdir};
2323

2424
pub struct Installer<'a> {
2525
build: &'a Build,
@@ -29,6 +29,13 @@ pub struct Installer<'a> {
2929
bindir: PathBuf,
3030
libdir: PathBuf,
3131
mandir: PathBuf,
32+
empty_dir: PathBuf,
33+
}
34+
35+
impl<'a> Drop for Installer<'a> {
36+
fn drop(&mut self) {
37+
t!(fs::remove_dir_all(&self.empty_dir));
38+
}
3239
}
3340

3441
impl<'a> Installer<'a> {
@@ -61,6 +68,10 @@ impl<'a> Installer<'a> {
6168
let libdir = add_destdir(&libdir, &destdir);
6269
let mandir = add_destdir(&mandir, &destdir);
6370

71+
let empty_dir = build.out.join("tmp/empty_dir");
72+
73+
t!(fs::create_dir_all(&empty_dir));
74+
6475
Installer {
6576
build,
6677
prefix,
@@ -69,52 +80,49 @@ impl<'a> Installer<'a> {
6980
bindir,
7081
libdir,
7182
mandir,
83+
empty_dir,
7284
}
7385
}
7486

75-
/// Installs everything.
76-
pub fn install(&self, stage: u32, host: &str) {
77-
let empty_dir = self.build.out.join("tmp/empty_dir");
78-
t!(fs::create_dir_all(&empty_dir));
79-
80-
if self.build.config.docs {
81-
self.install_sh("docs", "rust-docs", &self.build.rust_package_vers(),
82-
stage, Some(host), &empty_dir);
83-
}
87+
pub fn install_docs(&self, stage: u32, host: &str) {
88+
self.install_sh("docs", "rust-docs", stage, Some(host));
89+
}
8490

91+
pub fn install_std(&self, stage: u32) {
8592
for target in self.build.config.target.iter() {
86-
self.install_sh("std", "rust-std", &self.build.rust_package_vers(),
87-
stage, Some(target), &empty_dir);
93+
self.install_sh("std", "rust-std", stage, Some(target));
8894
}
95+
}
8996

90-
if self.build.config.extended {
91-
self.install_sh("cargo", "cargo", &self.build.cargo_package_vers(),
92-
stage, Some(host), &empty_dir);
93-
self.install_sh("rls", "rls", &self.build.rls_package_vers(),
94-
stage, Some(host), &empty_dir);
95-
self.install_sh("analysis", "rust-analysis", &self.build.rust_package_vers(),
96-
stage, Some(host), &empty_dir);
97-
self.install_sh("src", "rust-src", &self.build.rust_package_vers(),
98-
stage, None, &empty_dir);
99-
}
97+
pub fn install_cargo(&self, stage: u32, host: &str) {
98+
self.install_sh("cargo", "cargo", stage, Some(host));
99+
}
100100

101-
self.install_sh("rustc", "rustc", &self.build.rust_package_vers(),
102-
stage, Some(host), &empty_dir);
101+
pub fn install_rls(&self, stage: u32, host: &str) {
102+
self.install_sh("rls", "rls", stage, Some(host));
103+
}
104+
105+
pub fn install_analysis(&self, stage: u32, host: &str) {
106+
self.install_sh("analysis", "rust-analysis", stage, Some(host));
107+
}
103108

104-
t!(fs::remove_dir_all(&empty_dir));
109+
pub fn install_src(&self, stage: u32) {
110+
self.install_sh("src", "rust-src", stage, None);
111+
}
112+
pub fn install_rustc(&self, stage: u32, host: &str) {
113+
self.install_sh("rustc", "rustc", stage, Some(host));
105114
}
106115

107-
fn install_sh(&self, package: &str, name: &str, version: &str,
108-
stage: u32, host: Option<&str>, empty_dir: &Path) {
116+
fn install_sh(&self, package: &str, name: &str, stage: u32, host: Option<&str>) {
109117
println!("Install {} stage{} ({:?})", package, stage, host);
110118
let package_name = if let Some(host) = host {
111-
format!("{}-{}-{}", name, version, host)
119+
format!("{}-{}", pkgname(self.build, name), host)
112120
} else {
113-
format!("{}-{}", name, version)
121+
pkgname(self.build, name)
114122
};
115123

116124
let mut cmd = Command::new("sh");
117-
cmd.current_dir(empty_dir)
125+
cmd.current_dir(&self.empty_dir)
118126
.arg(sanitize_sh(&tmpdir(self.build).join(&package_name).join("install.sh")))
119127
.arg(format!("--prefix={}", sanitize_sh(&self.prefix)))
120128
.arg(format!("--sysconfdir={}", sanitize_sh(&self.sysconfdir)))

‎src/bootstrap/mk/Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ distcheck:
6969
$(Q)$(BOOTSTRAP) dist $(BOOTSTRAP_ARGS)
7070
$(Q)$(BOOTSTRAP) test distcheck $(BOOTSTRAP_ARGS)
7171
install:
72-
$(Q)$(BOOTSTRAP) dist --install $(BOOTSTRAP_ARGS)
72+
$(Q)$(BOOTSTRAP) install $(BOOTSTRAP_ARGS)
7373
tidy:
7474
$(Q)$(BOOTSTRAP) test src/tools/tidy $(BOOTSTRAP_ARGS)
7575
prepare:

‎src/bootstrap/step.rs

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,7 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
492492
.host(true)
493493
.run(move |s| check::docs(build, &s.compiler()));
494494
rules.test("check-distcheck", "distcheck")
495+
.dep(|s| s.name("dist-plain-source-tarball"))
495496
.dep(|s| s.name("dist-src"))
496497
.run(move |_| check::distcheck(build));
497498

@@ -734,6 +735,13 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
734735
dist::mingw(build, s.target)
735736
}
736737
});
738+
rules.dist("dist-plain-source-tarball", "src")
739+
.default(build.config.rust_dist_src)
740+
.host(true)
741+
.only_build(true)
742+
.only_host_build(true)
743+
.dep(move |s| tool_rust_installer(build, s))
744+
.run(move |_| dist::plain_source_tarball(build));
737745
rules.dist("dist-src", "src")
738746
.default(true)
739747
.host(true)
@@ -759,9 +767,6 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
759767
.dep(|s| s.name("tool-rls"))
760768
.dep(move |s| tool_rust_installer(build, s))
761769
.run(move |s| dist::rls(build, s.stage, s.target));
762-
rules.dist("install", "path/to/nowhere")
763-
.dep(|s| s.name("default:dist"))
764-
.run(move |s| install::Installer::new(build).install(s.stage, s.target));
765770
rules.dist("dist-cargo", "cargo")
766771
.host(true)
767772
.only_host_build(true)
@@ -789,6 +794,47 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
789794
.dep(move |s| s.name("tool-build-manifest").target(&build.config.build).stage(0))
790795
.run(move |_| dist::hash_and_sign(build));
791796

797+
rules.install("install-docs", "src/doc")
798+
.default(build.config.docs)
799+
.only_host_build(true)
800+
.dep(|s| s.name("dist-docs"))
801+
.run(move |s| install::Installer::new(build).install_docs(s.stage, s.target));
802+
rules.install("install-std", "src/libstd")
803+
.default(true)
804+
.only_host_build(true)
805+
.dep(|s| s.name("dist-std"))
806+
.run(move |s| install::Installer::new(build).install_std(s.stage));
807+
rules.install("install-cargo", "cargo")
808+
.default(build.config.extended)
809+
.host(true)
810+
.only_host_build(true)
811+
.dep(|s| s.name("dist-cargo"))
812+
.run(move |s| install::Installer::new(build).install_cargo(s.stage, s.target));
813+
rules.install("install-rls", "rls")
814+
.default(build.config.extended)
815+
.host(true)
816+
.only_host_build(true)
817+
.dep(|s| s.name("dist-rls"))
818+
.run(move |s| install::Installer::new(build).install_rls(s.stage, s.target));
819+
rules.install("install-analysis", "analysis")
820+
.default(build.config.extended)
821+
.only_host_build(true)
822+
.dep(|s| s.name("dist-analysis"))
823+
.run(move |s| install::Installer::new(build).install_analysis(s.stage, s.target));
824+
rules.install("install-src", "src")
825+
.default(build.config.extended)
826+
.host(true)
827+
.only_build(true)
828+
.only_host_build(true)
829+
.dep(|s| s.name("dist-src"))
830+
.run(move |s| install::Installer::new(build).install_src(s.stage));
831+
rules.install("install-rustc", "src/librustc")
832+
.default(true)
833+
.host(true)
834+
.only_host_build(true)
835+
.dep(|s| s.name("dist-rustc"))
836+
.run(move |s| install::Installer::new(build).install_rustc(s.stage, s.target));
837+
792838
rules.verify();
793839
return rules;
794840

@@ -902,6 +948,7 @@ enum Kind {
902948
Bench,
903949
Dist,
904950
Doc,
951+
Install,
905952
}
906953

907954
impl<'a> Rule<'a> {
@@ -1033,6 +1080,12 @@ impl<'a> Rules<'a> {
10331080
self.rule(name, path, Kind::Dist)
10341081
}
10351082

1083+
/// Same as `build`, but for `Kind::Install`.
1084+
fn install<'b>(&'b mut self, name: &'a str, path: &'a str)
1085+
-> RuleBuilder<'a, 'b> {
1086+
self.rule(name, path, Kind::Install)
1087+
}
1088+
10361089
fn rule<'b>(&'b mut self,
10371090
name: &'a str,
10381091
path: &'a str,
@@ -1073,6 +1126,7 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd?
10731126
"test" => Kind::Test,
10741127
"bench" => Kind::Bench,
10751128
"dist" => Kind::Dist,
1129+
"install" => Kind::Install,
10761130
_ => return None,
10771131
};
10781132
let rules = self.rules.values().filter(|r| r.kind == kind);
@@ -1122,13 +1176,8 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd?
11221176
Subcommand::Doc { ref paths } => (Kind::Doc, &paths[..]),
11231177
Subcommand::Test { ref paths, test_args: _ } => (Kind::Test, &paths[..]),
11241178
Subcommand::Bench { ref paths, test_args: _ } => (Kind::Bench, &paths[..]),
1125-
Subcommand::Dist { ref paths, install } => {
1126-
if install {
1127-
return vec![self.sbuild.name("install")]
1128-
} else {
1129-
(Kind::Dist, &paths[..])
1130-
}
1131-
}
1179+
Subcommand::Dist { ref paths } => (Kind::Dist, &paths[..]),
1180+
Subcommand::Install { ref paths } => (Kind::Install, &paths[..]),
11321181
Subcommand::Clean => panic!(),
11331182
};
11341183

@@ -1347,10 +1396,6 @@ mod tests {
13471396
use config::Config;
13481397
use flags::Flags;
13491398

1350-
macro_rules! a {
1351-
($($a:expr),*) => (vec![$($a.to_string()),*])
1352-
}
1353-
13541399
fn build(args: &[&str],
13551400
extra_host: &[&str],
13561401
extra_target: &[&str]) -> Build {

0 commit comments

Comments
 (0)
Please sign in to comment.