Skip to content

Commit 9cb90f4

Browse files
committed
Auto merge of #44779 - tjkirch:master, r=alexcrichton
Add aarch64-unknown-linux-musl target This adds support for the aarch64-unknown-linux-musl target in the build and CI systems. This addresses half of issue #42520. The new file `aarch64_unknown_linux_musl.rs` is a copy of `aarch64_unknown_linux_gnu.rs` with "gnu" replaced by "musl", and the added logic in `build-arm-musl.sh` is similarly a near-copy of the arches around it, so overall the changes were straightforward. Testing: ``` $ sudo ./src/ci/docker/run.sh cross ... Dist std stage2 (x86_64-unknown-linux-gnu -> aarch64-unknown-linux-musl) Building stage2 test artifacts (x86_64-unknown-linux-gnu -> aarch64-unknown-linux-musl) Compiling getopts v0.2.14 Compiling term v0.0.0 (file:///checkout/src/libterm) Compiling test v0.0.0 (file:///checkout/src/libtest) Finished release [optimized] target(s) in 16.91 secs Copying stage2 test from stage2 (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu / aarch64-unknown-linux-musl) ... Build completed successfully in 0:55:22 ``` ``` $ rustup toolchain link local obj/build/x86_64-unknown-linux-gnu/stage2 $ rustup default local ``` After setting the local toolchain as default, and adding this in ~/.cargo/config: ``` [target.aarch64-unknown-linux-musl] linker = "aarch64-linux-musl-gcc" ``` ...then the toolchain was able to build a working ripgrep as a test: ``` $ readelf -a target/aarch64-unknown-linux-musl/debug/rg | grep -i interpreter $ readelf -a target/aarch64-unknown-linux-musl/debug/rg | grep NEEDED $ file target/aarch64-unknown-linux-musl/debug/rg target/aarch64-unknown-linux-musl/debug/rg: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=be11036b0988fac5dccc9f6487eb780b05186582, not stripped ```
2 parents 44d5090 + f94bd36 commit 9cb90f4

File tree

7 files changed

+72
-1
lines changed

7 files changed

+72
-1
lines changed

src/bootstrap/configure.py

+2
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ def v(*args):
109109
"arm-unknown-linux-musleabihf install directory")
110110
v("musl-root-armv7", "target.armv7-unknown-linux-musleabihf.musl-root",
111111
"armv7-unknown-linux-musleabihf install directory")
112+
v("musl-root-aarch64", "target.aarch64-unknown-linux-musl.musl-root",
113+
"aarch64-unknown-linux-musl install directory")
112114
v("qemu-armhf-rootfs", "target.arm-unknown-linux-gnueabihf.qemu-rootfs",
113115
"rootfs in qemu testing, you probably don't want to use this")
114116
v("qemu-aarch64-rootfs", "target.aarch64-unknown-linux-gnu.qemu-rootfs",

src/bootstrap/native.rs

+1
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ impl Step for Openssl {
399399
let os = match &*target {
400400
"aarch64-linux-android" => "linux-aarch64",
401401
"aarch64-unknown-linux-gnu" => "linux-aarch64",
402+
"aarch64-unknown-linux-musl" => "linux-aarch64",
402403
"arm-linux-androideabi" => "android",
403404
"arm-unknown-linux-gnueabi" => "linux-armv4",
404405
"arm-unknown-linux-gnueabihf" => "linux-armv4",

src/ci/docker/cross/Dockerfile

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1414
zlib1g-dev \
1515
g++-arm-linux-gnueabi \
1616
g++-arm-linux-gnueabihf \
17+
g++-aarch64-linux-gnu \
1718
gcc-sparc64-linux-gnu \
1819
libc6-dev-sparc64-cross \
1920
bzip2 \
@@ -46,6 +47,7 @@ ENV TARGETS=$TARGETS,mipsel-unknown-linux-musl
4647
ENV TARGETS=$TARGETS,arm-unknown-linux-musleabi
4748
ENV TARGETS=$TARGETS,arm-unknown-linux-musleabihf
4849
ENV TARGETS=$TARGETS,armv7-unknown-linux-musleabihf
50+
ENV TARGETS=$TARGETS,aarch64-unknown-linux-musl
4951
ENV TARGETS=$TARGETS,sparc64-unknown-linux-gnu
5052
ENV TARGETS=$TARGETS,x86_64-unknown-redox
5153

@@ -62,7 +64,8 @@ ENV RUST_CONFIGURE_ARGS \
6264
--target=$TARGETS \
6365
--musl-root-arm=/usr/local/arm-linux-musleabi \
6466
--musl-root-armhf=/usr/local/arm-linux-musleabihf \
65-
--musl-root-armv7=/usr/local/armv7-linux-musleabihf
67+
--musl-root-armv7=/usr/local/armv7-linux-musleabihf \
68+
--musl-root-aarch64=/usr/local/aarch64-linux-musl
6669
ENV SCRIPT python2.7 ../x.py dist --target $TARGETS
6770

6871
# sccache

src/ci/docker/cross/build-arm-musl.sh

+27
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,24 @@ CFLAGS="-march=armv7-a" \
6565
hide_output make -j$(nproc)
6666
hide_output make install
6767
cd ..
68+
rm -rf musl-$MUSL
69+
70+
tar xf musl-$MUSL.tar.gz
71+
cd musl-$MUSL
72+
CC=aarch64-linux-gnu-gcc \
73+
CFLAGS="" \
74+
hide_output ./configure \
75+
--prefix=/usr/local/aarch64-linux-musl \
76+
--enable-wrapper=gcc
77+
hide_output make -j$(nproc)
78+
hide_output make install
79+
cd ..
6880
rm -rf musl-$MUSL*
6981

7082
ln -nsf ../arm-linux-musleabi/bin/musl-gcc /usr/local/bin/arm-linux-musleabi-gcc
7183
ln -nsf ../arm-linux-musleabihf/bin/musl-gcc /usr/local/bin/arm-linux-musleabihf-gcc
7284
ln -nsf ../armv7-linux-musleabihf/bin/musl-gcc /usr/local/bin/armv7-linux-musleabihf-gcc
85+
ln -nsf ../aarch64-linux-musl/bin/musl-gcc /usr/local/bin/aarch64-unknown-linux-musl-gcc
7386

7487
curl -L https://github.com/llvm-mirror/llvm/archive/release_39.tar.gz | tar xzf -
7588
curl -L https://github.com/llvm-mirror/libunwind/archive/release_39.tar.gz | tar xzf -
@@ -116,5 +129,19 @@ cp lib/libunwind.a /usr/local/armv7-linux-musleabihf/lib
116129
cd ..
117130
rm -rf libunwind-build
118131

132+
mkdir libunwind-build
133+
cd libunwind-build
134+
cmake ../libunwind-release_39 \
135+
-DLLVM_PATH=/tmp/llvm-release_39 \
136+
-DLIBUNWIND_ENABLE_SHARED=0 \
137+
-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
138+
-DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
139+
-DCMAKE_C_FLAGS="" \
140+
-DCMAKE_CXX_FLAGS=""
141+
make -j$(nproc)
142+
cp lib/libunwind.a /usr/local/aarch64-linux-musl/lib
143+
cd ..
144+
rm -rf libunwind-build
145+
119146
rm -rf libunwind-release_39
120147
rm -rf llvm-release_39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright 2017 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 LinkerFlavor;
12+
use target::{Target, TargetOptions, TargetResult};
13+
14+
pub fn target() -> TargetResult {
15+
let mut base = super::linux_musl_base::opts();
16+
base.max_atomic_width = Some(128);
17+
18+
// see #36994
19+
base.exe_allocation_crate = None;
20+
21+
Ok(Target {
22+
llvm_target: "aarch64-unknown-linux-musl".to_string(),
23+
target_endian: "little".to_string(),
24+
target_pointer_width: "64".to_string(),
25+
target_env: "musl".to_string(),
26+
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".to_string(),
27+
arch: "aarch64".to_string(),
28+
target_os: "linux".to_string(),
29+
target_vendor: "unknown".to_string(),
30+
linker_flavor: LinkerFlavor::Gcc,
31+
options: TargetOptions {
32+
abi_blacklist: super::arm_base::abi_blacklist(),
33+
.. base
34+
},
35+
})
36+
}

src/librustc_back/target/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ supported_targets! {
153153
("armv7-unknown-linux-gnueabihf", armv7_unknown_linux_gnueabihf),
154154
("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
155155
("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
156+
("aarch64-unknown-linux-musl", aarch64_unknown_linux_musl),
156157
("x86_64-unknown-linux-musl", x86_64_unknown_linux_musl),
157158
("i686-unknown-linux-musl", i686_unknown_linux_musl),
158159
("mips-unknown-linux-musl", mips_unknown_linux_musl),

src/tools/build-manifest/src/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ static TARGETS: &'static [&'static str] = &[
5050
"aarch64-unknown-fuchsia",
5151
"aarch64-linux-android",
5252
"aarch64-unknown-linux-gnu",
53+
"aarch64-unknown-linux-musl",
5354
"arm-linux-androideabi",
5455
"arm-unknown-linux-gnueabi",
5556
"arm-unknown-linux-gnueabihf",

0 commit comments

Comments
 (0)