From f06aece697aeab98f44c6ad0017e87e36c8ae764 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Wed, 2 Dec 2015 08:51:13 +0100 Subject: simplify toolchain building Buildroot uses the two-stage mechanism since a while. This reduces the build time a lot. Instead of three stages, we just use the two-stage build. The benefit is that the C library do not need to be rebuild and one gcc compile is obsolete. Tested with embedded-test.sh. There is one unresolved problem, tile toolchain building is broken. --- toolchain/gcc/Makefile | 104 ++++++++++------------ toolchain/gcc/patches/4.9.3/fix-m86k-libgcc.patch | 11 +++ toolchain/gcc/patches/4.9.3/fix-nios2.patch | 11 +++ toolchain/gcc/patches/4.9.3/stdlib-h.ia64 | 30 +++++++ 4 files changed, 97 insertions(+), 59 deletions(-) create mode 100644 toolchain/gcc/patches/4.9.3/fix-m86k-libgcc.patch create mode 100644 toolchain/gcc/patches/4.9.3/fix-nios2.patch create mode 100644 toolchain/gcc/patches/4.9.3/stdlib-h.ia64 (limited to 'toolchain/gcc') diff --git a/toolchain/gcc/Makefile b/toolchain/gcc/Makefile index c4c053bda..079ddd0e5 100644 --- a/toolchain/gcc/Makefile +++ b/toolchain/gcc/Makefile @@ -56,7 +56,6 @@ GCC_CONFOPTS:= --prefix=$(TOOLCHAIN_DIR)/usr \ --without-isl \ --disable-nls - ifeq ($(ADK_TARGET_WITH_NPTL),y) GCC_FINAL_CONFOPTS:= --enable-tls --enable-threads --enable-libatomic endif @@ -188,16 +187,15 @@ endif include ${ADK_TOPDIR}/mk/buildhlp.mk -GCC_BUILD_DIR_MINIMAL:= $(WRKBUILD)-minimal GCC_BUILD_DIR_INITIAL:= $(WRKBUILD)-initial GCC_BUILD_DIR_FINAL:= $(WRKBUILD)-final -$(GCC_BUILD_DIR_MINIMAL)/.configured: +$(GCC_BUILD_DIR_INITIAL)/.configured: ifeq ($(ADK_TARGET_ARCH_XTENSA),y) tar xf $(ADK_TOPDIR)/target/xtensa/overlay/xtensa_$(ADK_TARGET_XTENSA).tar \ --strip-components=1 -C $(WRKSRC) gcc endif - mkdir -p $(GCC_BUILD_DIR_MINIMAL) + mkdir -p $(GCC_BUILD_DIR_INITIAL) # these symlinks are very important, do not remove rm -rf $(TOOLCHAIN_DIR)/usr/$(GNU_TARGET_NAME)/sys-include mkdir -p $(TOOLCHAIN_DIR)/usr/$(GNU_TARGET_NAME) @@ -205,7 +203,7 @@ endif ln -s ../$(STAGING_HOST2TARGET)/usr/include sys-include) rm -rf ${TOOLCHAIN_DIR}/usr/$(GNU_TARGET_NAME)/lib (cd $(TOOLCHAIN_DIR)/usr/$(GNU_TARGET_NAME); \ - ln -s ../$(STAGING_HOST2TARGET)/lib lib) + ln -s ../$(STAGING_HOST2TARGET)/usr/lib lib) ifeq ($(ADK_TARGET_ARCH_SH),y) ifeq ($(ADK_CPU_SH3),y) (cd ${STAGING_TARGET_DIR}/ && ln -sf . m3) @@ -216,9 +214,13 @@ endif ifeq ($(ADK_CPU_SH4A),y) (cd ${STAGING_TARGET_DIR}/ && ln -sf . m4a) endif +endif +ifeq ($(ADK_TARGET_ARCH_ARC),y) + $(SED) 's/crtbeginS.o libgmon.a crtg.o/crtbeginS.o crtg.o/' \ + $(WRKBUILD)/libgcc/config.host endif $(SED) '/k prot/agcc_cv_libc_provides_ssp=yes' $(WRKBUILD)/gcc/configure - cd $(GCC_BUILD_DIR_MINIMAL); \ + cd $(GCC_BUILD_DIR_INITIAL); \ PATH='$(TARGET_PATH)' \ CC='$(HOST_CC)' \ CXX='$(HOST_CXX)' \ @@ -227,57 +229,47 @@ endif $(WRKBUILD)/configure \ ${GCC_CONFOPTS} \ --enable-languages=c \ - --disable-libssp \ + --with-newlib \ + --enable-tls \ --disable-shared \ --disable-threads \ --disable-multilib \ --without-headers touch $@ -$(GCC_BUILD_DIR_MINIMAL)/.compiled: $(GCC_BUILD_DIR_MINIMAL)/.configured - PATH='$(TARGET_PATH)' $(MAKE) ${GCC_MAKEOPTS} -C $(GCC_BUILD_DIR_MINIMAL) all-gcc - touch $@ - -$(WRKBUILD)/.headers: $(GCC_BUILD_DIR_MINIMAL)/.compiled - PATH='$(TARGET_PATH)' $(MAKE) -C $(GCC_BUILD_DIR_MINIMAL) install-gcc - touch $@ - -$(GCC_BUILD_DIR_INITIAL)/.configured: - mkdir -p $(GCC_BUILD_DIR_INITIAL) - cd $(GCC_BUILD_DIR_INITIAL); \ - PATH='$(TARGET_PATH)' \ - CC='$(HOST_CC)' \ - CXX='$(HOST_CXX)' \ - CFLAGS="-O0 -g0 -fomit-frame-pointer" \ - CXXFLAGS="-O0 -g0 -fomit-frame-pointer" \ - $(WRKBUILD)/configure \ - ${GCC_CONFOPTS} \ - ${GCC_FINAL_CONFOPTS} \ - --enable-languages=c \ - --disable-shared \ - --disable-threads \ - --with-sysroot=$(STAGING_TARGET_DIR) - touch $@ - -ifeq ($(ADK_TOOLCHAIN_GCC_4_2_4),y) $(GCC_BUILD_DIR_INITIAL)/.compiled: $(GCC_BUILD_DIR_INITIAL)/.configured - PATH='$(TARGET_PATH)' $(MAKE) ${GCC_MAKEOPTS} -C $(GCC_BUILD_DIR_INITIAL) all-gcc - touch $@ - -$(WRKBUILD)/.configured: $(GCC_BUILD_DIR_INITIAL)/.compiled - PATH='$(TARGET_PATH)' $(MAKE) -C $(GCC_BUILD_DIR_INITIAL) install-gcc - touch $@ +ifeq ($(ADK_TOOLCHAIN_GCC_OLD),y) + PATH='$(TARGET_PATH)' \ + $(MAKE) ${GCC_MAKEOPTS} -C $(GCC_BUILD_DIR_INITIAL) all-gcc else -$(GCC_BUILD_DIR_INITIAL)/.compiled: $(GCC_BUILD_DIR_INITIAL)/.configured - PATH='$(TARGET_PATH)' $(MAKE) ${GCC_MAKEOPTS} -C $(GCC_BUILD_DIR_INITIAL) all-gcc all-target-libgcc + PATH='$(TARGET_PATH)' \ + $(MAKE) ${GCC_MAKEOPTS} -C $(GCC_BUILD_DIR_INITIAL) all-gcc all-target-libgcc +endif touch $@ $(WRKBUILD)/.configured: $(GCC_BUILD_DIR_INITIAL)/.compiled - PATH='$(TARGET_PATH)' $(MAKE) -C $(GCC_BUILD_DIR_INITIAL) install-gcc install-target-libgcc - touch $@ +ifeq ($(ADK_TOOLCHAIN_GCC_OLD),y) + PATH='$(TARGET_PATH)' \ + $(MAKE) -C $(GCC_BUILD_DIR_INITIAL) install-gcc +else + PATH='$(TARGET_PATH)' \ + $(MAKE) -C $(GCC_BUILD_DIR_INITIAL) install-gcc install-target-libgcc +endif +ifeq ($(ADK_TARGET_ARCH_M68K),y) + # create gcc wrapper for uClinux/m68k + echo "#!/bin/sh" > $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc + echo "exec ${GNU_TARGET_NAME}-gcc \"\$$@\" -specs $(ADK_TOPDIR)/toolchain/gcc/m68k-uclinux-gcc.specs" >> $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc + chmod a+x $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc endif +ifeq ($(ADK_TARGET_ARCH_ARM),y) + # create gcc wrapper for uClinux/arm + echo "#!/bin/sh" > $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc + echo "exec ${GNU_TARGET_NAME}-gcc \"\$$@\" -specs $(ADK_TOPDIR)/toolchain/gcc/arm-uclinux-gcc.specs" >> $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc + chmod a+x $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc +endif + touch $@ -$(GCC_BUILD_DIR_FINAL)/.configured: +$(WRKBUILD)/.compiled: mkdir -p $(GCC_BUILD_DIR_FINAL) cd $(GCC_BUILD_DIR_FINAL); \ PATH='$(TARGET_PATH)' \ @@ -293,9 +285,6 @@ $(GCC_BUILD_DIR_FINAL)/.configured: --with-build-sysroot='$${prefix}/${STAGING_HOST2TARGET}' \ --with-sysroot='$${prefix}/${STAGING_HOST2TARGET}' PATH='$(TARGET_PATH)' $(MAKE) -C $(GCC_BUILD_DIR_FINAL) configure-host - touch $@ - -$(WRKBUILD)/.compiled: $(GCC_BUILD_DIR_FINAL)/.configured cd $(GCC_BUILD_DIR_FINAL); \ PATH='$(TARGET_PATH)' \ $(MAKE) ${GCC_MAKEOPTS} all @@ -327,20 +316,17 @@ endif cd $(STAGING_TARGET_DIR)/lib && \ ln -sf libstdc++.so.6.0.$(LIBSTDCXXVER) libstdc++.so && \ ln -sf libstdc++.so.6.0.$(LIBSTDCXXVER) libstdc++.so.6 + touch $@ + +$(WRKBUILD)/.final: # cleanup unneeded docs rm -rf $(TOOLCHAIN_DIR)/usr/share -ifeq ($(ADK_TARGET_ARCH_M68K),y) - # create gcc wrapper for uClinux/m68k - echo "#!/bin/sh" > $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc - echo "exec ${GNU_TARGET_NAME}-gcc \"\$$@\" -specs $(ADK_TOPDIR)/toolchain/gcc/m68k-uclinux-gcc.specs" >> $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc - chmod a+x $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc -endif -ifeq ($(ADK_TARGET_ARCH_ARM),y) - # create gcc wrapper for uClinux/arm - echo "#!/bin/sh" > $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc - echo "exec ${GNU_TARGET_NAME}-gcc \"\$$@\" -specs $(ADK_TOPDIR)/toolchain/gcc/arm-uclinux-gcc.specs" >> $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc - chmod a+x $(TOOLCHAIN_DIR)/usr/bin/adk-uclinux-gcc -endif + # cleanup unneeded libtool files + -find $(STAGING_TARGET_DIR) $(STAGING_HOST_DIR) -name \*.la -exec rm {} \; + # strip target libs and host tools for toolchain builds + PATH="$(TARGET_PATH)" debug='0' prefix='${TARGET_CROSS}' ${BASH} ${SCRIPT_DIR}/rstrip.sh \ + $(STAGING_TARGET_DIR) $(TOOLCHAIN_DIR)/usr/lib/gcc/$(GNU_TARGET_NAME) + debug='0' prefix=' ' ${BASH} ${SCRIPT_DIR}/rstrip.sh $(TOOLCHAIN_DIR)/usr/bin touch $@ include ${ADK_TOPDIR}/mk/toolchain.mk diff --git a/toolchain/gcc/patches/4.9.3/fix-m86k-libgcc.patch b/toolchain/gcc/patches/4.9.3/fix-m86k-libgcc.patch new file mode 100644 index 000000000..e8481d549 --- /dev/null +++ b/toolchain/gcc/patches/4.9.3/fix-m86k-libgcc.patch @@ -0,0 +1,11 @@ +diff -Nur gcc-4.9.3.orig/libgcc/config/m68k/linux-atomic.c gcc-4.9.3/libgcc/config/m68k/linux-atomic.c +--- gcc-4.9.3.orig/libgcc/config/m68k/linux-atomic.c 2014-01-02 23:25:22.000000000 +0100 ++++ gcc-4.9.3/libgcc/config/m68k/linux-atomic.c 2015-11-29 14:42:10.566143595 +0100 +@@ -33,7 +33,6 @@ + using the kernel helper defined below. There is no support for + 64-bit operations yet. */ + +-#include + #include + + #ifndef __NR_atomic_cmpxchg_32 diff --git a/toolchain/gcc/patches/4.9.3/fix-nios2.patch b/toolchain/gcc/patches/4.9.3/fix-nios2.patch new file mode 100644 index 000000000..8fe2589ce --- /dev/null +++ b/toolchain/gcc/patches/4.9.3/fix-nios2.patch @@ -0,0 +1,11 @@ +diff -Nur gcc-4.9.3.orig/libgcc/config/nios2/linux-atomic.c gcc-4.9.3/libgcc/config/nios2/linux-atomic.c +--- gcc-4.9.3.orig/libgcc/config/nios2/linux-atomic.c 2014-01-02 23:25:22.000000000 +0100 ++++ gcc-4.9.3/libgcc/config/nios2/linux-atomic.c 2015-12-01 22:50:00.029946306 +0100 +@@ -20,7 +20,6 @@ + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . */ + +-#include + #define EFAULT 14 + #define EBUSY 16 + #define ENOSYS 38 diff --git a/toolchain/gcc/patches/4.9.3/stdlib-h.ia64 b/toolchain/gcc/patches/4.9.3/stdlib-h.ia64 new file mode 100644 index 000000000..cdbbd6000 --- /dev/null +++ b/toolchain/gcc/patches/4.9.3/stdlib-h.ia64 @@ -0,0 +1,30 @@ +diff -Nur gcc-4.9.3.orig/libgcc/config/ia64/fde-glibc.c gcc-4.9.3/libgcc/config/ia64/fde-glibc.c +--- gcc-4.9.3.orig/libgcc/config/ia64/fde-glibc.c 2014-01-02 23:25:22.000000000 +0100 ++++ gcc-4.9.3/libgcc/config/ia64/fde-glibc.c 2015-12-01 07:06:43.963906167 +0100 +@@ -25,6 +25,8 @@ + /* Locate the FDE entry for a given address, using glibc ld.so routines + to avoid register/deregister calls at DSO load/unload. */ + ++#ifndef inhibit_libc ++ + #ifndef _GNU_SOURCE + #define _GNU_SOURCE 1 + #endif +@@ -159,3 +161,4 @@ + + return data.ret; + } ++#endif +diff -Nur gcc-4.9.3.orig/libgcc/unwind-generic.h gcc-4.9.3/libgcc/unwind-generic.h +--- gcc-4.9.3.orig/libgcc/unwind-generic.h 2014-01-02 23:25:22.000000000 +0100 ++++ gcc-4.9.3/libgcc/unwind-generic.h 2015-12-01 07:00:15.731287428 +0100 +@@ -221,7 +221,9 @@ + compatible with the standard ABI for IA-64, we inline these. */ + + #ifdef __ia64__ ++#ifndef inhibit_libc + #include ++#endif + + static inline _Unwind_Ptr + _Unwind_GetDataRelBase (struct _Unwind_Context *_C) -- cgit v1.2.3