Skip to content

Commit a866006

Browse files
author
Jorge Aparicio
committed
support asmjs-unknown-emscripten and wasm32-unknown-emscripten
1 parent 9c16d63 commit a866006

File tree

10 files changed

+234
-13
lines changed

10 files changed

+234
-13
lines changed

.travis.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ matrix:
4545
- env: TARGET=thumbv7em-none-eabi RUN=1
4646
- env: TARGET=thumbv7em-none-eabihf RUN=1
4747
- env: TARGET=thumbv7m-none-eabi RUN=1
48+
49+
# Other targets
50+
- env: TARGET=asmjs-unknown-emscripten STD=1
51+
- env: TARGET=wasm32-unknown-emscripten STD=1
52+
4853
env: TARGET=x86_64-unknown-linux-gnu CPP=1 DYLIB=1 OPENSSL=0.5.5 RUN=1 DEPLOY=1
4954

5055
install:

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
55

66
## [Unreleased]
77

8+
### Added
9+
10+
- Support for emscripten targets.
11+
812
## [v0.1.9] - 2017-02-08
913

1014
### Added

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ worst, "hang" (never terminate).
161161
| `arm-unknown-linux-musleabi` | 1.1.15 | 5.3.1 | N/A | | 2.8.0 ||
162162
| `armv7-unknown-linux-gnueabihf` | 2.15 | 4.6.2 | 1.0.2j || 2.8.0 ||
163163
| `armv7-unknown-linux-musleabihf` | 1.1.15 | 5.3.1 | N/A | | 2.8.0 ||
164+
| `asmjs-unknown-emscripten` | N/A | N/A | N/A | | N/A | |
164165
| `i686-unknown-freebsd` [1] | 10.2 | 5.3.0 | 1.0.2j | | N/A | |
165166
| `i686-unknown-linux-gnu` | 2.15 | 4.6.2 | 1.0.2j || N/A ||
166167
| `i686-unknown-linux-musl` | 1.1.15 | 5.3.1 | N/A | | N/A ||
@@ -177,6 +178,7 @@ worst, "hang" (never terminate).
177178
| `thumbv7em-none-eabi` [3] | 2.2.0 | 5.3.1 | N/A | | N/A | |
178179
| `thumbv7em-none-eabihf` [3] | 2.2.0 | 5.3.1 | N/A | | N/A | |
179180
| `thumbv7m-none-eabi` [3] | 2.2.0 | 5.3.1 | N/A | | N/A | |
181+
| `wasm32-unknown-emscripten` | N/A | N/A | N/A | | N/A | |
180182
| `x86_64-pc-windows-gnu`[1] | N/A | 5.3.1 | || N/A | |
181183
| `x86_64-unknown-dragonfly` [1] [2] | 4.6.0 | 5.3.0 | 1.0.2j | | N/A ||
182184
| `x86_64-unknown-freebsd` [1] | 10.2 | 5.3.0 | 1.0.2j | | N/A | |

ci/script.sh

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ main() {
1515

1616
export QEMU_STRACE=1
1717

18-
# `cross run` test for thumb targets
18+
# `cross run` test for thumb and emscripten targets
1919
case $TARGET in
2020
thumb*-none-eabi*)
2121
td=$(mktemp -d)
@@ -30,7 +30,20 @@ main() {
3030
popd
3131

3232
rm -rf $td
33-
;;
33+
;;
34+
*-emscripten)
35+
td=$(mktemp -d)
36+
37+
cargo init --bin --name hello $td
38+
39+
pushd $td
40+
cross build --target $TARGET
41+
popd
42+
43+
rm -rf $td
44+
45+
return
46+
;;
3447
esac
3548

3649
# `cross build` test for targets where `std` is not available
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FROM ubuntu:16.04
2+
3+
RUN apt-get update && \
4+
apt-get install -y --no-install-recommends \
5+
ca-certificates \
6+
cmake \
7+
gcc \
8+
libc6-dev \
9+
make \
10+
pkg-config
11+
12+
COPY emscripten.sh /
13+
RUN bash /emscripten.sh 1.37.2
14+
15+
RUN apt-get install --no-install-recommends -y \
16+
nodejs \
17+
python
18+
19+
ENV NODE=/usr/bin/nodejs

