Skip to content

Commit cadc67e

Browse files
committed
Auto merge of #24777 - alexcrichton:musl, r=brson
These commits build on [some great work on reddit](http://www.reddit.com/r/rust/comments/33boew/weekend_experiment_link_rust_programs_against/) for adding MUSL support to the compiler. This goal of this PR is to enable a `--target x86_64-unknown-linux-musl` argument to the compiler to work A-OK. The outcome here is that there are 0 compile-time dependencies for a MUSL-targeting build *except for a linker*. Currently this also assumes that MUSL is being used for statically linked binaries so there is no support for dynamically linked binaries with MUSL. MUSL support largely just entailed munging around with the linker and where libs are located, and the major highlights are: * The entirety of `libc.a` is included in `liblibc.rlib` (statically included as an archive). * The entirety of `libunwind.a` is included in `libstd.rlib` (like with liblibc). * The target specification for MUSL passes a number of ... flavorful options! Each option is documented in the relevant commit. * The entire test suite currently passes with MUSL as a target, except for: * Dynamic linking tests are all ignored as it's not supported with MUSL * Stack overflow detection is not working MUSL yet (I'm not sure why) * There is a language change included in this PR to add a `target_env` `#[cfg]` directive. This is used to conditionally build code for only MUSL (or for linux distros not MUSL). I highly suspect that this will also be used by Windows to target MSVC instead of a MinGW-based toolchain. To build a compiler targeting MUSL you need to follow these steps: 1. Clone the current MUSL repo from `git://git.musl-libc.org/musl`. Build this as usual and install it. 2. Clone and build LLVM's [libcxxabi](http://libcxxabi.llvm.org/) library. Only the `libunwind.a` artifact is needed. I have tried using upstream libunwind's source repo but I have not gotten unwinding to work with it unfortunately. Move `libunwind.a` adjacent to MUSL's `libc.a` 3. Configure a Rust checkout with `--target=x86_64-unknown-linux-musl --musl-root=$MUSL_ROOT` where `MUSL_ROOT` is where you installed MUSL in step 1. I hope to improve building a copy of libunwind as it's still a little sketchy and difficult to do today, but other than that everything should "just work"! This PR is not intended to include 100% comprehensive support for MUSL, as future modifications will probably be necessary.
2 parents 441b3f0 + 247842b commit cadc67e

File tree

78 files changed

+282
-168
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+282
-168
lines changed

configure

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,7 @@ valopt jemalloc-root "" "set directory where libjemalloc_pic.a is located"
583583
valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
584584
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
585585
valopt release-channel "dev" "the name of the release channel to build"
586+
valopt musl-root "/usr/local" "MUSL root installation directory"
586587

587588
# Many of these are saved below during the "writing configuration" step
588589
# (others are conditionally saved).
@@ -1058,6 +1059,13 @@ do
10581059
fi
10591060
;;
10601061

1062+
1063+
*-musl)
1064+
if [ ! -f $CFG_MUSL_ROOT/lib/libc.a ]
1065+
then
1066+
err "musl libc $CFG_MUSL_ROOT/lib/libc.a not found"
1067+
fi
1068+
;;
10611069
*)
10621070
;;
10631071
esac

