From 5019f33ecc30608431f1221b27cdc78d439df328 Mon Sep 17 00:00:00 2001 From: Daniel McGregor Date: Fri, 15 Jul 2016 15:08:20 -0600 Subject: openjdk-8: Detect compiler version Some supported hosts still use GCC 4.X. These don't support the flags needed to make GCC 6 work, so check the GCC version and add appropriate compiler flags. This implementation will append flags for any gcc version, but it's only used for GCC 6 right now. Signed-off-by: Daniel McGregor Signed-off-by: Otavio Salvador --- recipes-core/openjdk/openjdk-8-common.inc | 41 +++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/recipes-core/openjdk/openjdk-8-common.inc b/recipes-core/openjdk/openjdk-8-common.inc index 74f686d..089f907 100644 --- a/recipes-core/openjdk/openjdk-8-common.inc +++ b/recipes-core/openjdk/openjdk-8-common.inc @@ -239,6 +239,43 @@ EXTRA_OECONF_append = "\ --with-update-version=${OPENJDK_UPDATE_VERSION} \ " -CFLAGS_append = " -fno-lifetime-dse -fno-delete-null-pointer-checks" -CXXFLAGS_append = " -fno-lifetime-dse -fno-delete-null-pointer-checks" +# GCC 6 sets the default C++ standard to C++14 and introduces dead store +# elimination by default. OpenJDK 8 is not ready for either of these +# changes. +FLAGS_GCC6 = "-fno-lifetime-dse -fno-delete-null-pointer-checks" + +# All supported cross compilers support the compiler flags that were +# added to make compilation with gcc6 work. But the host compiler for +# native compilation is a different story: it may be too old (for example, +# gcc 4.9.2 on Debian Wheezy). In that case we need to check what the +# version is and only add the flags that are appropriate for that GCC +# version. + +def version_specific_cflags(d): + extraflags = None + version = None + + if bb.data.inherits_class('native', d): + from subprocess import Popen, PIPE + + cmd = d.expand('${CPP} -P -').split() + cc = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) + # This check is GCC specific. Clang always returns 4. For Clang + # __clang_major__ and __clang_minor__ need to be checked. Ideally + # __GNUC_MINOR__ would be checked as well, but for this recipe + # GCC major is all we care about. + version = cc.communicate(b'__GNUC__')[0].decode('utf-8')[0] + else: + # in the cross case, trust that GCCVERSION is correct. This won't + # work if the native toolchain is Clang, but as of this writing that + # doesn't work anyway. + version = d.getVar('GCCVERSION', expand=True)[0] + + if int(version) >= 4: + extraflags = d.getVar('FLAGS_GCC%d' % int(version), True) + + return ''.join(extraflags) + +CFLAGS_append = " ${@version_specific_cflags(d)}" +CXXFLAGS_append = " ${@version_specific_cflags(d)}" CXX_append = " -std=gnu++98" -- cgit v1.2.3-54-g00ecf