docker/binaryen.sh

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
set -ex
2+
3+
main() {
4+
local version=$1
5+
6+
local dependencies=(
7+
ca-certificates
8+
cmake
9+
curl
10+
g++
11+
ninja-build
12+
)
13+
14+
apt-get update
15+
apt-get install --no-install-recommends -y ${dependencies[@]}
16+
17+
local td=$(mktemp -d)
18+
19+
curl -L https://github.com/WebAssembly/binaryen/archive/$version.tar.gz | \
20+
tar -C $td --strip-components=1 -xz
21+
22+
pushd $td
23+
cmake -G Ninja
24+
nice ninja
25+
26+
mkdir /binaryen
27+
cp -r bin lib src /binaryen
28+
cp -r src/js /binaryen/src
29+
30+
# Cleanup
31+
apt-get purge --auto-remove -y ${dependencies[@]}
32+
33+
popd
34+
35+
rm -rf $td
36+
rm $0
37+
}
38+
39+
main "${@}"

docker/emscripten.sh

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
set -ex
2+
3+
main() {
4+
local version=$1
5+
6+
local dependencies=(
7+
ca-certificates
8+
cmake
9+
curl
10+
g++
11+
ninja-build
12+
python
13+
)
14+
15+
apt-get update
16+
local purge_list=()
17+
for dep in ${dependencies[@]}; do
18+
dpkg -L $dep || (
19+
apt-get install --no-install-recommends -y $dep &&
20+
purge_list+=( $dep )
21+
)
22+
done
23+
24+
local td=$(mktemp -d)
25+
26+
mkdir $td/{build,fastcomp}
27+
28+
curl -L https://github.com/kripken/emscripten-fastcomp/archive/$version.tar.gz |
29+
tar --strip-components=1 -C $td/fastcomp -xz
30+
31+
mkdir $td/fastcomp/tools/clang
32+
curl -L https://github.com/kripken/emscripten-fastcomp-clang/archive/$version.tar.gz |
33+
tar --strip-components=1 -C $td/fastcomp/tools/clang -xz
34+
35+
pushd $td
36+
cmake \
37+
-G Ninja \
38+
-DCLANG_INCLUDE_TESTS=OFF \
39+
-DCMAKE_BUILD_TYPE=Release \
40+
-DLLVM_INCLUDE_EXAMPLES=OFF \
41+
-DLLVM_INCLUDE_TESTS=OFF \
42+
-DLLVM_TARGETS_TO_BUILD="X86;JSBackend" \
43+
$td/fastcomp
44+
45+
nice ninja
46+
ninja install
47+
48+
mkdir /emscripten
49+
curl -L https://github.com/kripken/emscripten/archive/$version.tar.gz |
50+
tar --strip-components=1 -C /emscripten -xz
51+
52+
# TODO build tools/optimizer. I have no idea if `rustc` calls `emcc` in
53+
# a way that makes uses of that optimizer though.
54+
55+
# Put `emcc` in `$PATH`
56+
ln -s /emscripten/emcc /usr/local/bin
57+
58+
# Cleanup
59+
popd
60+
61+
apt-get purge --auto-remove -y ${purge_list[@]}
62+
63+
rm -rf $td
64+
rm $0
65+
}
66+
67+
main "${@}"
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
FROM ubuntu:16.04
2+
3+
RUN apt-get update && \
4+
apt-get install -y --no-install-recommends \
5+
ca-certificates \
6+
cmake \
7+
gcc \
8+
libc6-dev \
9+
make \
10+
pkg-config
11+
12+
COPY emscripten.sh /
13+
RUN bash /emscripten.sh 1.37.2
14+
15+
RUN apt-get install --no-install-recommends -y \
16+
nodejs \
17+
python
18+
19+
COPY binaryen.sh /
20+
RUN bash /binaryen.sh version_27
21+
22+
ENV BINARYEN=/binaryen \
23+
NODE=/usr/bin/nodejs

