Message ID | 1373551564-15418-1-git-send-email-thomas.petazzoni@free-electrons.com |
---|---|
State | Superseded |
Headers | show |
Hello, Could someone review/test/comment the below patch? Thanks, Thomas On Thu, 11 Jul 2013 16:06:04 +0200, Thomas Petazzoni wrote: > When NPTL support was introduced, gcc required a three stages build > process. Since gcc 4.7, this is no longer necessary, and it is > possible to get back to a two stages build process. This patch takes > advantage of this, by doing a two stages build process when possible. > > We introduce a few hidden kconfig options: > > * BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD, which is set by the gcc > Config.in logic to indicate that the compiler might need a three > stages build. Currently, all versions prior to 4.7.x are selecting > this kconfig option. > > * BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD, which indicates whether > the C library might need a three stages build. This is the case for > eglibc, and uClibc when NPTL is enabled. > > * BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD finally is enabled when both > of the previous options are enabled. It indicates that a three > stages build is actually needed. > > In addition to those options, the uClibc/gcc build logic is changed to > take use only a two stages build process when possible. > > Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> > --- > This stuff is fairly tricky, so if people could test, it would be > great. Also, I am not necessarily entirely happy with the new > Config.in options and their naming, so if people have suggestions, I'm > interested. > > package/eglibc/eglibc.mk | 5 +++-- > package/gcc/Config.in.host | 12 ++++++++++++ > package/gcc/gcc-initial/gcc-initial.mk | 8 ++++++++ > package/uclibc/Config.in | 1 + > package/uclibc/uclibc.mk | 5 +++-- > toolchain/Config.in | 9 +++++++++ > 6 files changed, 36 insertions(+), 4 deletions(-) > > diff --git a/package/eglibc/eglibc.mk b/package/eglibc/eglibc.mk > index ccdc210..8bac72f 100644 > --- a/package/eglibc/eglibc.mk > +++ b/package/eglibc/eglibc.mk > @@ -14,8 +14,9 @@ EGLIBC_LICENSE_FILES = libc/COPYING libc/COPYING.LIB libc/LICENSES > # cross-compiler and the kernel headers > EGLIBC_DEPENDENCIES = host-gcc-initial linux-headers host-gawk > > -# Before eglibc is built, we must have the second stage cross-compiler > -eglibc-build: host-gcc-intermediate > +# Before eglibc is built, we must have the second stage > +# cross-compiler, for some gcc versions > +eglibc-build: $(if $(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),host-gcc-intermediate) > > EGLIBC_SUBDIR = build > > diff --git a/package/gcc/Config.in.host b/package/gcc/Config.in.host > index 86f7fdc..e34f73e 100644 > --- a/package/gcc/Config.in.host > +++ b/package/gcc/Config.in.host > @@ -3,6 +3,12 @@ comment "GCC Options" > config BR2_GCC_NEEDS_MPC > bool > > +# Until gcc 4.7, a three stage build process was needed when using > +# NPTL. This hidden option tells whether gcc is a version that > +# requires this three stage build process. > +config BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD > + bool > + > choice > prompt "GCC compiler Version" > default BR2_GCC_VERSION_4_4_X if BR2_sparc_sparchfleon || BR2_sparc_sparchfleonv8 || BR2_sparc_sparcsfleon || BR2_sparc_sparcsfleonv8 > @@ -15,28 +21,34 @@ choice > config BR2_GCC_VERSION_4_4_7_ARC > depends on BR2_arc > bool "gcc 4.4.7-arc" > + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD > > config BR2_GCC_VERSION_4_2_2_AVR32_2_1_5 > depends on BR2_avr32 > bool "gcc 4.2.2-avr32-2.1.5" > + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD > > config BR2_GCC_VERSION_4_3_X > depends on !BR2_arc && !BR2_avr32 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_cortex_a5 && !BR2_cortex_a7 && !BR2_cortex_a8 && !BR2_cortex_a9 && !BR2_cortex_a15 && !BR2_x86_atom && !BR2_powerpc_e300c2 && !BR2_powerpc_e300c3 && !BR2_powerpc_e500mc && !BR2_powerpc_464 && !BR2_powerpc_464fp && !BR2_powerpc_476 && !BR2_powerpc_476fp && !BR2_fa526 && !BR2_pj4 > bool "gcc 4.3.x" > + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD > > config BR2_GCC_VERSION_4_4_X > depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a5 && !BR2_cortex_a7 && !BR2_cortex_a15 && !BR2_x86_atom && !BR2_powerpc_476 && !BR2_powerpc_476fp && !BR2_fa526 && !BR2_pj4 > bool "gcc 4.4.x" > + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD > > config BR2_GCC_VERSION_4_5_X > depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a7 && !BR2_cortex_a15 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_fa526 && !BR2_pj4 > select BR2_GCC_NEEDS_MPC > bool "gcc 4.5.x" > + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD > > config BR2_GCC_VERSION_4_6_X > depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a7 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_pj4 > select BR2_GCC_NEEDS_MPC > bool "gcc 4.6.x" > + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD > > config BR2_GCC_VERSION_4_7_X > depends on !BR2_arc && !BR2_avr32 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_pj4 > diff --git a/package/gcc/gcc-initial/gcc-initial.mk b/package/gcc/gcc-initial/gcc-initial.mk > index 05c956a..08c7028 100644 > --- a/package/gcc/gcc-initial/gcc-initial.mk > +++ b/package/gcc/gcc-initial/gcc-initial.mk > @@ -29,6 +29,7 @@ HOST_GCC_INITIAL_CONF_OPT = \ > --enable-languages=c \ > --disable-shared \ > --without-headers \ > + --disable-threads \ > --with-newlib \ > --disable-largefile \ > --disable-nls > @@ -36,4 +37,11 @@ HOST_GCC_INITIAL_CONF_OPT = \ > HOST_GCC_INITIAL_MAKE_OPT = all-gcc > HOST_GCC_INITIAL_INSTALL_OPT = install-gcc > > +ifeq ($(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),) > +ifeq ($(BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE),y) > +HOST_GCC_INITIAL_MAKE_OPT += all-target-libgcc > +HOST_GCC_INITIAL_INSTALL_OPT += install-target-libgcc > +endif > +endif > + > $(eval $(host-autotools-package)) > diff --git a/package/uclibc/Config.in b/package/uclibc/Config.in > index f309243..23f7ae0 100644 > --- a/package/uclibc/Config.in > +++ b/package/uclibc/Config.in > @@ -114,6 +114,7 @@ choice > config BR2_PTHREADS_NATIVE > bool "Native POSIX Threading (NPTL)" > select BR2_TOOLCHAIN_HAS_THREADS > + select BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD > depends on !BR2_ARM_OABI > depends on !BR2_x86_i386 > depends on !BR2_avr32 > diff --git a/package/uclibc/uclibc.mk b/package/uclibc/uclibc.mk > index 421e323..2dbf328 100644 > --- a/package/uclibc/uclibc.mk > +++ b/package/uclibc/uclibc.mk > @@ -22,8 +22,9 @@ UCLIBC_INSTALL_STAGING = YES > # cross-compiler and the kernel headers > UCLIBC_DEPENDENCIES = host-gcc-initial linux-headers > > -# Before uClibc is built, we must have the second stage cross-compiler > -uclibc-build: host-gcc-intermediate > +# Before uClibc is built, we must have the second stage > +# cross-compiler, for some gcc versions, and when NPTL is used. > +uclibc-build: $(if $(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),host-gcc-intermediate) > > # specifying UCLIBC_CONFIG_FILE on the command-line overrides the .config > # setting. > diff --git a/toolchain/Config.in b/toolchain/Config.in > index 53d2573..64cdf81 100644 > --- a/toolchain/Config.in > +++ b/toolchain/Config.in > @@ -1,5 +1,13 @@ > menu "Toolchain" > > +config BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD > + bool > + default y if BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD && \ > + BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD > + > +config BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD > + bool > + > # Should be selected for glibc or eglibc > config BR2_TOOLCHAIN_USES_GLIBC > bool > @@ -10,6 +18,7 @@ config BR2_TOOLCHAIN_USES_GLIBC > select BR2_TOOLCHAIN_HAS_THREADS > select BR2_TOOLCHAIN_HAS_THREADS_DEBUG > select BR2_TOOLCHAIN_HAS_SHADOW_PASSWORDS > + select BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD > > config BR2_TOOLCHAIN_USES_UCLIBC > bool
On Sat, Jul 27, 2013 at 3:20 PM, Thomas Petazzoni <thomas.petazzoni@free-electrons.com> wrote: > Hello, > > Could someone review/test/comment the below patch? This patch does not apply to master or next branch, i need to apply some other patches before to apply this patch? Applying: toolchain-internal: skip gcc-intermediate when possible error: patch failed: package/gcc/Config.in.host:15 error: package/gcc/Config.in.host: patch does not apply error: patch failed: package/gcc/gcc-initial/gcc-initial.mk:29 error: package/gcc/gcc-initial/gcc-initial.mk: patch does not apply error: patch failed: package/uclibc/Config.in:114 error: package/uclibc/Config.in: patch does not apply Patch failed at 0001 toolchain-internal: skip gcc-intermediate when possible Best regards Fabio Porcedda > Thanks, > > Thomas > > On Thu, 11 Jul 2013 16:06:04 +0200, Thomas Petazzoni wrote: >> When NPTL support was introduced, gcc required a three stages build >> process. Since gcc 4.7, this is no longer necessary, and it is >> possible to get back to a two stages build process. This patch takes >> advantage of this, by doing a two stages build process when possible. >> >> We introduce a few hidden kconfig options: >> >> * BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD, which is set by the gcc >> Config.in logic to indicate that the compiler might need a three >> stages build. Currently, all versions prior to 4.7.x are selecting >> this kconfig option. >> >> * BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD, which indicates whether >> the C library might need a three stages build. This is the case for >> eglibc, and uClibc when NPTL is enabled. >> >> * BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD finally is enabled when both >> of the previous options are enabled. It indicates that a three >> stages build is actually needed. >> >> In addition to those options, the uClibc/gcc build logic is changed to >> take use only a two stages build process when possible. >> >> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> >> --- >> This stuff is fairly tricky, so if people could test, it would be >> great. Also, I am not necessarily entirely happy with the new >> Config.in options and their naming, so if people have suggestions, I'm >> interested. >> >> package/eglibc/eglibc.mk | 5 +++-- >> package/gcc/Config.in.host | 12 ++++++++++++ >> package/gcc/gcc-initial/gcc-initial.mk | 8 ++++++++ >> package/uclibc/Config.in | 1 + >> package/uclibc/uclibc.mk | 5 +++-- >> toolchain/Config.in | 9 +++++++++ >> 6 files changed, 36 insertions(+), 4 deletions(-) >> >> diff --git a/package/eglibc/eglibc.mk b/package/eglibc/eglibc.mk >> index ccdc210..8bac72f 100644 >> --- a/package/eglibc/eglibc.mk >> +++ b/package/eglibc/eglibc.mk >> @@ -14,8 +14,9 @@ EGLIBC_LICENSE_FILES = libc/COPYING libc/COPYING.LIB libc/LICENSES >> # cross-compiler and the kernel headers >> EGLIBC_DEPENDENCIES = host-gcc-initial linux-headers host-gawk >> >> -# Before eglibc is built, we must have the second stage cross-compiler >> -eglibc-build: host-gcc-intermediate >> +# Before eglibc is built, we must have the second stage >> +# cross-compiler, for some gcc versions >> +eglibc-build: $(if $(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),host-gcc-intermediate) >> >> EGLIBC_SUBDIR = build >> >> diff --git a/package/gcc/Config.in.host b/package/gcc/Config.in.host >> index 86f7fdc..e34f73e 100644 >> --- a/package/gcc/Config.in.host >> +++ b/package/gcc/Config.in.host >> @@ -3,6 +3,12 @@ comment "GCC Options" >> config BR2_GCC_NEEDS_MPC >> bool >> >> +# Until gcc 4.7, a three stage build process was needed when using >> +# NPTL. This hidden option tells whether gcc is a version that >> +# requires this three stage build process. >> +config BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD >> + bool >> + >> choice >> prompt "GCC compiler Version" >> default BR2_GCC_VERSION_4_4_X if BR2_sparc_sparchfleon || BR2_sparc_sparchfleonv8 || BR2_sparc_sparcsfleon || BR2_sparc_sparcsfleonv8 >> @@ -15,28 +21,34 @@ choice >> config BR2_GCC_VERSION_4_4_7_ARC >> depends on BR2_arc >> bool "gcc 4.4.7-arc" >> + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD >> >> config BR2_GCC_VERSION_4_2_2_AVR32_2_1_5 >> depends on BR2_avr32 >> bool "gcc 4.2.2-avr32-2.1.5" >> + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD >> >> config BR2_GCC_VERSION_4_3_X >> depends on !BR2_arc && !BR2_avr32 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_cortex_a5 && !BR2_cortex_a7 && !BR2_cortex_a8 && !BR2_cortex_a9 && !BR2_cortex_a15 && !BR2_x86_atom && !BR2_powerpc_e300c2 && !BR2_powerpc_e300c3 && !BR2_powerpc_e500mc && !BR2_powerpc_464 && !BR2_powerpc_464fp && !BR2_powerpc_476 && !BR2_powerpc_476fp && !BR2_fa526 && !BR2_pj4 >> bool "gcc 4.3.x" >> + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD >> >> config BR2_GCC_VERSION_4_4_X >> depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a5 && !BR2_cortex_a7 && !BR2_cortex_a15 && !BR2_x86_atom && !BR2_powerpc_476 && !BR2_powerpc_476fp && !BR2_fa526 && !BR2_pj4 >> bool "gcc 4.4.x" >> + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD >> >> config BR2_GCC_VERSION_4_5_X >> depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a7 && !BR2_cortex_a15 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_fa526 && !BR2_pj4 >> select BR2_GCC_NEEDS_MPC >> bool "gcc 4.5.x" >> + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD >> >> config BR2_GCC_VERSION_4_6_X >> depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a7 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_pj4 >> select BR2_GCC_NEEDS_MPC >> bool "gcc 4.6.x" >> + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD >> >> config BR2_GCC_VERSION_4_7_X >> depends on !BR2_arc && !BR2_avr32 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_pj4 >> diff --git a/package/gcc/gcc-initial/gcc-initial.mk b/package/gcc/gcc-initial/gcc-initial.mk >> index 05c956a..08c7028 100644 >> --- a/package/gcc/gcc-initial/gcc-initial.mk >> +++ b/package/gcc/gcc-initial/gcc-initial.mk >> @@ -29,6 +29,7 @@ HOST_GCC_INITIAL_CONF_OPT = \ >> --enable-languages=c \ >> --disable-shared \ >> --without-headers \ >> + --disable-threads \ >> --with-newlib \ >> --disable-largefile \ >> --disable-nls >> @@ -36,4 +37,11 @@ HOST_GCC_INITIAL_CONF_OPT = \ >> HOST_GCC_INITIAL_MAKE_OPT = all-gcc >> HOST_GCC_INITIAL_INSTALL_OPT = install-gcc >> >> +ifeq ($(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),) >> +ifeq ($(BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE),y) >> +HOST_GCC_INITIAL_MAKE_OPT += all-target-libgcc >> +HOST_GCC_INITIAL_INSTALL_OPT += install-target-libgcc >> +endif >> +endif >> + >> $(eval $(host-autotools-package)) >> diff --git a/package/uclibc/Config.in b/package/uclibc/Config.in >> index f309243..23f7ae0 100644 >> --- a/package/uclibc/Config.in >> +++ b/package/uclibc/Config.in >> @@ -114,6 +114,7 @@ choice >> config BR2_PTHREADS_NATIVE >> bool "Native POSIX Threading (NPTL)" >> select BR2_TOOLCHAIN_HAS_THREADS >> + select BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD >> depends on !BR2_ARM_OABI >> depends on !BR2_x86_i386 >> depends on !BR2_avr32 >> diff --git a/package/uclibc/uclibc.mk b/package/uclibc/uclibc.mk >> index 421e323..2dbf328 100644 >> --- a/package/uclibc/uclibc.mk >> +++ b/package/uclibc/uclibc.mk >> @@ -22,8 +22,9 @@ UCLIBC_INSTALL_STAGING = YES >> # cross-compiler and the kernel headers >> UCLIBC_DEPENDENCIES = host-gcc-initial linux-headers >> >> -# Before uClibc is built, we must have the second stage cross-compiler >> -uclibc-build: host-gcc-intermediate >> +# Before uClibc is built, we must have the second stage >> +# cross-compiler, for some gcc versions, and when NPTL is used. >> +uclibc-build: $(if $(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),host-gcc-intermediate) >> >> # specifying UCLIBC_CONFIG_FILE on the command-line overrides the .config >> # setting. >> diff --git a/toolchain/Config.in b/toolchain/Config.in >> index 53d2573..64cdf81 100644 >> --- a/toolchain/Config.in >> +++ b/toolchain/Config.in >> @@ -1,5 +1,13 @@ >> menu "Toolchain" >> >> +config BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD >> + bool >> + default y if BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD && \ >> + BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD >> + >> +config BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD >> + bool >> + >> # Should be selected for glibc or eglibc >> config BR2_TOOLCHAIN_USES_GLIBC >> bool >> @@ -10,6 +18,7 @@ config BR2_TOOLCHAIN_USES_GLIBC >> select BR2_TOOLCHAIN_HAS_THREADS >> select BR2_TOOLCHAIN_HAS_THREADS_DEBUG >> select BR2_TOOLCHAIN_HAS_SHADOW_PASSWORDS >> + select BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD >> >> config BR2_TOOLCHAIN_USES_UCLIBC >> bool > > > > -- > Thomas Petazzoni, Free Electrons > Kernel, drivers, real-time and embedded Linux > development, consulting, training and support. > http://free-electrons.com > _______________________________________________ > buildroot mailing list > buildroot@busybox.net > http://lists.busybox.net/mailman/listinfo/buildroot
Dear Fabio Porcedda, On Thu, 22 Aug 2013 10:25:08 +0200, Fabio Porcedda wrote: > On Sat, Jul 27, 2013 at 3:20 PM, Thomas Petazzoni > <thomas.petazzoni@free-electrons.com> wrote: > > Hello, > > > > Could someone review/test/comment the below patch? > > This patch does not apply to master or next branch, i need to apply > some other patches before to apply this patch? No, it's just that other patches got merged since the patch was written, so it no longer applies. I need to rebase it on top of the next branch. Thanks! Thomas
diff --git a/package/eglibc/eglibc.mk b/package/eglibc/eglibc.mk index ccdc210..8bac72f 100644 --- a/package/eglibc/eglibc.mk +++ b/package/eglibc/eglibc.mk @@ -14,8 +14,9 @@ EGLIBC_LICENSE_FILES = libc/COPYING libc/COPYING.LIB libc/LICENSES # cross-compiler and the kernel headers EGLIBC_DEPENDENCIES = host-gcc-initial linux-headers host-gawk -# Before eglibc is built, we must have the second stage cross-compiler -eglibc-build: host-gcc-intermediate +# Before eglibc is built, we must have the second stage +# cross-compiler, for some gcc versions +eglibc-build: $(if $(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),host-gcc-intermediate) EGLIBC_SUBDIR = build diff --git a/package/gcc/Config.in.host b/package/gcc/Config.in.host index 86f7fdc..e34f73e 100644 --- a/package/gcc/Config.in.host +++ b/package/gcc/Config.in.host @@ -3,6 +3,12 @@ comment "GCC Options" config BR2_GCC_NEEDS_MPC bool +# Until gcc 4.7, a three stage build process was needed when using +# NPTL. This hidden option tells whether gcc is a version that +# requires this three stage build process. +config BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD + bool + choice prompt "GCC compiler Version" default BR2_GCC_VERSION_4_4_X if BR2_sparc_sparchfleon || BR2_sparc_sparchfleonv8 || BR2_sparc_sparcsfleon || BR2_sparc_sparcsfleonv8 @@ -15,28 +21,34 @@ choice config BR2_GCC_VERSION_4_4_7_ARC depends on BR2_arc bool "gcc 4.4.7-arc" + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD config BR2_GCC_VERSION_4_2_2_AVR32_2_1_5 depends on BR2_avr32 bool "gcc 4.2.2-avr32-2.1.5" + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD config BR2_GCC_VERSION_4_3_X depends on !BR2_arc && !BR2_avr32 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_cortex_a5 && !BR2_cortex_a7 && !BR2_cortex_a8 && !BR2_cortex_a9 && !BR2_cortex_a15 && !BR2_x86_atom && !BR2_powerpc_e300c2 && !BR2_powerpc_e300c3 && !BR2_powerpc_e500mc && !BR2_powerpc_464 && !BR2_powerpc_464fp && !BR2_powerpc_476 && !BR2_powerpc_476fp && !BR2_fa526 && !BR2_pj4 bool "gcc 4.3.x" + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD config BR2_GCC_VERSION_4_4_X depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a5 && !BR2_cortex_a7 && !BR2_cortex_a15 && !BR2_x86_atom && !BR2_powerpc_476 && !BR2_powerpc_476fp && !BR2_fa526 && !BR2_pj4 bool "gcc 4.4.x" + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD config BR2_GCC_VERSION_4_5_X depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a7 && !BR2_cortex_a15 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_fa526 && !BR2_pj4 select BR2_GCC_NEEDS_MPC bool "gcc 4.5.x" + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD config BR2_GCC_VERSION_4_6_X depends on !BR2_arc && !BR2_avr32 && !BR2_cortex_a7 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_pj4 select BR2_GCC_NEEDS_MPC bool "gcc 4.6.x" + select BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD config BR2_GCC_VERSION_4_7_X depends on !BR2_arc && !BR2_avr32 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_pj4 diff --git a/package/gcc/gcc-initial/gcc-initial.mk b/package/gcc/gcc-initial/gcc-initial.mk index 05c956a..08c7028 100644 --- a/package/gcc/gcc-initial/gcc-initial.mk +++ b/package/gcc/gcc-initial/gcc-initial.mk @@ -29,6 +29,7 @@ HOST_GCC_INITIAL_CONF_OPT = \ --enable-languages=c \ --disable-shared \ --without-headers \ + --disable-threads \ --with-newlib \ --disable-largefile \ --disable-nls @@ -36,4 +37,11 @@ HOST_GCC_INITIAL_CONF_OPT = \ HOST_GCC_INITIAL_MAKE_OPT = all-gcc HOST_GCC_INITIAL_INSTALL_OPT = install-gcc +ifeq ($(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),) +ifeq ($(BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE),y) +HOST_GCC_INITIAL_MAKE_OPT += all-target-libgcc +HOST_GCC_INITIAL_INSTALL_OPT += install-target-libgcc +endif +endif + $(eval $(host-autotools-package)) diff --git a/package/uclibc/Config.in b/package/uclibc/Config.in index f309243..23f7ae0 100644 --- a/package/uclibc/Config.in +++ b/package/uclibc/Config.in @@ -114,6 +114,7 @@ choice config BR2_PTHREADS_NATIVE bool "Native POSIX Threading (NPTL)" select BR2_TOOLCHAIN_HAS_THREADS + select BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD depends on !BR2_ARM_OABI depends on !BR2_x86_i386 depends on !BR2_avr32 diff --git a/package/uclibc/uclibc.mk b/package/uclibc/uclibc.mk index 421e323..2dbf328 100644 --- a/package/uclibc/uclibc.mk +++ b/package/uclibc/uclibc.mk @@ -22,8 +22,9 @@ UCLIBC_INSTALL_STAGING = YES # cross-compiler and the kernel headers UCLIBC_DEPENDENCIES = host-gcc-initial linux-headers -# Before uClibc is built, we must have the second stage cross-compiler -uclibc-build: host-gcc-intermediate +# Before uClibc is built, we must have the second stage +# cross-compiler, for some gcc versions, and when NPTL is used. +uclibc-build: $(if $(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),host-gcc-intermediate) # specifying UCLIBC_CONFIG_FILE on the command-line overrides the .config # setting. diff --git a/toolchain/Config.in b/toolchain/Config.in index 53d2573..64cdf81 100644 --- a/toolchain/Config.in +++ b/toolchain/Config.in @@ -1,5 +1,13 @@ menu "Toolchain" +config BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD + bool + default y if BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD && \ + BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD + +config BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD + bool + # Should be selected for glibc or eglibc config BR2_TOOLCHAIN_USES_GLIBC bool @@ -10,6 +18,7 @@ config BR2_TOOLCHAIN_USES_GLIBC select BR2_TOOLCHAIN_HAS_THREADS select BR2_TOOLCHAIN_HAS_THREADS_DEBUG select BR2_TOOLCHAIN_HAS_SHADOW_PASSWORDS + select BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD config BR2_TOOLCHAIN_USES_UCLIBC bool
When NPTL support was introduced, gcc required a three stages build process. Since gcc 4.7, this is no longer necessary, and it is possible to get back to a two stages build process. This patch takes advantage of this, by doing a two stages build process when possible. We introduce a few hidden kconfig options: * BR2_GCC_VERSION_NEEDS_THREE_STAGE_BUILD, which is set by the gcc Config.in logic to indicate that the compiler might need a three stages build. Currently, all versions prior to 4.7.x are selecting this kconfig option. * BR2_TOOLCHAIN_LIBC_NEEDS_THREE_STAGE_BUILD, which indicates whether the C library might need a three stages build. This is the case for eglibc, and uClibc when NPTL is enabled. * BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD finally is enabled when both of the previous options are enabled. It indicates that a three stages build is actually needed. In addition to those options, the uClibc/gcc build logic is changed to take use only a two stages build process when possible. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> --- This stuff is fairly tricky, so if people could test, it would be great. Also, I am not necessarily entirely happy with the new Config.in options and their naming, so if people have suggestions, I'm interested. package/eglibc/eglibc.mk | 5 +++-- package/gcc/Config.in.host | 12 ++++++++++++ package/gcc/gcc-initial/gcc-initial.mk | 8 ++++++++ package/uclibc/Config.in | 1 + package/uclibc/uclibc.mk | 5 +++-- toolchain/Config.in | 9 +++++++++ 6 files changed, 36 insertions(+), 4 deletions(-)