diff mbox

efivar: fix build with old gcc versions

Message ID 1466776037-12037-1-git-send-email-thomas.petazzoni@free-electrons.com
State Accepted
Headers show

Commit Message

Thomas Petazzoni June 24, 2016, 1:47 p.m. UTC
The efivar build process starts by building one tool for the host,
which is needed for the rest of the build. This tool currently fails
to build with old gcc versions because the gcc.specs used by efivar
specifies -std=gnu11. To address this, this patch:

 - passes 'gcc_flags=' to the host build, so that the custom gcc specs
   are not passed. They are in practice not needed for the build of
   the simple makeguids host utility.

 - passes -std=gnu99 instead of -std=c99 in the build of host
   makeguids, because the source code uses anonymous structs and
   unions, which requires std=gnu99 and not just std=c99

In addition, the build by default assumes that the target toolchain is
LTO capable, and that therefore you can call gcc-ar, gcc-nm and
gcc-ranlib. This fails short when the target toolchain is for example
gcc 4.7. To address this, we explicitly specify AR, NM and RANLIB to
be used, but pass them as make options instead of in the environment,
in order to override the values specified in the package Makefile.

Fixes:

   http://autobuild.buildroot.net/results/fe40c1d139ba8ddeef3dafd5c1818a946f014d7c/

Cc: Erico Nunes <nunes.erico@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 package/efivar/efivar.mk | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Erico Nunes June 24, 2016, 10:39 p.m. UTC | #1
Hello, Thomas.

Thank you for further investigating this.

On Fri, Jun 24, 2016 at 3:47 PM, Thomas Petazzoni
<thomas.petazzoni@free-electrons.com> wrote:
> diff --git a/package/efivar/efivar.mk b/package/efivar/efivar.mk
> index 3d37916..de48bc9 100644
> --- a/package/efivar/efivar.mk
> +++ b/package/efivar/efivar.mk
> @@ -31,10 +31,11 @@ define EFIVAR_BUILD_CMDS
>         # makeguids is an internal host tool and must be built separately with
>         # $(HOST_CC), otherwise it gets cross-built.
>         $(HOST_MAKE_ENV) $(HOST_CONFIGURE_OPTS) \
> -               CFLAGS="$(HOST_CFLAGS) -std=c99" \
> -               $(MAKE) -C $(@D)/src makeguids
> +               CFLAGS="$(HOST_CFLAGS) -std=gnu99" \
> +               $(MAKE) -C $(@D)/src gcc_cflags=  makeguids

I have tested the patch and it fixes the build break even in an
environment with host gcc 4.6.

I had prepared a patch adding depends on BR2_HOST_GCC_AT_LEAST_4_7 to
the efivar Config.in file as an alternative solution, but I think that
it would be needed to add BR2_TOOLCHAIN_GCC_AT_LEAST_4_7 as well.
Didn't finish testing that as I didn't have any target gcc 4.6
toolchain at hand.
The flags -std=gnu11 , -Wmaybe-uninitialized , -flto are only present
in gcc 4.7 and up and are also used by the target build. Buildroot
doesn't support building its own toolchains with target gcc 4.6
anymore but it's still possible to select it when using an external
toolchain. It would probably still break for that case.
If that is a problem that we don't care much now, then I can add my
Tested-by on this patch. To cover all cases, the patch to add the
'depends on' on both host and target gcc 4.7 would probably also fix
it.

Erico
Thomas Petazzoni June 25, 2016, 11:57 a.m. UTC | #2
Hello,

On Sat, 25 Jun 2016 00:39:07 +0200, Erico Nunes wrote:

> On Fri, Jun 24, 2016 at 3:47 PM, Thomas Petazzoni
> <thomas.petazzoni@free-electrons.com> wrote:
> > diff --git a/package/efivar/efivar.mk b/package/efivar/efivar.mk
> > index 3d37916..de48bc9 100644
> > --- a/package/efivar/efivar.mk
> > +++ b/package/efivar/efivar.mk
> > @@ -31,10 +31,11 @@ define EFIVAR_BUILD_CMDS
> >         # makeguids is an internal host tool and must be built separately with
> >         # $(HOST_CC), otherwise it gets cross-built.
> >         $(HOST_MAKE_ENV) $(HOST_CONFIGURE_OPTS) \
> > -               CFLAGS="$(HOST_CFLAGS) -std=c99" \
> > -               $(MAKE) -C $(@D)/src makeguids
> > +               CFLAGS="$(HOST_CFLAGS) -std=gnu99" \
> > +               $(MAKE) -C $(@D)/src gcc_cflags=  makeguids  
> 
> I have tested the patch and it fixes the build break even in an
> environment with host gcc 4.6.