src/docker.rs

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ pub fn run(target: &Target,
3333
verbose: bool)
3434
-> Result<ExitStatus> {
3535
let root = root.path();
36-
let home_dir = env::home_dir().ok_or_else(|| "couldn't get home directory. Is $HOME not set?")?;
36+
let home_dir = env::home_dir()
37+
.ok_or_else(|| "couldn't get home directory. Is $HOME not set?")?;
3738
let cargo_dir = env::var_os("CARGO_HOME")
3839
.map(PathBuf::from)
3940
.unwrap_or_else(|| home_dir.join(".cargo"));
@@ -48,12 +49,12 @@ pub fn run(target: &Target,
4849
fs::create_dir(&cargo_dir).ok();
4950
fs::create_dir(&xargo_dir).ok();
5051

51-
let mut cmd = if uses_xargo {
52+
let mut cargo = if uses_xargo {
5253
Command::new("xargo")
5354
} else {
5455
Command::new("cargo")
5556
};
56-
cmd.args(args);
57+
cargo.args(args);
5758

5859
// We create/regenerate the lockfile on the host system because the Docker
5960
// container doesn't have write access to the root of the Cargo project
@@ -66,29 +67,61 @@ pub fn run(target: &Target,
6667

6768
let mut docker = Command::new("docker");
6869

70+
docker.arg("run");
71+
72+
let must_run_emcc_first = if target.is_emscripten() {
73+
let temp_dir = env::temp_dir();
74+
let cache_dir = temp_dir.join(format!("cross-{}", target.triple()));
75+
76+
if !cache_dir.exists() {
77+
fs::create_dir(&cache_dir).chain_err(|| {
78+
format!("couldn't create a directory in {}",
79+
temp_dir.display())
80+
})?;
81+
}
82+
83+
docker.args(&["-v", &format!("{}:{}", cache_dir.display(), "/tmp")]);
84+
85+
!cache_dir.join(".emscripten").exists()
86+
} else {
87+
false
88+
};
89+
6990
docker
70-
.arg("run")
7191
.arg("--rm")
7292
.args(&["--user", &format!("{}:{}", id::user(), id::group())])
7393
.args(&["-e", "CARGO_HOME=/cargo"])
7494
.args(&["-e", "CARGO_TARGET_DIR=/target"])
95+
.args(&["-e", "HOME=/tmp"])
7596
.args(&["-e", &format!("USER={}", id::username())]);
7697

7798
if let Some(strace) = env::var("QEMU_STRACE").ok() {
7899
docker.args(&["-e", &format!("QEMU_STRACE={}", strace)]);
79100
}
80101

81-
docker
82-
.args(&["-e", "XARGO_HOME=/xargo"])
102+
docker.args(&["-e", "XARGO_HOME=/xargo"])
83103
.args(&["-v", &format!("{}:/xargo", xargo_dir.display())])
84104
.args(&["-v", &format!("{}:/cargo", cargo_dir.display())])
85105
.args(&["-v", &format!("{}:/project:ro", root.display())])
86-
.args(&["-v", &format!("{}:/rust:ro", rustc::sysroot(verbose)?.display())])
106+
.args(&["-v",
107+
&format!("{}:/rust:ro", rustc::sysroot(verbose)?.display())])
87108
.args(&["-v", &format!("{}:/target", target_dir.display())])
88109
.args(&["-w", "/project"])
89-
.args(&["-it", &image(toml, target)?])
90-
.args(&["sh", "-c", &format!("PATH=$PATH:/rust/bin {:?}", cmd)])
91-
.run_and_get_status(verbose)
110+
.args(&["-it", &image(toml, target)?]);
111+
112+
if must_run_emcc_first {
113+
docker.args(&["sh",
114+
"-c",
115+
&format!("emcc 2>/dev/null; \
116+
PATH=$PATH:/rust/bin {:?}",
117+
cargo)]);
118+
} else {
119+
docker.args(&["sh",
120+
"-c",
121+
&format!("PATH=$PATH:/rust/bin {:?}", cargo)]);
122+
}
123+
124+
docker.run_and_get_status(verbose)
92125
}
93126

94127
fn image(toml: Option<&Toml>, target: &Target) -> Result<String> {

src/main.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ pub enum Target {
116116
Thumbv7emNoneEabi,
117117
Thumbv7emNoneEabihf,
118118
Thumbv7mNoneEabi,
119+
120+
// Emscripten
121+
AsmjsUnknownEmscripten,
122+
Wasm32UnknownEmscripten,
119123
}
120124

121125
impl Target {
@@ -177,9 +181,17 @@ impl Target {
177181
}
178182
}
179183

184+
fn is_emscripten(&self) -> bool {
185+
match *self {
186+
Target::AsmjsUnknownEmscripten |
187+
Target::Wasm32UnknownEmscripten => true,
188+
_ => false,
189+
}
190+
}
191+
180192
fn needs_docker(&self) -> bool {
181193
self.is_linux() || self.is_bare_metal() || self.is_bsd() ||
182-
!self.is_builtin() || self.is_windows()
194+
!self.is_builtin() || self.is_windows() || self.is_emscripten()
183195
}
184196

185197
fn needs_qemu(&self) -> bool {
@@ -211,6 +223,7 @@ impl Target {
211223
ArmUnknownLinuxMusleabi => "arm-unknown-linux-musleabi",
212224
Armv7UnknownLinuxGnueabihf => "armv7-unknown-linux-gnueabihf",
213225
Armv7UnknownLinuxMusleabihf => "armv7-unknown-linux-musleabihf",
226+
AsmjsUnknownEmscripten => "asmjs-unknown-emscripten",
214227
I686AppleDarwin => "i686-apple-darwin",
215228
I686UnknownFreebsd => "i686-unknown-freebsd",
216229
I686UnknownLinuxGnu => "i686-unknown-linux-gnu",
@@ -228,6 +241,7 @@ impl Target {
228241
Thumbv7emNoneEabi => "thumbv7em-none-eabi",
229242
Thumbv7emNoneEabihf => "thumbv7em-none-eabihf",
230243
Thumbv7mNoneEabi => "thumbv7m-none-eabi",
244+
Wasm32UnknownEmscripten => "wasm32-unknown-emscripten",
231245
X86_64AppleDarwin => "x86_64-apple-darwin",
232246
X86_64PcWindowsGnu => "x86_64-pc-windows-gnu",
233247
X86_64UnknownDragonfly => "x86_64-unknown-dragonfly",
@@ -253,6 +267,7 @@ impl Target {
253267
"arm-unknown-linux-musleabi" => ArmUnknownLinuxMusleabi,
254268
"armv7-unknown-linux-gnueabihf" => Armv7UnknownLinuxGnueabihf,
255269
"armv7-unknown-linux-musleabihf" => Armv7UnknownLinuxMusleabihf,
270+
"asmjs-unknown-emscripten" => AsmjsUnknownEmscripten,
256271
"i686-apple-darwin" => I686AppleDarwin,
257272
"i686-unknown-freebsd" => I686UnknownFreebsd,
258273
"i686-unknown-linux-gnu" => I686UnknownLinuxGnu,
@@ -270,6 +285,7 @@ impl Target {
270285
"thumbv7em-none-eabi" => Thumbv7emNoneEabi,
271286
"thumbv7em-none-eabihf" => Thumbv7emNoneEabihf,
272287
"thumbv7m-none-eabi" => Thumbv7mNoneEabi,
288+
"wasm32-unknown-emscripten" => Wasm32UnknownEmscripten,
273289
"x86_64-apple-darwin" => X86_64AppleDarwin,
274290
"x86_64-pc-windows-gnu" => X86_64PcWindowsGnu,
275291
"x86_64-unknown-dragonfly" => X86_64UnknownDragonfly,

0 commit comments

Comments
 (0)