Commit 2babed4a authored by Thomas Petazzoni's avatar Thomas Petazzoni Committed by Peter Korsgaard
Browse files

toolchain-internal: skip gcc-intermediate when possible



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
use only a two stages build process when possible.

Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: default avatarPeter Korsgaard <jacmet@sunsite.dk>
parent a8164107
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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

+11 −0
Original line number Diff line number Diff line
@@ -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
@@ -16,11 +22,13 @@ choice
	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
		depends on !BR2_ARM_EABIHF
		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
@@ -29,6 +37,7 @@ choice
		depends on !BR2_ARM_EABIHF
		# VFPv4 support appeared in gcc 4.5
		depends on !BR2_ARM_FPU_VFPV4 && !BR2_ARM_FPU_VFPV4D16
		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
@@ -36,11 +45,13 @@ choice
		# ARM EABIhf support appeared in gcc 4.6
		depends on !BR2_ARM_EABIHF
		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_bfin && !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_bfin && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_pj4
+8 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ HOST_GCC_INITIAL_CONF_OPT = \
	--enable-languages=c \
	--disable-shared \
	--without-headers \
	--disable-threads \
	--with-newlib \
	--disable-largefile \
	--disable-nls \
@@ -40,4 +41,11 @@ HOST_GCC_INITIAL_CONF_ENV = \
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))
+1 −0
Original line number Diff line number Diff line
@@ -115,6 +115,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_arc
		depends on !BR2_avr32
		depends on !BR2_bfin
+3 −2
Original line number Diff line number Diff line
@@ -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.
Loading