Jose Fonseca <jfons...@vmware.com> writes: > From: José Fonseca <jfons...@vmware.com> > > This is just to help repro and fixing these issues with any C++ compiler -- > > commiting this will of course wait until all issues are addressed.
Hi Jose, I have a patch which trivially fixes extern "C" in the 14 files identified by no_extern_c.h errors. Should I send the patch? This helper header was sent a long time ago, but it seems like a useful mechanism to me. -Mark > > > $ scons src/glsl/ > scons: Reading SConscript files ... > Checking for GCC ... yes > Checking for Clang ... no > Checking for X11 (x11 xext xdamage xfixes glproto >= 1.4.13)... yes > Checking for XCB (x11-xcb xcb-glx >= 1.8.1 xcb-dri2 >= 1.8)... yes > Checking for XF86VIDMODE (xxf86vm)... yes > Checking for DRM (libdrm >= 2.4.38)... yes > Checking for UDEV (libudev >= 151)... yes > warning: LLVM disabled: not building llvmpipe > scons: done reading SConscript files. > scons: Building targets ... > scons: building associated VariantDir targets: build/linux-x86_64-debug/glsl > Compiling src/glsl/ast_array_index.cpp ... > Compiling src/glsl/ast_expr.cpp ... > Compiling src/glsl/ast_function.cpp ... > Compiling src/glsl/ast_to_hir.cpp ... > Compiling src/glsl/ast_type.cpp ... > Compiling src/glsl/builtin_functions.cpp ... > In file included from include/c99_compat.h:28:0, > from src/mapi/u_compiler.h:4, > from src/mapi/u_thread.h:47, > from src/mapi/glapi/glapi.h:47, > from src/mesa/main/mtypes.h:42, > from src/mesa/main/errors.h:47, > from src/mesa/main/imports.h:41, > from src/mesa/main/core.h:44, > from src/glsl/builtin_functions.cpp:58: > include/no_extern_c.h:48:1: error: template with C linkage > template<class T> class _IncludeInsideExternCNotPortable; > ^ > In file included from include/c99_compat.h:28:0, > from include/c11/threads.h:38, > from src/mapi/u_thread.h:49, > from src/mapi/glapi/glapi.h:47, > from src/mesa/main/mtypes.h:42, > from src/mesa/main/errors.h:47, > from src/mesa/main/imports.h:41, > from src/mesa/main/core.h:44, > from src/glsl/builtin_functions.cpp:58: > include/no_extern_c.h:48:1: error: template with C linkage > template<class T> class _IncludeInsideExternCNotPortable; > ^ > Compiling src/glsl/builtin_types.cpp ... > Compiling src/glsl/builtin_variables.cpp ... > scons: *** [build/linux-x86_64-debug/glsl/builtin_functions.os] Error 1 > scons: building terminated because of errors. > --- > include/c99_compat.h | 2 ++ > include/no_extern_c.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ > src/util/u_atomic.h | 3 +++ > 3 files changed, 54 insertions(+) > create mode 100644 include/no_extern_c.h > > diff --git a/include/c99_compat.h b/include/c99_compat.h > index 429c601..a8819ac 100644 > --- a/include/c99_compat.h > +++ b/include/c99_compat.h > @@ -25,6 +25,8 @@ > * > **************************************************************************/ > > +#include "no_extern_c.h" > + > #ifndef _C99_COMPAT_H_ > #define _C99_COMPAT_H_ > > diff --git a/include/no_extern_c.h b/include/no_extern_c.h > new file mode 100644 > index 0000000..d038a4f > --- /dev/null > +++ b/include/no_extern_c.h > @@ -0,0 +1,49 @@ > +/************************************************************************** > + * > + * Copyright 2014 VMware, Inc. > + * All Rights Reserved. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included > + * in all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS > + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > + * OTHER DEALINGS IN THE SOFTWARE. > + * > + **************************************************************************/ > + > + > +/* > + * Including system's headers inside `extern "C" { ... }` is not safe, as > system > + * headers may have C++ code in them, and C++ code inside extern "C" > + * leads to syntatically incorrect code. > + * > + * This is because putting code inside extern "C" won't make __cplusplus > define > + * go away, that is, the headers being included thinks is free to use C++ as > it > + * sees fits. > + * > + * Including non-system headers inside extern "C" is not safe either, > because > + * non-system headers end up including system headers, hence fall in the > above > + * case too. > + * > + * Conclusion, includes inside extern "C" is simply not portable. > + * > + * > + * This header helps surface this issues. > + * > + */ > + > +#ifdef __cplusplus > +template<class T> class _IncludeInsideExternCNotPortable; > +#endif > diff --git a/src/util/u_atomic.h b/src/util/u_atomic.h > index 56c5740..25b8030 100644 > --- a/src/util/u_atomic.h > +++ b/src/util/u_atomic.h > @@ -6,6 +6,9 @@ > * > */ > > + > +#include "no_extern_c.h" > + > #ifndef U_ATOMIC_H > #define U_ATOMIC_H > > -- > 2.1.3 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev