From 7b026f0355a5394358e6a9758185db8eec850e0f Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Mon, 25 Jan 2016 16:23:31 -0500 Subject: [PATCH] add support for mips(el)-unknown-linux-musl This target covers MIPS devices that run the trunk version of OpenWRT. The x86_64-unknown-linux-musl target always links statically to C libraries. For the mips(el)-unknown-linux-musl target, we opt for dynamic linking (like most of other targets do) to keep binary size down. As for the C compiler flags used in the build system, we use the same flags used for the mips(el)-unknown-linux-gnu target. --- .gitmodules | 3 ++- configure | 2 +- mk/cfg/mips-unknown-linux-musl.mk | 24 ++++++++++++++++++ mk/cfg/mipsel-unknown-linux-musl.mk | 24 ++++++++++++++++++ src/liblibc | 2 +- .../target/mips_unknown_linux_musl.rs | 24 ++++++++++++++++++ .../target/mipsel_unknown_linux_musl.rs | 25 +++++++++++++++++++ src/librustc_back/target/mod.rs | 2 ++ src/libstd/os/linux/raw.rs | 9 +++++++ src/libstd/sys/common/libunwind.rs | 5 ++-- 10 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 mk/cfg/mips-unknown-linux-musl.mk create mode 100644 mk/cfg/mipsel-unknown-linux-musl.mk create mode 100644 src/librustc_back/target/mips_unknown_linux_musl.rs create mode 100644 src/librustc_back/target/mipsel_unknown_linux_musl.rs diff --git a/.gitmodules b/.gitmodules index eb033f5401d..1c0da895469 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,4 +16,5 @@ url = https://github.com/rust-lang/rust-installer.git [submodule "src/liblibc"] path = src/liblibc - url = https://github.com/rust-lang-nursery/libc.git + url = https://github.com/japaric/libc.git + branch = mips-musl diff --git a/configure b/configure index 2693e9bcd23..fea864638f8 100755 --- a/configure +++ b/configure @@ -1178,7 +1178,7 @@ do ;; - *-musl) + x86_64-*-musl) if [ ! -f $CFG_MUSL_ROOT/lib/libc.a ] then err "musl libc $CFG_MUSL_ROOT/lib/libc.a not found" diff --git a/mk/cfg/mips-unknown-linux-musl.mk b/mk/cfg/mips-unknown-linux-musl.mk new file mode 100644 index 00000000000..f7892bf041f --- /dev/null +++ b/mk/cfg/mips-unknown-linux-musl.mk @@ -0,0 +1,24 @@ +# mips-unknown-linux-musl configuration +CC_mips-unknown-linux-musl=mips-openwrt-linux-gcc +CXX_mips-unknown-linux-musl=mips-openwrt-linux-g++ +CPP_mips-unknown-linux-musl=mips-openwrt-linux-gcc -E +AR_mips-unknown-linux-musl=mips-openwrt-linux-ar +CFG_LIB_NAME_mips-unknown-linux-musl=lib$(1).so +CFG_STATIC_LIB_NAME_mips-unknown-linux-musl=lib$(1).a +CFG_LIB_GLOB_mips-unknown-linux-musl=lib$(1)-*.so +CFG_LIB_DSYM_GLOB_mips-unknown-linux-musl=lib$(1)-*.dylib.dSYM +CFG_JEMALLOC_CFLAGS_mips-unknown-linux-musl := -mips32r2 -msoft-float -mabi=32 $(CFLAGS) +CFG_GCCISH_CFLAGS_mips-unknown-linux-musl := -Wall -g -fPIC -mips32r2 -msoft-float -mabi=32 $(CFLAGS) +CFG_GCCISH_CXXFLAGS_mips-unknown-linux-musl := -fno-rtti $(CXXFLAGS) +CFG_GCCISH_LINK_FLAGS_mips-unknown-linux-musl := -shared -fPIC -g -mips32r2 -msoft-float -mabi=32 +CFG_GCCISH_DEF_FLAG_mips-unknown-linux-musl := -Wl,--export-dynamic,--dynamic-list= +CFG_LLC_FLAGS_mips-unknown-linux-musl := +CFG_INSTALL_NAME_mips-unknown-linux-musl = +CFG_EXE_SUFFIX_mips-unknown-linux-musl = +CFG_WINDOWSY_mips-unknown-linux-musl := +CFG_UNIXY_mips-unknown-linux-musl := 1 +CFG_LDPATH_mips-unknown-linux-musl := +CFG_RUN_mips-unknown-linux-musl= +CFG_RUN_TARG_mips-unknown-linux-musl= +RUSTC_FLAGS_mips-unknown-linux-musl := -C target-cpu=mips32r2 -C target-feature="+mips32r2" -C soft-float +CFG_GNU_TRIPLE_mips-unknown-linux-musl := mips-unknown-linux-musl diff --git a/mk/cfg/mipsel-unknown-linux-musl.mk b/mk/cfg/mipsel-unknown-linux-musl.mk new file mode 100644 index 00000000000..632423cc881 --- /dev/null +++ b/mk/cfg/mipsel-unknown-linux-musl.mk @@ -0,0 +1,24 @@ +# mipsel-unknown-linux-musl configuration +CC_mipsel-unknown-linux-musl=mipsel-openwrt-linux-gcc +CXX_mipsel-unknown-linux-musl=mipsel-openwrt-linux-g++ +CPP_mipsel-unknown-linux-musl=mipsel-openwrt-linux-gcc +AR_mipsel-unknown-linux-musl=mipsel-openwrt-linux-ar +CFG_LIB_NAME_mipsel-unknown-linux-musl=lib$(1).so +CFG_STATIC_LIB_NAME_mipsel-unknown-linux-musl=lib$(1).a +CFG_LIB_GLOB_mipsel-unknown-linux-musl=lib$(1)-*.so +CFG_LIB_DSYM_GLOB_mipsel-unknown-linux-musl=lib$(1)-*.dylib.dSYM +CFG_JEMALLOC_CFLAGS_mipsel-unknown-linux-musl := -mips32 -mabi=32 $(CFLAGS) +CFG_GCCISH_CFLAGS_mipsel-unknown-linux-musl := -Wall -g -fPIC -mips32 -mabi=32 $(CFLAGS) +CFG_GCCISH_CXXFLAGS_mipsel-unknown-linux-musl := -fno-rtti $(CXXFLAGS) +CFG_GCCISH_LINK_FLAGS_mipsel-unknown-linux-musl := -shared -fPIC -g -mips32 +CFG_GCCISH_DEF_FLAG_mipsel-unknown-linux-musl := -Wl,--export-dynamic,--dynamic-list= +CFG_LLC_FLAGS_mipsel-unknown-linux-musl := +CFG_INSTALL_NAME_mipsel-unknown-linux-musl = +CFG_EXE_SUFFIX_mipsel-unknown-linux-musl := +CFG_WINDOWSY_mipsel-unknown-linux-musl := +CFG_UNIXY_mipsel-unknown-linux-musl := 1 +CFG_LDPATH_mipsel-unknown-linux-musl := +CFG_RUN_mipsel-unknown-linux-musl= +CFG_RUN_TARG_mipsel-unknown-linux-musl= +RUSTC_FLAGS_mipsel-unknown-linux-musl := -C target-cpu=mips32 -C target-feature="+mips32" +CFG_GNU_TRIPLE_mipsel-unknown-linux-musl := mipsel-unknown-linux-musl diff --git a/src/liblibc b/src/liblibc index 91ff43c736d..81c05bcddb0 160000 --- a/src/liblibc +++ b/src/liblibc @@ -1 +1 @@ -Subproject commit 91ff43c736de664f8d3cd351e148c09cdea6731e +Subproject commit 81c05bcddb05d0e5facf66f3945405bbf50b04d3 diff --git a/src/librustc_back/target/mips_unknown_linux_musl.rs b/src/librustc_back/target/mips_unknown_linux_musl.rs new file mode 100644 index 00000000000..21be075af8e --- /dev/null +++ b/src/librustc_back/target/mips_unknown_linux_musl.rs @@ -0,0 +1,24 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use target::Target; + +pub fn target() -> Target { + Target { + llvm_target: "mips-unknown-linux-musl".to_string(), + target_endian: "big".to_string(), + target_pointer_width: "32".to_string(), + arch: "mips".to_string(), + target_os: "linux".to_string(), + target_env: "musl".to_string(), + target_vendor: "unknown".to_string(), + options: super::linux_base::opts() + } +} diff --git a/src/librustc_back/target/mipsel_unknown_linux_musl.rs b/src/librustc_back/target/mipsel_unknown_linux_musl.rs new file mode 100644 index 00000000000..11c9caf9037 --- /dev/null +++ b/src/librustc_back/target/mipsel_unknown_linux_musl.rs @@ -0,0 +1,25 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use target::Target; + +pub fn target() -> Target { + Target { + llvm_target: "mipsel-unknown-linux-musl".to_string(), + target_endian: "little".to_string(), + target_pointer_width: "32".to_string(), + arch: "mips".to_string(), + target_os: "linux".to_string(), + target_env: "musl".to_string(), + target_vendor: "unknown".to_string(), + + options: super::linux_base::opts() + } +} diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs index 331ec4a82ac..39f05ba645e 100644 --- a/src/librustc_back/target/mod.rs +++ b/src/librustc_back/target/mod.rs @@ -420,6 +420,8 @@ impl Target { armv7_unknown_linux_gnueabihf, aarch64_unknown_linux_gnu, x86_64_unknown_linux_musl, + mips_unknown_linux_musl, + mipsel_unknown_linux_musl, i686_linux_android, arm_linux_androideabi, diff --git a/src/libstd/os/linux/raw.rs b/src/libstd/os/linux/raw.rs index 953d0917141..286823552c2 100644 --- a/src/libstd/os/linux/raw.rs +++ b/src/libstd/os/linux/raw.rs @@ -93,11 +93,20 @@ mod arch { use os::raw::{c_long, c_ulong}; use os::unix::raw::{gid_t, uid_t}; + #[cfg(target_env = "musl")] + #[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i64; + #[cfg(not(target_env = "musl"))] #[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i32; #[stable(feature = "raw_ext", since = "1.1.0")] pub type blksize_t = i32; + #[cfg(target_env = "musl")] + #[stable(feature = "raw_ext", since = "1.1.0")] pub type ino_t = u64; + #[cfg(not(target_env = "musl"))] #[stable(feature = "raw_ext", since = "1.1.0")] pub type ino_t = u32; #[stable(feature = "raw_ext", since = "1.1.0")] pub type nlink_t = u32; + #[cfg(target_env = "musl")] #[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i32; + #[cfg(not(target_env = "musl"))] + #[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i32; #[repr(C)] diff --git a/src/libstd/sys/common/libunwind.rs b/src/libstd/sys/common/libunwind.rs index 77d1eed9623..179a27a2ec8 100644 --- a/src/libstd/sys/common/libunwind.rs +++ b/src/libstd/sys/common/libunwind.rs @@ -101,9 +101,10 @@ pub type _Unwind_Exception_Cleanup_Fn = exception: *mut _Unwind_Exception); #[cfg_attr(any(all(target_os = "linux", not(target_env = "musl")), - target_os = "freebsd"), + target_os = "freebsd", + all(target_os = "linux", target_env = "musl", not(target_arch = "x86_64"))), link(name = "gcc_s"))] -#[cfg_attr(all(target_os = "linux", target_env = "musl", not(test)), +#[cfg_attr(all(target_os = "linux", target_env = "musl", target_arch = "x86_64", not(test)), link(name = "unwind", kind = "static"))] #[cfg_attr(any(target_os = "android", target_os = "openbsd"), link(name = "gcc"))]