Message ID | 1466776037-12037-1-git-send-email-thomas.petazzoni@free-electrons.com |
---|---|
State | Accepted |
Headers | show |
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
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
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 --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
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(-)