Thanks for testing. I did test it successfully on my build server that
uses gcc 4.4 as the host gcc, so it's working with a host gcc even
older than 4.6.

> I had prepared a patch adding depends on BR2_HOST_GCC_AT_LEAST_4_7 to
> the efivar Config.in file as an alternative solution, but I think that
> it would be needed to add BR2_TOOLCHAIN_GCC_AT_LEAST_4_7 as well.
> Didn't finish testing that as I didn't have any target gcc 4.6
> toolchain at hand.
> The flags -std=gnu11 , -Wmaybe-uninitialized , -flto are only present
> in gcc 4.7 and up and are also used by the target build. Buildroot
> doesn't support building its own toolchains with target gcc 4.6
> anymore but it's still possible to select it when using an external
> toolchain. It would probably still break for that case.
> If that is a problem that we don't care much now, then I can add my
> Tested-by on this patch. To cover all cases, the patch to add the
> 'depends on' on both host and target gcc 4.7 would probably also fix
> it.

I agree that a dependency on >= 4.7 for the target gcc should also be
added. Can be done as a separate patch. Can you send such a patch?

Thanks,

Thomas
Thomas Petazzoni June 25, 2016, 1:30 p.m. UTC | #3
Hello,

On Fri, 24 Jun 2016 15:47:17 +0200, Thomas Petazzoni wrote:
> The efivar build process starts by building one tool for the host,
> which is needed for the rest of the build. This tool currently fails
> to build with old gcc versions because the gcc.specs used by efivar
> specifies -std=gnu11. To address this, this patch:
> 
>  - passes 'gcc_flags=' to the host build, so that the custom gcc specs
>    are not passed. They are in practice not needed for the build of
>    the simple makeguids host utility.
> 
>  - passes -std=gnu99 instead of -std=c99 in the build of host
>    makeguids, because the source code uses anonymous structs and
>    unions, which requires std=gnu99 and not just std=c99
> 
> In addition, the build by default assumes that the target toolchain is
> LTO capable, and that therefore you can call gcc-ar, gcc-nm and
> gcc-ranlib. This fails short when the target toolchain is for example
> gcc 4.7. To address this, we explicitly specify AR, NM and RANLIB to
> be used, but pass them as make options instead of in the environment,
> in order to override the values specified in the package Makefile.
> 
> Fixes:
> 
>    http://autobuild.buildroot.net/results/fe40c1d139ba8ddeef3dafd5c1818a946f014d7c/
> 
> Cc: Erico Nunes <nunes.erico@gmail.com>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
>  package/efivar/efivar.mk | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)

I've applied this patch, to avoid the numerous autobuilder failures.
Additional fixes can be made on top of it if needed.

Thanks,

Thomas
diff mbox

Patch

diff --git a/package/efivar/efivar.mk b/package/efivar/efivar.mk
index 3d37916..de48bc9 100644
--- a/package/efivar/efivar.mk
+++ b/package/efivar/efivar.mk
@@ -31,10 +31,11 @@  define EFIVAR_BUILD_CMDS
 	# makeguids is an internal host tool and must be built separately with
 	# $(HOST_CC), otherwise it gets cross-built.
 	$(HOST_MAKE_ENV) $(HOST_CONFIGURE_OPTS) \
-		CFLAGS="$(HOST_CFLAGS) -std=c99" \
-		$(MAKE) -C $(@D)/src makeguids
+		CFLAGS="$(HOST_CFLAGS) -std=gnu99" \
+		$(MAKE) -C $(@D)/src gcc_cflags=  makeguids
 
 	$(TARGET_MAKE_ENV) $(TARGET_CONFIGURE_OPTS) $(MAKE1) -C $(@D) \
+		AR=$(TARGET_AR) NM=$(TARGET_NM) RANLIB=$(TARGET_RANLIB) \
 		$(EFIVAR_MAKE_OPTS) \
 		all
 endef