[OE-core] [RFC][PATCH] cmake-native: work around gcc6's '-isystem'-allergy

André Draszik git at andred.net
Fri Sep 2 08:31:48 UTC 2016


On Do, 2016-09-01 at 21:51 +0100, Jack Mitchell wrote:
> On 31/08/16 11:15, Andreas Müller wrote:
> > 
> > On Wed, Aug 31, 2016 at 11:25 AM, Jack Mitchell <ml at embed.me.uk> wrote:
> > > 
> > > On 30/08/16 18:14, Andreas Müller wrote:
> > > > 
> > > > since gcc6 we see many cmake/c++ based packets failing with:
> > > > 
> > > > > 
> > > > > fatal error: stdlib.h: No such file or directory
> > > > 
> > > > a fix from gcc is not to expect [1] so work around by replacing '-
> > > > isystem'
> > > > by
> > > > '-I' for c++.
> > > > 
> > > > Build tested with many recipes in meta-qt5-extra / meta-oe
> > > > inheriting
> > > > cmake.
> > > > 
> > > > [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70129
> > > > 
> > > > Signed-off-by: Andreas Müller <schnitzeltony at googlemail.com>
> > > > ---
> > > >   meta/recipes-devtools/cmake/cmake-native_3.6.1.bb  |  1 +
> > > >   .../0001-GNU.cmake-replace-isystem-by-I.patch      | 42
> > > > ++++++++++++++++++++++
> > > >   2 files changed, 43 insertions(+)
> > > >   create mode 100644
> > > > meta/recipes-devtools/cmake/cmake/0001-GNU.cmake-replace-isystem-by-
> > > > I.patch
> > > > 
> > > > diff --git a/meta/recipes-devtools/cmake/cmake-native_3.6.1.bb
> > > > b/meta/recipes-devtools/cmake/cmake-native_3.6.1.bb
> > > > index 33930fb..900091e 100644
> > > > --- a/meta/recipes-devtools/cmake/cmake-native_3.6.1.bb
> > > > +++ b/meta/recipes-devtools/cmake/cmake-native_3.6.1.bb
> > > > @@ -6,6 +6,7 @@ DEPENDS += "bzip2-native zlib-native"
> > > > 
> > > >   SRC_URI += "\
> > > >       file://cmlibarchive-disable-ext2fs.patch \
> > > > +    file://0001-GNU.cmake-replace-isystem-by-I.patch \
> > > >   "
> > > > 
> > > >   # Disable ccmake since we don't depend on ncurses
> > > > diff --git
> > > > a/meta/recipes-devtools/cmake/cmake/0001-GNU.cmake-replace-isystem-
> > > > by-I.patch
> > > > b/meta/recipes-devtools/cmake/cmake/0001-GNU.cmake-replace-isystem-
> > > > by-I.patch
> > > > new file mode 100644
> > > > index 0000000..4c06490
> > > > --- /dev/null
> > > > +++
> > > > b/meta/recipes-devtools/cmake/cmake/0001-GNU.cmake-replace-isystem-
> > > > by-I.patch
> > > > @@ -0,0 +1,42 @@
> > > > +From a84d20abe6bc68f8d1a597a22af1ca98d62a5ce4 Mon Sep 17 00:00:00
> > > > 2001
> > > > +From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony at googlemail.c
> > > > om>
> > > > +Date: Fri, 26 Aug 2016 12:14:12 +0200
> > > > +Subject: [PATCH] GNU.cmake: replace -isystem by -I
> > > > +MIME-Version: 1.0
> > > > +Content-Type: text/plain; charset=UTF-8
> > > > +Content-Transfer-Encoding: 8bit
> > > > +
> > > > +since gcc6 we see many c++ based packes failing with:
> > > > +
> > > > +| fatal error: stdlib.h: No such file or directory
> > > > +
> > > > +a fix from gcc is not to expect [1] so work around
> > > > +
> > > > +[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70129
> > > > +
> > > > +Upstream-Status: Pending
> > > > +
> > > > +Signed-off-by: Andreas Müller <schnitzeltony at googlemail.com>
> > > > +---
> > > > + Modules/Compiler/GNU.cmake | 6 +++++-
> > > > + 1 file changed, 5 insertions(+), 1 deletion(-)
> > > > +
> > > > +diff --git a/Modules/Compiler/GNU.cmake
> > > > b/Modules/Compiler/GNU.cmake
> > > > +index c2d393d..9d1477d 100644
> > > > +--- a/Modules/Compiler/GNU.cmake
> > > > ++++ b/Modules/Compiler/GNU.cmake
> > > > +@@ -53,6 +53,10 @@ macro(__compiler_gnu lang)
> > > > +   set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE
> > > > "<CMAKE_${lang}_COMPILER>
> > > > <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
> > > > +   set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE
> > > > "<CMAKE_${lang}_COMPILER>
> > > > <DEFINES> <INCLUDES> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
> > > > +   if(NOT APPLE OR NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS
> > > > 4) #
> > > > work around #4462
> > > > +-    set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-isystem ")
> > > > ++    if("${lang}" STREQUAL "CXX")
> > > > ++      set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-I ")
> > > > ++    else()
> > > > ++      set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-isystem ")
> > > > ++    endif()
> > > > +   endif()
> > > > + endmacro()
> > > > +--
> > > > +2.5.5
> > > > +
> > > > 
> > > Thanks for the patch Andreas, this fixes my build for now but as you
> > > mentioned is a bit of a hack to get round the issue. As this fixes my
> > > problem does it mean that it's not bitbake which is injecting the
> > > isystem,
> > > but instead a CMake recipe somewhere?
> > > 
> > > Regards,
> > > Jack.
> > > --
> > I don't know your recipe but I think -isystem in bitbake.conf would
> > only cause trouble for native recipes.
> > 
> > As a heavy cmake-qt5 user (kde/lxqt/hawaii) I had many failing
> > cross-recipes not finding stdlib.h. After reading the gcc-bug I check
> > compile logs and they were full of -isystem on sysroot/usr/include -
> > had no idea where they came from.
> > First I grepped oe-core but did not find suspicious (e.g bitbake.conf
> > - see above). Then I grepped cmake sources and found GNU.cmake,
> > patched it to affect c++ only and my build errors were gone.
> > 
> > Andreas
> 
> So I finally narrowed down what was causing my recipe to fail. For some 
> bizzar reason cmake sets all includes that have come from imported 
> targets as system includes. It's bonkers but there is very little 
> documentation around it and I'm not sure why it would be like that. 

One reason could be so as to try to avoid certain compiler warnings caused
by the includes, rather than own code.
https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html


Cheers,
Andre'




More information about the Openembedded-core mailing list