All of 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.