aboutsummaryrefslogtreecommitdiff
path: root/Makefile.in
diff options
context:
space:
mode:
authorNick Kossifidis <mickflemm@gmail.com>2018-10-18 20:33:37 +0300
committerNick Kossifidis <mickflemm@gmail.com>2018-10-18 20:33:37 +0300
commit6740c206f4b1babcb58000382262aad9d13cbdef (patch)
treeb2c0a9b40681bea39ce9d8553c7a3e213fc5acc7 /Makefile.in
parent45f5db5a2dc167ef040c70143b94a806912f5771 (diff)
downloadriscv-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.in155
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 $@)