Skip to content

Commit 483d805

Browse files
committed
Add ARM MUSL targets.
The targets are: - `arm-unknown-linux-musleabi` - `arm-unknown-linux-musleabihf` - `armv7-unknown-linux-musleabihf` These mirror the existing `gnueabi` targets. All of these targets produce fully static binaries, similar to the x86 MUSL targets. For now these targets can only be used with `--rustbuild` builds, as rust-lang/compiler-rt#22 only made the necessary compiler-rt changes in the CMake configs, not the plain GNU Make configs. I've tested these targets GCC 5.3.0 compiled again musl-1.1.12 (downloaded from http://musl.codu.org/). An example `./configure` invocation is: ``` ./configure \ --enable-rustbuild --target=arm-unknown-linux-musleabi \ --musl-root="$MUSL_ROOT" ``` where `MUSL_ROOT` points to the `arm-linux-musleabi` prefix. Usually that path will be of the form `/foobar/arm-linux-musleabi/arm-linux-musleabi`. Usually the cross-compile toolchain will live under `/foobar/arm-linux-musleabi/bin`. That path should either by added to your `PATH` variable, or you should add a section to your `config.toml` as follows: ``` [target.arm-unknown-linux-musleabi] cc = "/foobar/arm-linux-musleabi/bin/arm-linux-musleabi-gcc" cxx = "/foobar/arm-linux-musleabi/bin/arm-linux-musleabi-g++" ``` As a prerequisite you'll also have to put a cross-compiled static `libunwind.a` library in `$MUSL_ROOT/lib`. This is similar to [how the x86_64 MUSL targets are built] (https://doc.rust-lang.org/book/advanced-linking.html).
1 parent 51153db commit 483d805

20 files changed

+225
-90
lines changed

configure

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1176,7 +1176,7 @@ do
11761176
;;
11771177

11781178

1179-
x86_64-*-musl)
1179+
x86_64-*-musl | arm-*-musleabi)
11801180
if [ ! -f $CFG_MUSL_ROOT/lib/libc.a ]
11811181
then
11821182
err "musl libc $CFG_MUSL_ROOT/lib/libc.a not found"

mk/cfg/arm-unknown-linux-musleabi.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# This file is intentially left empty to indicate that, while this target is
2+
# supported, it's not supported using plain GNU Make builds. Use a --rustbuild
3+
# instead.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# This file is intentially left empty to indicate that, while this target is
2+
# supported, it's not supported using plain GNU Make builds. Use a --rustbuild
3+
# instead.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# This file is intentially left empty to indicate that, while this target is
2+
# supported, it's not supported using plain GNU Make builds. Use a --rustbuild
3+
# instead.

src/bootstrap/build/compile.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ pub fn std_link(build: &Build,
8282
}
8383
add_to_sysroot(&out_dir, &libdir);
8484

85-
if target.contains("musl") &&
86-
(target.contains("x86_64") || target.contains("i686")) {
85+
if target.contains("musl") && !target.contains("mips") {
8786
copy_third_party_objects(build, target, &libdir);
8887
}
8988
}

src/bootstrap/build/native.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,13 @@ pub fn compiler_rt(build: &Build, target: &str) {
125125
target.contains("netbsd") {
126126
let os = if target.contains("android") {"-android"} else {""};
127127
let arch = if arch.starts_with("armv7") {
128-
"armv7"
128+
"armv7"
129129
} else if arch.starts_with("arm") {
130-
if target.contains("eabihf") || target.contains("android") {
131-
"armhf"
132-
} else {
133-
"arm"
134-
}
130+
if target.contains("eabihf") || target.contains("android") {
131+
"armhf"
132+
} else {
133+
"arm"
134+
}
135135
} else {
136136
arch
137137
};

src/bootstrap/build/sanity.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ pub fn check(build: &mut Build) {
8888
}
8989

9090
// Make sure musl-root is valid if specified
91-
if target.contains("musl") && (target.contains("x86_64") || target.contains("i686")) {
91+
if target.contains("musl") && !target.contains("mips") {
9292
match build.config.musl_root {
9393
Some(ref root) => {
9494
if fs::metadata(root.join("lib/libc.a")).is_err() {

src/liballoc_jemalloc/build.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,16 @@ fn main() {
4646
.replace("\\", "/"))
4747
.current_dir(&build_dir)
4848
.env("CC", compiler.path())
49-
.env("EXTRA_CFLAGS", cflags)
49+
.env("EXTRA_CFLAGS", cflags.clone())
50+
// jemalloc generates Makefile deps using GCC's "-MM" flag. This means
51+
// that GCC will run the preprocessor, and only the preprocessor, over
52+
// jemalloc's source files. If we don't specify CPPFLAGS, then at least
53+
// on ARM that step fails with a "Missing implementation for 32-bit
54+
// atomic operations" error. This is because no "-march" flag will be
55+
// passed to GCC, and then GCC won't define the
56+
// "__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4" macro that jemalloc needs to
57+
// select an atomic operation implementation.
58+
.env("CPPFLAGS", cflags.clone())
5059
.env("AR", &ar)
5160
.env("RANLIB", format!("{} s", ar.display()));
5261

src/liballoc_jemalloc/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ use libc::{c_int, c_void, size_t};
3636
#[cfg_attr(target_os = "android", link(name = "gcc"))]
3737
#[cfg_attr(all(not(windows),
3838
not(target_os = "android"),
39-
not(target_env = "musl")),
39+
not(target_env = "musl"),
40+
not(target_env = "musleabi"),
41+
not(target_env = "musleabihf")),
4042
link(name = "pthread"))]
4143
#[cfg(not(cargobuild))]
4244
extern {}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
use target::Target;
12+
13+
pub fn target() -> Target {
14+
let mut base = super::musl_base::opts();
15+
16+
// Most of these settings are copied from the arm_unknown_linux_gnueabi
17+
// target.
18+
base.features = "+v6".to_string();
19+
Target {
20+
// It's important we use "gnueabi" and not "musleabi" here. LLVM uses it
21+
// to determine the calling convention and float ABI, and it doesn't
22+
// support the "musleabi" value.
23+
llvm_target: "arm-unknown-linux-gnueabi".to_string(),
24+
target_endian: "little".to_string(),
25+
target_pointer_width: "32".to_string(),
26+
data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
27+
arch: "arm".to_string(),
28+
target_os: "linux".to_string(),
29+
target_env: "musleabi".to_string(),
30+
target_vendor: "unknown".to_string(),
31+
options: base,
32+
}
33+
}

0 commit comments

Comments
 (0)