mirror of
https://github.com/rust-lang/rust
synced 2024-10-06 08:40:35 +00:00
mk: Add support for musl-based builds
This commit adds support to the makefiles, configuration script, and build system to understand MUSL. This is broken up into a few parts: * Any target of the form `*-musl` requires the `--musl-root` option to `./configure` which will indicate the root of the MUSL installation. It is also expected that there is a libunwind build inside of that installation built against that MUSL. * Objects from MUSL are copied into the build tree for Rust to be statically linked into the appropriate Rust library. * Objects for binary startup and shutdown are included in each Rust installation by default for MUSL. This requires MUSL to only be installed on the machine compiling rust. Only a linker will be necessary for compiling against MUSL on a target machine. Eventually a MUSL and/or libunwind build may be integrated by default into the build but for now they are just always assumed to exist externally.
This commit is contained in:
parent
ba2380d7b3
commit
cd980b3bee
8
configure
vendored
8
configure
vendored
|
@ -583,6 +583,7 @@ valopt jemalloc-root "" "set directory where libjemalloc_pic.a is located"
|
||||||
valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
|
valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
|
||||||
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
|
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
|
||||||
valopt release-channel "dev" "the name of the release channel to build"
|
valopt release-channel "dev" "the name of the release channel to build"
|
||||||
|
valopt musl-root "/usr/local" "MUSL root installation directory"
|
||||||
|
|
||||||
# Many of these are saved below during the "writing configuration" step
|
# Many of these are saved below during the "writing configuration" step
|
||||||
# (others are conditionally saved).
|
# (others are conditionally saved).
|
||||||
|
@ -1058,6 +1059,13 @@ do
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|
||||||
|
*-musl)
|
||||||
|
if [ ! -f $CFG_MUSL_ROOT/lib/libc.a ]
|
||||||
|
then
|
||||||
|
err "musl libc $CFG_MUSL_ROOT/lib/libc.a not found"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
27
mk/cfg/x86_64-unknown-linux-musl.mk
Normal file
27
mk/cfg/x86_64-unknown-linux-musl.mk
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# x86_64-unknown-linux-musl configuration
|
||||||
|
CC_x86_64-unknown-linux-musl=$(CFG_MUSL_ROOT)/bin/musl-gcc
|
||||||
|
CXX_x86_64-unknown-linux-musl=notaprogram
|
||||||
|
CPP_x86_64-unknown-linux-musl=$(CFG_MUSL_ROOT)/bin/musl-gcc -E
|
||||||
|
AR_x86_64-unknown-linux-musl=$(AR)
|
||||||
|
CFG_LIB_NAME_x86_64-unknown-linux-musl=lib$(1).so
|
||||||
|
CFG_STATIC_LIB_NAME_x86_64-unknown-linux-musl=lib$(1).a
|
||||||
|
CFG_LIB_GLOB_x86_64-unknown-linux-musl=lib$(1)-*.so
|
||||||
|
CFG_JEMALLOC_CFLAGS_x86_64-unknown-linux-musl := -m64
|
||||||
|
CFG_GCCISH_CFLAGS_x86_64-unknown-linux-musl := -Wall -Werror -g -fPIC -m64
|
||||||
|
CFG_GCCISH_CXXFLAGS_x86_64-unknown-linux-musl :=
|
||||||
|
CFG_GCCISH_LINK_FLAGS_x86_64-unknown-linux-musl :=
|
||||||
|
CFG_GCCISH_DEF_FLAG_x86_64-unknown-linux-musl :=
|
||||||
|
CFG_LLC_FLAGS_x86_64-unknown-linux-musl :=
|
||||||
|
CFG_INSTALL_NAME_x86_64-unknown-linux-musl =
|
||||||
|
CFG_EXE_SUFFIX_x86_64-unknown-linux-musl =
|
||||||
|
CFG_WINDOWSY_x86_64-unknown-linux-musl :=
|
||||||
|
CFG_UNIXY_x86_64-unknown-linux-musl := 1
|
||||||
|
CFG_LDPATH_x86_64-unknown-linux-musl :=
|
||||||
|
CFG_RUN_x86_64-unknown-linux-musl=$(2)
|
||||||
|
CFG_RUN_TARG_x86_64-unknown-linux-musl=$(call CFG_RUN_x86_64-unknown-linux-musl,,$(2))
|
||||||
|
CFG_GNU_TRIPLE_x86_64-unknown-linux-musl := x86_64-unknown-linux-musl
|
||||||
|
|
||||||
|
NATIVE_DEPS_libc_T_x86_64-unknown-linux-musl += libc.a
|
||||||
|
NATIVE_DEPS_std_T_x86_64-unknown-linux-musl += libunwind.a \
|
||||||
|
crt1.o crti.o crtn.o
|
||||||
|
INSTALLED_OBJECTS_x86_64-unknown-linux-musl += crt1.o crti.o crtn.o
|
|
@ -123,6 +123,9 @@ ONLY_RLIB_rustc_bitflags := 1
|
||||||
# Documented-by-default crates
|
# Documented-by-default crates
|
||||||
DOC_CRATES := std alloc collections core libc rustc_unicode
|
DOC_CRATES := std alloc collections core libc rustc_unicode
|
||||||
|
|
||||||
|
# Installed objects/libraries by default
|
||||||
|
INSTALLED_OBJECTS := libmorestack.a libcompiler-rt.a
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# You should not need to edit below this line
|
# You should not need to edit below this line
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
|
@ -399,8 +399,10 @@ endif
|
||||||
# Prerequisites for using the stageN compiler to build target artifacts
|
# Prerequisites for using the stageN compiler to build target artifacts
|
||||||
TSREQ$(1)_T_$(2)_H_$(3) = \
|
TSREQ$(1)_T_$(2)_H_$(3) = \
|
||||||
$$(HSREQ$(1)_H_$(3)) \
|
$$(HSREQ$(1)_H_$(3)) \
|
||||||
$$(TLIB$(1)_T_$(2)_H_$(3))/libmorestack.a \
|
$$(foreach obj,$$(INSTALLED_OBJECTS),\
|
||||||
$$(TLIB$(1)_T_$(2)_H_$(3))/libcompiler-rt.a
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$$(obj)) \
|
||||||
|
$$(foreach obj,$$(INSTALLED_OBJECTS_$(2)),\
|
||||||
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$$(obj))
|
||||||
|
|
||||||
# Prerequisites for a working stageN compiler and libraries, for a specific
|
# Prerequisites for a working stageN compiler and libraries, for a specific
|
||||||
# target
|
# target
|
||||||
|
|
|
@ -140,8 +140,8 @@ prepare-target-$(2)-host-$(3)-$(1)-$(4): prepare-maybe-clean-$(4) \
|
||||||
$$(if $$(findstring $(2),$$(CFG_HOST)), \
|
$$(if $$(findstring $(2),$$(CFG_HOST)), \
|
||||||
$$(foreach crate,$$(HOST_CRATES), \
|
$$(foreach crate,$$(HOST_CRATES), \
|
||||||
$$(call PREPARE_LIB,$$(call CFG_LIB_GLOB_$(2),$$(crate)))),) \
|
$$(call PREPARE_LIB,$$(call CFG_LIB_GLOB_$(2),$$(crate)))),) \
|
||||||
$$(call PREPARE_LIB,libmorestack.a) \
|
$$(foreach object,$$(INSTALLED_OBJECTS) $$(INSTALLED_OBJECTS_$(2)),\
|
||||||
$$(call PREPARE_LIB,libcompiler-rt.a),),),)
|
$$(call PREPARE_LIB,$$(object))),),),)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define INSTALL_GDB_DEBUGGER_SCRIPTS_COMMANDS
|
define INSTALL_GDB_DEBUGGER_SCRIPTS_COMMANDS
|
||||||
|
|
21
mk/rt.mk
21
mk/rt.mk
|
@ -74,7 +74,8 @@ $$(RT_OUTPUT_DIR_$(1))/%.o: $(S)src/rt/%.ll $$(MKFILE_DEPS) \
|
||||||
@mkdir -p $$(@D)
|
@mkdir -p $$(@D)
|
||||||
@$$(call E, compile: $$@)
|
@$$(call E, compile: $$@)
|
||||||
$$(Q)$$(LLC_$$(CFG_BUILD)) $$(CFG_LLC_FLAGS_$(1)) \
|
$$(Q)$$(LLC_$$(CFG_BUILD)) $$(CFG_LLC_FLAGS_$(1)) \
|
||||||
-filetype=obj -mtriple=$$(CFG_LLVM_TARGET_$(1)) -relocation-model=pic -o $$@ $$<
|
-filetype=obj -mtriple=$$(CFG_LLVM_TARGET_$(1)) \
|
||||||
|
-relocation-model=pic -o $$@ $$<
|
||||||
|
|
||||||
$$(RT_OUTPUT_DIR_$(1))/%.o: $(S)src/rt/%.c $$(MKFILE_DEPS)
|
$$(RT_OUTPUT_DIR_$(1))/%.o: $(S)src/rt/%.c $$(MKFILE_DEPS)
|
||||||
@mkdir -p $$(@D)
|
@mkdir -p $$(@D)
|
||||||
|
@ -110,6 +111,11 @@ $$(RT_OUTPUT_DIR_$(1))/$$(NATIVE_$(2)_$(1)): $$(OBJS_$(2)_$(1))
|
||||||
@$$(call E, link: $$@)
|
@$$(call E, link: $$@)
|
||||||
$$(Q)$$(AR_$(1)) rcs $$@ $$^
|
$$(Q)$$(AR_$(1)) rcs $$@ $$^
|
||||||
|
|
||||||
|
ifeq ($$(findstring windows,$(1)),windows)
|
||||||
|
$$(RT_OUTPUT_DIR_$(1))/lib$(2).a: $$(RT_OUTPUT_DIR_$(1))/$$(NATIVE_$(2)_$(1))
|
||||||
|
$$(Q)cp $$< $$^
|
||||||
|
endif
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(foreach target,$(CFG_TARGET), \
|
$(foreach target,$(CFG_TARGET), \
|
||||||
|
@ -312,6 +318,19 @@ endif # endif for windowsy
|
||||||
endif # endif for ios
|
endif # endif for ios
|
||||||
endif # endif for darwin
|
endif # endif for darwin
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# libc/libunwind for musl
|
||||||
|
#
|
||||||
|
# When we're building a musl-like target we're going to link libc/libunwind
|
||||||
|
# statically into the standard library and liblibc, so we need to make sure
|
||||||
|
# they're in a location that we can find
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
ifeq ($$(findstring musl,$(1)),musl)
|
||||||
|
$$(RT_OUTPUT_DIR_$(1))/%: $$(CFG_MUSL_ROOT)/lib/%
|
||||||
|
cp $$^ $$@
|
||||||
|
endif
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# Instantiate template for all stages/targets
|
# Instantiate template for all stages/targets
|
||||||
|
|
13
mk/target.mk
13
mk/target.mk
|
@ -35,7 +35,9 @@ CRATE_FULLDEPS_$(1)_T_$(2)_H_$(3)_$(4) := \
|
||||||
$$(foreach dep,$$(RUST_DEPS_$(4)), \
|
$$(foreach dep,$$(RUST_DEPS_$(4)), \
|
||||||
$$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep)) \
|
$$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep)) \
|
||||||
$$(foreach dep,$$(NATIVE_DEPS_$(4)), \
|
$$(foreach dep,$$(NATIVE_DEPS_$(4)), \
|
||||||
$$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),$$(dep)))
|
$$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),$$(dep))) \
|
||||||
|
$$(foreach dep,$$(NATIVE_DEPS_$(4)_T_$(2)), \
|
||||||
|
$$(RT_OUTPUT_DIR_$(2))/$$(dep))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(foreach host,$(CFG_HOST), \
|
$(foreach host,$(CFG_HOST), \
|
||||||
|
@ -143,14 +145,7 @@ $$(TBIN$(1)_T_$(2)_H_$(3))/:
|
||||||
$$(TLIB$(1)_T_$(2)_H_$(3))/:
|
$$(TLIB$(1)_T_$(2)_H_$(3))/:
|
||||||
mkdir -p $$@
|
mkdir -p $$@
|
||||||
|
|
||||||
$$(TLIB$(1)_T_$(2)_H_$(3))/libcompiler-rt.a: \
|
$$(TLIB$(1)_T_$(2)_H_$(3))/%: $$(RT_OUTPUT_DIR_$(2))/% \
|
||||||
$$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),compiler-rt) \
|
|
||||||
| $$(TLIB$(1)_T_$(2)_H_$(3))/ $$(SNAPSHOT_RUSTC_POST_CLEANUP)
|
|
||||||
@$$(call E, cp: $$@)
|
|
||||||
$$(Q)cp $$< $$@
|
|
||||||
|
|
||||||
$$(TLIB$(1)_T_$(2)_H_$(3))/libmorestack.a: \
|
|
||||||
$$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),morestack) \
|
|
||||||
| $$(TLIB$(1)_T_$(2)_H_$(3))/ $$(SNAPSHOT_RUSTC_POST_CLEANUP)
|
| $$(TLIB$(1)_T_$(2)_H_$(3))/ $$(SNAPSHOT_RUSTC_POST_CLEANUP)
|
||||||
@$$(call E, cp: $$@)
|
@$$(call E, cp: $$@)
|
||||||
$$(Q)cp $$< $$@
|
$$(Q)cp $$< $$@
|
||||||
|
|
Loading…
Reference in a new issue