From patchwork Thu Jul 11 14:06:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Petazzoni X-Patchwork-Id: 258467 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from whitealder.osuosl.org (whitealder.osuosl.org [140.211.166.138]) by ozlabs.org (Postfix) with ESMTP id D2E8B2C030C for ; Fri, 12 Jul 2013 00:06:25 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 56D1181DE4; Thu, 11 Jul 2013 14:06:23 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 9U3G70fdrU1t; Thu, 11 Jul 2013 14:06:20 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by whitealder.osuosl.org (Postfix) with ESMTP id DAC9B82809; Thu, 11 Jul 2013 14:06:19 +0000 (UTC) X-Original-To: buildroot@lists.busybox.net Delivered-To: buildroot@osuosl.org Received: from fraxinus.osuosl.org (fraxinus.osuosl.org [140.211.166.137]) by ash.osuosl.org (Postfix) with ESMTP id 9E1831BFA68 for ; Thu, 11 Jul 2013 14:06:19 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id CD3B78BD98 for ; Thu, 11 Jul 2013 14:06:17 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2PaAp8aQuL4C for ; Thu, 11 Jul 2013 14:06:16 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail.free-electrons.com (mail.free-electrons.com [94.23.35.102]) by fraxinus.osuosl.org (Postfix) with ESMTP id 591D18B95B for ; Thu, 11 Jul 2013 14:06:16 +0000 (UTC) Received: by mail.free-electrons.com (Postfix, from userid 106) id 80155811; Thu, 11 Jul 2013 16:06:14 +0200 (CEST) Received: from localhost (unknown [193.120.41.118]) by mail.free-electrons.com (Postfix) with ESMTPSA id 78D537D7 for ; Thu, 11 Jul 2013 16:06:03 +0200 (CEST) From: Thomas Petazzoni To: buildroot@uclibc.org Date: Thu, 11 Jul 2013 16:06:04 +0200 Message-Id: <1373551564-15418-1-git-send-email-thomas.petazzoni@free-electrons.com> X-Mailer: git-send-email 1.8.1.2 Subject: [Buildroot] [PATCH] toolchain-internal: skip gcc-intermediate when possible X-BeenThere: buildroot@busybox.net X-Mailman-Version: 2.1.14 Precedence: list List-Id: Discussion and development of buildroot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: buildroot-bounces@busybox.net Sender: buildroot-bounces@busybox.net 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 --- 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