[Mesa-dev] [PATCH] include: Add helper header to help trap includes inside extern C.

Mark Janes mark.a.janes at intel.com
Fri Mar 6 12:25:03 PST 2015


Unfortunately, my build configuration does not build gallium.  This
caused me to miss some files which still have extern C includes.

Due to this oversight, master encounters build errors.  I'll send a
patch asap.

-Mark

Mark Janes <mark.a.janes at intel.com> writes:

> Assuming my patch to fix 'extern "C"' issues is pushed before this one, 
>
> Reviewed-by: Mark Janes <mark.a.janes at intel.com>
>
> Jose Fonseca <jfonseca at vmware.com> writes:
>
>> From: José Fonseca <jfonseca at 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.
>>
>>
>> $ 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 at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list