diff options
author | Nick Kossifidis <mickflemm@gmail.com> | 2018-10-18 20:33:37 +0300 |
---|---|---|
committer | Nick Kossifidis <mickflemm@gmail.com> | 2018-10-18 20:33:37 +0300 |
commit | 6740c206f4b1babcb58000382262aad9d13cbdef (patch) | |
tree | b2c0a9b40681bea39ce9d8553c7a3e213fc5acc7 /Makefile.in | |
parent | 45f5db5a2dc167ef040c70143b94a806912f5771 (diff) | |
download | riscv-gnu-toolchain-6740c206f4b1babcb58000382262aad9d13cbdef.zip riscv-gnu-toolchain-6740c206f4b1babcb58000382262aad9d13cbdef.tar.gz riscv-gnu-toolchain-6740c206f4b1babcb58000382262aad9d13cbdef.tar.bz2 |
Add support for building a musl-based toolchain
Musl is great for embedded projects since it doesn't have any
external runtime dependencies on static builds (glibc needs
libnss for gethostbyname etc), and produces much smaller binaries.
It's also needed for supporting Alpine Linux (the most common distro
used for containers).
This patch expects the latest riscv-musl repository to be cloned
inside the source dir (e.g. as a submodule like the rest). Currently
only riscv64 is supported (no multilib).
Diffstat (limited to 'Makefile.in')
-rw-r--r-- | Makefile.in | 155 |
1 files changed, 150 insertions, 5 deletions
diff --git a/Makefile.in b/Makefile.in index ccf1c82..f4d771c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -53,6 +53,7 @@ endif make_tuple = riscv$(1)-unknown-$(2) LINUX_TUPLE ?= $(call make_tuple,$(XLEN),linux-gnu) NEWLIB_TUPLE ?= $(call make_tuple,$(XLEN),elf) +MUSL_TUPLE ?= $(call make_tuple,$(XLEN),linux-musl) CFLAGS_FOR_TARGET := $(CFLAGS_FOR_TARGET_EXTRA) @cmodel@ CXXFLAGS_FOR_TARGET := $(CXXFLAGS_FOR_TARGET_EXTRA) @cmodel@ @@ -62,20 +63,27 @@ BINUTILS_TARGET_FLAGS := --with-expat=yes $(BINUTILS_TARGET_FLAGS_EXTRA) BINUTILS_NATIVE_FLAGS := $(BINUTILS_NATIVE_FLAGS_EXTRA) GDB_TARGET_FLAGS := --with-expat=yes $(GDB_TARGET_FLAGS_EXTRA) GDB_NATIVE_FLAGS := $(GDB_NATIVE_FLAGS_EXTRA) + GLIBC_TARGET_FLAGS := $(GLIBC_TARGET_FLAGS_EXTRA) GLIBC_CC_FOR_TARGET ?= $(LINUX_TUPLE)-gcc GLIBC_CXX_FOR_TARGET ?= $(LINUX_TUPLE)-g++ GLIBC_TARGET_BOARDS ?= $(shell echo "$(GLIBC_MULTILIB_NAMES)" | sed 's!\([a-z0-9]*\)-\([a-z0-9]*\)!riscv-sim/-march=\1/-mabi=\2/@cmodel@!g') + NEWLIB_CC_FOR_TARGET ?= $(NEWLIB_TUPLE)-gcc NEWLIB_CXX_FOR_TARGET ?= $(NEWLIB_TUPLE)-g++ NEWLIB_TARGET_BOARDS ?= $(shell echo "$(NEWLIB_MULTILIB_NAMES)" | sed 's!\([a-z0-9]*\)-\([a-z0-9]*\)!riscv-sim/-march=\1/-mabi=\2/@cmodel@!g') NEWLIB_NANO_TARGET_BOARDS ?= $(shell echo "$(NEWLIB_MULTILIB_NAMES)" | sed 's!\([a-z0-9]*\)-\([a-z0-9]*\)!riscv-sim-nano/-march=\1/-mabi=\2/@cmodel@!g') +MUSL_TARGET_FLAGS := $(MUSL_TARGET_FLAGS_EXTRA) +MUSL_CC_FOR_TARGET ?= $(MUSL_TUPLE)-gcc +MUSL_CXX_FOR_TARGET ?= $(MUSL_TUPLE)-g++ + CONFIGURE_HOST = @configure_host@ all: @default_target@ newlib: stamps/build-gcc-newlib-stage2 linux: stamps/build-gcc-linux-stage2 +musl: stamps/build-gcc-musl-stage2 ifeq (@enable_gdb@,--enable-gdb) newlib: stamps/build-gdb-newlib linux: stamps/build-gdb-linux @@ -157,6 +165,17 @@ $(addprefix $(srcdir)/patches/,$(PACKAGES)): $(srcdir)/patches/%: src/% patches: $(addprefix $(srcdir)/patches/,$(PACKAGES)) + +stamps/build-linux-headers: + mkdir -p $(SYSROOT)/usr/ + cp -a $(srcdir)/linux-headers/include $(SYSROOT)/usr/ + mkdir -p $(dir $@) && touch $@ + + +# +# GLIBC +# + stamps/build-binutils-linux: $(srcdir)/riscv-binutils rm -rf $@ $(notdir $@) mkdir $(notdir $@) @@ -203,11 +222,6 @@ stamps/build-gdb-linux: $(srcdir)/riscv-gdb $(MAKE) -C $(notdir $@) install mkdir -p $(dir $@) && touch $@ -stamps/build-linux-headers: - mkdir -p $(SYSROOT)/usr/ - cp -a $(srcdir)/linux-headers/include $(SYSROOT)/usr/ - mkdir -p $(dir $@) && touch $@ - stamps/build-glibc-linux-headers: $(srcdir)/riscv-glibc stamps/build-gcc-linux-stage1 rm -rf $@ $(notdir $@) mkdir $(notdir $@) @@ -372,6 +386,10 @@ stamps/build-gcc-linux-native: $(srcdir)/riscv-gcc stamps/build-gcc-linux-stage2 cp -a $(INSTALL_DIR)/$(LINUX_TUPLE)/lib* $(SYSROOT) mkdir -p $(dir $@) && touch $@ +# +# NEWLIB +# + stamps/build-binutils-newlib: $(srcdir)/riscv-binutils rm -rf $@ $(notdir $@) mkdir $(notdir $@) @@ -535,6 +553,133 @@ stamps/build-gcc-newlib-stage2: $(srcdir)/riscv-gcc stamps/build-newlib \ $(MAKE) -C $(notdir $@) install mkdir -p $(dir $@) && touch $@ +# +# MUSL +# + +stamps/build-binutils-musl: $(srcdir)/riscv-binutils + rm -rf $@ $(notdir $@) + mkdir $(notdir $@) +# CC_FOR_TARGET is required for the ld testsuite. + cd $(notdir $@) && CC_FOR_TARGET=$(MUSL_CC_FOR_TARGET) $</configure \ + --target=$(MUSL_TUPLE) \ + $(CONFIGURE_HOST) \ + --prefix=$(INSTALL_DIR) \ + --with-sysroot=$(SYSROOT) \ + $(MULTILIB_FLAGS) \ + @with_guile@ \ + --disable-werror \ + --disable-nls \ + $(BINUTILS_TARGET_FLAGS) \ + --disable-gdb \ + --disable-sim \ + --disable-libdecnumber \ + --disable-libreadline + $(MAKE) -C $(notdir $@) + $(MAKE) -C $(notdir $@) install + mkdir -p $(dir $@) && touch $@ + +stamps/build-gcc-musl-stage1: $(srcdir)/riscv-gcc stamps/build-binutils-musl \ + stamps/build-linux-headers + if test -f $</contrib/download_prerequisites && test "@NEED_GCC_EXTERNAL_LIBRARIES@" == "true"; then cd $< && ./contrib/download_prerequisites; fi + rm -rf $@ $(notdir $@) + mkdir $(notdir $@) + cd $(notdir $@) && $</configure \ + --target=$(MUSL_TUPLE) \ + $(CONFIGURE_HOST) \ + --prefix=$(INSTALL_DIR) \ + --without-headers \ + --disable-shared \ + --disable-threads \ + @with_system_zlib@ \ + --enable-tls \ + --enable-languages=c \ + --disable-libatomic \ + --disable-libmudflap \ + --disable-libssp \ + --disable-libquadmath \ + --disable-libgomp \ + --disable-nls \ + --disable-bootstrap \ + --src=$(gccsrcdir) \ + $(GCC_CHECKING_FLAGS) \ + --disable-multilib \ + $(WITH_ABI) \ + $(WITH_ARCH) \ + CFLAGS_FOR_TARGET="-O2 $(CFLAGS_FOR_TARGET)" \ + CXXFLAGS_FOR_TARGET="-O2 $(CXXFLAGS_FOR_TARGET)" + $(MAKE) -C $(notdir $@) inhibit-libc=true all-gcc + $(MAKE) -C $(notdir $@) inhibit-libc=true install-gcc + $(MAKE) -C $(notdir $@) inhibit-libc=true all-target-libgcc + $(MAKE) -C $(notdir $@) inhibit-libc=true install-target-libgcc + mkdir -p $(dir $@) && touch $@ + +stamps/build-musl-linux-headers: $(srcdir)/riscv-musl stamps/build-gcc-musl-stage1 + rm -rf $@ $(notdir $@) + mkdir $(notdir $@) + cd $(notdir $@) && CC="$(MUSL_CC_FOR_TARGET)" $</configure \ + --host=$(MUSL_TUPLE) \ + --prefix=$(SYSROOT)/usr \ + --enable-shared \ + --with-headers=$(srcdir)/linux-headers/include \ + --disable-multilib \ + --enable-kernel=3.0.0 + $(MAKE) -C $(notdir $@) install-headers + mkdir -p $(dir $@) && touch $@ + +stamps/build-musl-linux-riscv64: $(srcdir)/riscv-musl stamps/build-gcc-musl-stage1 + rm -rf $@ $(notdir $@) + mkdir $(notdir $@) + cd $(notdir $@) && \ + CC="$(MUSL_CC_FOR_TARGET) $($@_CFLAGS)" \ + CXX="$(MUSL_CXX_FOR_TARGET) $($@_CFLAGS)" \ + CFLAGS="$(CFLAGS_FOR_TARGET) -g -O2 $($@_CFLAGS)" \ + CXXFLAGS="$(CXXFLAGS_FOR_TARGET) -g -O2 $($@_CFLAGS)" \ + ASFLAGS="$(ASFLAGS_FOR_TARGET) $($@_CFLAGS)" \ + $</configure \ + --host=riscv64-unknown-linux-musl \ + --prefix=$(SYSROOT)/usr \ + --disable-werror \ + --enable-shared \ + --with-headers=$(srcdir)/linux-headers/include \ + --enable-kernel=3.0.0 \ + $(MUSL_TARGET_FLAGS) + $(MAKE) -C $(notdir $@) + +flock $(SYSROOT)/.lock $(MAKE) -C $(notdir $@) install install_root=$(SYSROOT) + mkdir -p $(dir $@) && touch $@ + +stamps/build-gcc-musl-stage2: $(srcdir)/riscv-gcc stamps/build-musl-linux-riscv64 \ + stamps/build-musl-linux-headers + rm -rf $@ $(notdir $@) + mkdir $(notdir $@) + cd $(notdir $@) && $</configure \ + --target=$(MUSL_TUPLE) \ + $(CONFIGURE_HOST) \ + --prefix=$(INSTALL_DIR) \ + --with-sysroot=$(SYSROOT) \ + @with_system_zlib@ \ + --enable-shared \ + --enable-tls \ + --enable-languages=c,c++ \ + --disable-libmudflap \ + --disable-libssp \ + --disable-libquadmath \ + --disable-nls \ + --disable-bootstrap \ + --src=$(gccsrcdir) \ + $(GCC_CHECKING_FLAGS) \ + --disable-multilib \ + $(WITH_ABI) \ + $(WITH_ARCH) \ + CFLAGS_FOR_TARGET="-O2 $(CFLAGS_FOR_TARGET)" \ + CXXFLAGS_FOR_TARGET="-O2 $(CXXFLAGS_FOR_TARGET)" + $(MAKE) -C $(notdir $@) + $(MAKE) -C $(notdir $@) install + cp -a $(INSTALL_DIR)/$(MUSL_TUPLE)/lib* $(SYSROOT) + mkdir -p $(dir $@) && touch $@ + + + stamps/build-qemu: $(srcdir)/riscv-qemu rm -rf $@ $(notdir $@) mkdir $(notdir $@) |