mk/cfg/aarch64-apple-ios.mk

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,12 @@ CFG_GCCISH_CFLAGS_aarch64-apple-ios := -Wall -Werror -fPIC $(CFG_IOS_SDK_FLAGS_a
2020
CFG_GCCISH_CXXFLAGS_aarch64-apple-ios := -fno-rtti $(CFG_IOS_SDK_FLAGS_aarch64-apple-ios) -I$(CFG_IOS_SDK_aarch64-apple-ios)/usr/include/c++/4.2.1
2121
CFG_GCCISH_LINK_FLAGS_aarch64-apple-ios := -lpthread -syslibroot $(CFG_IOS_SDK_aarch64-apple-ios) -Wl,-no_compact_unwind
2222
CFG_GCCISH_DEF_FLAG_aarch64-apple-ios := -Wl,-exported_symbols_list,
23-
CFG_GCCISH_PRE_LIB_FLAGS_aarch64-apple-ios :=
24-
CFG_GCCISH_POST_LIB_FLAGS_aarch64-apple-ios :=
25-
CFG_DEF_SUFFIX_aarch64-apple-ios := .darwin.def
2623
CFG_LLC_FLAGS_aarch64-apple-ios := -mattr=+neon,+cyclone,+fp-armv8
2724
CFG_INSTALL_NAME_aarch64-apple-ios = -Wl,-install_name,@rpath/$(1)
2825
CFG_LIBUV_LINK_FLAGS_aarch64-apple-ios =
2926
CFG_EXE_SUFFIX_aarch64-apple-ios :=
3027
CFG_WINDOWSY_aarch64-apple-ios :=
3128
CFG_UNIXY_aarch64-apple-ios := 1
32-
CFG_PATH_MUNGE_aarch64-apple-ios := true
3329
CFG_LDPATH_aarch64-apple-ios :=
3430
CFG_RUN_aarch64-apple-ios = $(2)
3531
CFG_RUN_TARG_aarch64-apple-ios = $(call CFG_RUN_aarch64-apple-ios,,$(2))

mk/cfg/aarch64-linux-android.mk

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,11 @@ CFG_GCCISH_CFLAGS_aarch64-linux-android := -Wall -g -fPIC -D__aarch64__ -DANDROI
1313
CFG_GCCISH_CXXFLAGS_aarch64-linux-android := -fno-rtti $(CXXFLAGS)
1414
CFG_GCCISH_LINK_FLAGS_aarch64-linux-android := -shared -fPIC -ldl -g -lm -lsupc++
1515
CFG_GCCISH_DEF_FLAG_aarch64-linux-android := -Wl,--export-dynamic,--dynamic-list=
16-
CFG_GCCISH_PRE_LIB_FLAGS_aarch64-linux-android := -Wl,-whole-archive
17-
CFG_GCCISH_POST_LIB_FLAGS_aarch64-linux-android := -Wl,-no-whole-archive
18-
CFG_DEF_SUFFIX_aarch64-linux-android := .android.def
1916
CFG_LLC_FLAGS_aarch64-linux-android :=
2017
CFG_INSTALL_NAME_aarch64-linux-android =
2118
CFG_EXE_SUFFIX_aarch64-linux-android :=
2219
CFG_WINDOWSY_aarch64-linux-android :=
2320
CFG_UNIXY_aarch64-linux-android := 1
24-
CFG_PATH_MUNGE_aarch64-linux-android := true
2521
CFG_LDPATH_aarch64-linux-android :=
2622
CFG_RUN_aarch64-linux-android=
2723
CFG_RUN_TARG_aarch64-linux-android=

mk/cfg/aarch64-unknown-linux-gnu.mk

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,11 @@ CFG_GCCISH_CFLAGS_aarch64-unknown-linux-gnu := -Wall -g -fPIC -D__aarch64__ $(CF
1313
CFG_GCCISH_CXXFLAGS_aarch64-unknown-linux-gnu := -fno-rtti $(CXXFLAGS)
1414
CFG_GCCISH_LINK_FLAGS_aarch64-unknown-linux-gnu := -shared -fPIC -g
1515
CFG_GCCISH_DEF_FLAG_aarch64-unknown-linux-gnu := -Wl,--export-dynamic,--dynamic-list=
16-
CFG_GCCISH_PRE_LIB_FLAGS_aarch64-unknown-linux-gnu := -Wl,-whole-archive
17-
CFG_GCCISH_POST_LIB_FLAGS_aarch64-unknown-linux-gnu := -Wl,-no-whole-archive
18-
CFG_DEF_SUFFIX_aarch64-unknown-linux-gnu := .linux.def
1916
CFG_LLC_FLAGS_aarch64-unknown-linux-gnu :=
2017
CFG_INSTALL_NAME_aarch64-unknown-linux-gnu =
2118
CFG_EXE_SUFFIX_aarch64-unknown-linux-gnu :=
2219
CFG_WINDOWSY_aarch64-unknown-linux-gnu :=
2320
CFG_UNIXY_aarch64-unknown-linux-gnu := 1
24-
CFG_PATH_MUNGE_aarch64-unknown-linux-gnu := true
2521
CFG_LDPATH_aarch64-unknown-linux-gnu :=
2622
CFG_RUN_aarch64-unknown-linux-gnu=$(2)
2723
CFG_RUN_TARG_aarch64-unknown-linux-gnu=$(call CFG_RUN_aarch64-unknown-linux-gnu,,$(2))

mk/cfg/arm-linux-androideabi.mk

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,11 @@ CFG_GCCISH_CFLAGS_arm-linux-androideabi := -Wall -g -fPIC -D__arm__ -DANDROID -D
1212
CFG_GCCISH_CXXFLAGS_arm-linux-androideabi := -fno-rtti $(CXXFLAGS)
1313
CFG_GCCISH_LINK_FLAGS_arm-linux-androideabi := -shared -fPIC -ldl -g -lm -lsupc++
1414
CFG_GCCISH_DEF_FLAG_arm-linux-androideabi := -Wl,--export-dynamic,--dynamic-list=
15-
CFG_GCCISH_PRE_LIB_FLAGS_arm-linux-androideabi := -Wl,-whole-archive
16-
CFG_GCCISH_POST_LIB_FLAGS_arm-linux-androideabi := -Wl,-no-whole-archive
17-
CFG_DEF_SUFFIX_arm-linux-androideabi := .android.def
1815
CFG_LLC_FLAGS_arm-linux-androideabi :=
1916
CFG_INSTALL_NAME_arm-linux-androideabi =
2017
CFG_EXE_SUFFIX_arm-linux-androideabi :=
2118
CFG_WINDOWSY_arm-linux-androideabi :=
2219
CFG_UNIXY_arm-linux-androideabi := 1
23-
CFG_PATH_MUNGE_arm-linux-androideabi := true
2420
CFG_LDPATH_arm-linux-androideabi :=
2521
CFG_RUN_arm-linux-androideabi=
2622
CFG_RUN_TARG_arm-linux-androideabi=

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,11 @@ CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__ -mfpu=vf
1313
CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabi := -fno-rtti $(CXXFLAGS)
1414
CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabi := -shared -fPIC -g
1515
CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabi := -Wl,--export-dynamic,--dynamic-list=
16-
CFG_GCCISH_PRE_LIB_FLAGS_arm-unknown-linux-gnueabi := -Wl,-whole-archive
17-
CFG_GCCISH_POST_LIB_FLAGS_arm-unknown-linux-gnueabi := -Wl,-no-whole-archive
18-
CFG_DEF_SUFFIX_arm-unknown-linux-gnueabi := .linux.def
1916
CFG_LLC_FLAGS_arm-unknown-linux-gnueabi :=
2017
CFG_INSTALL_NAME_arm-unknown-linux-gnueabi =
2118
CFG_EXE_SUFFIX_arm-unknown-linux-gnueabi :=
2219
CFG_WINDOWSY_arm-unknown-linux-gnueabi :=
2320
CFG_UNIXY_arm-unknown-linux-gnueabi := 1
24-
CFG_PATH_MUNGE_arm-unknown-linux-gnueabi := true
2521
CFG_LDPATH_arm-unknown-linux-gnueabi :=
2622
CFG_RUN_arm-unknown-linux-gnueabi=$(2)
2723
CFG_RUN_TARG_arm-unknown-linux-gnueabi=$(call CFG_RUN_arm-unknown-linux-gnueabi,,$(2))

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,11 @@ CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabihf := -Wall -g -fPIC -D__arm__ $(CFLA
1313
CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabihf := -fno-rtti $(CXXFLAGS)
1414
CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabihf := -shared -fPIC -g
1515
CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabihf := -Wl,--export-dynamic,--dynamic-list=
16-
CFG_GCCISH_PRE_LIB_FLAGS_arm-unknown-linux-gnueabihf := -Wl,-whole-archive
17-
CFG_GCCISH_POST_LIB_FLAGS_arm-unknown-linux-gnueabihf := -Wl,-no-whole-archive
18-
CFG_DEF_SUFFIX_arm-unknown-linux-gnueabihf := .linux.def
1916
CFG_LLC_FLAGS_arm-unknown-linux-gnueabihf :=
2017
CFG_INSTALL_NAME_ar,-unknown-linux-gnueabihf =
2118
CFG_EXE_SUFFIX_arm-unknown-linux-gnueabihf :=
2219
CFG_WINDOWSY_arm-unknown-linux-gnueabihf :=
2320
CFG_UNIXY_arm-unknown-linux-gnueabihf := 1
24-
CFG_PATH_MUNGE_arm-unknown-linux-gnueabihf := true
2521
CFG_LDPATH_arm-unknown-linux-gnueabihf :=
2622
CFG_RUN_arm-unknown-linux-gnueabihf=$(2)
2723
CFG_RUN_TARG_arm-unknown-linux-gnueabihf=$(call CFG_RUN_arm-unknown-linux-gnueabihf,,$(2))

mk/cfg/armv7-apple-ios.mk

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,11 @@ CFG_GCCISH_CFLAGS_armv7-apple-ios := -Wall -Werror -g -fPIC $(CFG_IOS_SDK_FLAGS_
1919
CFG_GCCISH_CXXFLAGS_armv7-apple-ios := -fno-rtti $(CFG_IOS_SDK_FLAGS_armv7-apple-ios) -I$(CFG_IOS_SDK_armv7-apple-ios)/usr/include/c++/4.2.1
2020
CFG_GCCISH_LINK_FLAGS_armv7-apple-ios := -lpthread -syslibroot $(CFG_IOS_SDK_armv7-apple-ios) -Wl,-no_compact_unwind
2121
CFG_GCCISH_DEF_FLAG_armv7-apple-ios := -Wl,-exported_symbols_list,
22-
CFG_GCCISH_PRE_LIB_FLAGS_armv7-apple-ios :=
23-
CFG_GCCISH_POST_LIB_FLAGS_armv7-apple-ios :=
24-
CFG_DEF_SUFFIX_armv7-apple-ios := .darwin.def
2522
CFG_LLC_FLAGS_armv7-apple-ios := -mattr=+vfp3,+v7,+neon -march=arm
2623
CFG_INSTALL_NAME_armv7-apple-ios = -Wl,-install_name,@rpath/$(1)
2724
CFG_EXE_SUFFIX_armv7-apple-ios :=
2825
CFG_WINDOWSY_armv7-apple-ios :=
2926
CFG_UNIXY_armv7-apple-ios := 1
30-
CFG_PATH_MUNGE_armv7-apple-ios := true
3127
CFG_LDPATH_armv7-apple-ios :=
3228
CFG_RUN_armv7-apple-ios = $(2)
3329
CFG_RUN_TARG_armv7-apple-ios = $(call CFG_RUN_armv7-apple-ios,,$(2))

mk/cfg/armv7s-apple-ios.mk

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,11 @@ CFG_GCCISH_CFLAGS_armv7s-apple-ios := -Wall -Werror -g -fPIC $(CFG_IOS_SDK_FLAGS
1919
CFG_GCCISH_CXXFLAGS_armv7s-apple-ios := -fno-rtti $(CFG_IOS_SDK_FLAGS_armv7s-apple-ios) -I$(CFG_IOS_SDK_armv7s-apple-ios)/usr/include/c++/4.2.1
2020
CFG_GCCISH_LINK_FLAGS_armv7s-apple-ios := -lpthread -syslibroot $(CFG_IOS_SDK_armv7s-apple-ios) -Wl,-no_compact_unwind
2121
CFG_GCCISH_DEF_FLAG_armv7s-apple-ios := -Wl,-exported_symbols_list,
22-
CFG_GCCISH_PRE_LIB_FLAGS_armv7s-apple-ios :=
23-
CFG_GCCISH_POST_LIB_FLAGS_armv7s-apple-ios :=
24-
CFG_DEF_SUFFIX_armv7s-apple-ios := .darwin.def
2522
CFG_LLC_FLAGS_armv7s-apple-ios := -mattr=+vfp4,+v7,+neon
2623
CFG_INSTALL_NAME_armv7s-apple-ios = -Wl,-install_name,@rpath/$(1)
2724
CFG_EXE_SUFFIX_armv7s-apple-ios :=
2825
CFG_WINDOWSY_armv7s-apple-ios :=
2926
CFG_UNIXY_armv7s-apple-ios := 1
30-
CFG_PATH_MUNGE_armv7s-apple-ios := true
3127
CFG_LDPATH_armv7s-apple-ios :=
3228
CFG_RUN_armv7s-apple-ios = $(2)
3329
CFG_RUN_TARG_armv7s-apple-ios = $(call CFG_RUN_armv7s-apple-ios,,$(2))

mk/cfg/i386-apple-ios.mk

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,11 @@ CFG_GCCISH_CFLAGS_i386-apple-ios := -Wall -Werror -g -fPIC -m32 $(CFG_IOSSIM_FLA
1818
CFG_GCCISH_CXXFLAGS_i386-apple-ios := -fno-rtti $(CFG_IOSSIM_FLAGS_i386-apple-ios) -I$(CFG_IOSSIM_SDK_i386-apple-ios)/usr/include/c++/4.2.1
1919
CFG_GCCISH_LINK_FLAGS_i386-apple-ios := -lpthread -m32 -Wl,-no_compact_unwind -m32 -Wl,-syslibroot $(CFG_IOSSIM_SDK_i386-apple-ios)
2020
CFG_GCCISH_DEF_FLAG_i386-apple-ios := -Wl,-exported_symbols_list,
21-
CFG_GCCISH_PRE_LIB_FLAGS_i386-apple-ios :=
22-
CFG_GCCISH_POST_LIB_FLAGS_i386-apple-ios :=
23-
CFG_DEF_SUFFIX_i386-apple-ios := .darwin.def
2421
CFG_LLC_FLAGS_i386-apple-ios =
2522
CFG_INSTALL_NAME_i386-apple-ios = -Wl,-install_name,@rpath/$(1)
2623
CFG_EXE_SUFFIX_i386-apple-ios :=
2724
CFG_WINDOWSY_i386-apple-ios :=
2825
CFG_UNIXY_i386-apple-ios := 1
29-
CFG_PATH_MUNGE_i386-apple-ios = :true
3026
CFG_LDPATH_i386-apple-ios =
3127
CFG_RUN_i386-apple-ios = $(2)
3228
CFG_RUN_TARG_i386-apple-ios = $(call CFG_RUN_i386-apple-ios,,$(2))

0 commit comments

Comments
 (0)