Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH] toolchain-internal: skip gcc-intermediate when possible
Date: Sat, 27 Jul 2013 15:20:54 +0200	[thread overview]
Message-ID: <20130727152054.5d189986@skate> (raw)
In-Reply-To: <1373551564-15418-1-git-send-email-thomas.petazzoni@free-electrons.com>

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



-- 
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

  reply	other threads:[~2013-07-27 13:20 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-11 14:06 [Buildroot] [PATCH] toolchain-internal: skip gcc-intermediate when possible Thomas Petazzoni
2013-07-27 13:20 ` Thomas Petazzoni [this message]
2013-08-22  8:25   ` Fabio Porcedda
2013-08-23  4:58     ` Thomas Petazzoni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130727152054.5d189986@skate \
    --to=thomas.petazzoni@free-electrons.com \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox