svn commit: r397068 - head/devel/cmake/files
Raphael Kubo da Costa
rakuco at FreeBSD.org
Wed Sep 16 14:56:08 UTC 2015
Author: rakuco
Date: Wed Sep 16 14:56:07 2015
New Revision: 397068
URL: https://svnweb.freebsd.org/changeset/ports/397068
Log:
Add upstream patch to fix the build with GCC 4.6, 4.7 and 4.8.
runetype.h uses _Thread_local, and if we pass -std=c11 or -std=gnu11 to GCC
the header expects it to be supported as part of the language and does not
make it a typedef or something else.
Since GCC only started supporting _Thread_local with the 4.9 series,
building CMake with, say, lang/gcc (which is 4.8) fails:
/usr/include/runetype.h:92:22: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'const'
/usr/include/runetype.h: In function '__getCurrentRuneLocale':
/usr/include/runetype.h:96:6: error: '_ThreadRuneLocale' undeclared (first use in this function)
/usr/include/runetype.h:96:6: note: each undeclared identifier is reported only once for each function it appears in
The upstream patch adds a test for _Thread_local and uses C99 instead of C11
if it fails.
PR: 203066
Added:
head/devel/cmake/files/patch-git_ffa6f057 (contents, props changed)
Added: head/devel/cmake/files/patch-git_ffa6f057
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/cmake/files/patch-git_ffa6f057 Wed Sep 16 14:56:07 2015 (r397068)
@@ -0,0 +1,82 @@
+commit ffa6f057b4ae07c9dc7b9e1d12ecc0a2e19333a1
+Author: Raphael Kubo da Costa <rakuco at FreeBSD.org>
+Date: Tue Sep 15 16:31:12 2015 +0200
+
+ Avoid using C11 to build CMake if _Thread_local support is broken
+
+ Support for C11's _Thread_local was introduced in GCC in the 4.9 series,
+ even though we make the C11 compiler flags available in CMake with GCC
+ >= 4.6.
+
+ FreeBSD's runetype.h uses _Thread_local, which causes CMake's own build
+ to fail when using GCC < 4.9 and -std=gnu11:
+
+ /usr/include/runetype.h:92:22: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'const'
+ extern _Thread_local const _RuneLocale *_ThreadRuneLocale;
+
+ Add a test for _Thread_local support and only build CMake itself with
+ C11 support if it works.
+
+ Bug: http://www.cmake.org/Bug/view.php?id=15741
+
+--- CMakeLists.txt
++++ CMakeLists.txt
+@@ -38,7 +38,12 @@ endif()
+
+ # Use most-recent available language dialects with GNU and Clang
+ if(NOT DEFINED CMAKE_C_STANDARD AND NOT CMake_NO_C_STANDARD)
+- set(CMAKE_C_STANDARD 11)
++ include(${CMake_SOURCE_DIR}/Source/Checks/cm_c11_thread_local.cmake)
++ if(NOT CMake_C11_THREAD_LOCAL_BROKEN)
++ set(CMAKE_C_STANDARD 11)
++ else()
++ set(CMAKE_C_STANDARD 99)
++ endif()
+ endif()
+ if(NOT DEFINED CMAKE_CXX_STANDARD AND NOT CMake_NO_CXX_STANDARD)
+ include(${CMake_SOURCE_DIR}/Source/Checks/cm_cxx14_cstdio.cmake)
+new file mode 100644
+index 0000000..ab780f2
+--- /dev/null
++++ Source/Checks/cm_c11_thread_local.c
+@@ -0,0 +1,2 @@
++_Thread_local int i = 42;
++int main(void) { return 0; }
+new file mode 100644
+index 0000000..6b8d10b
+--- /dev/null
++++ Source/Checks/cm_c11_thread_local.cmake
+@@ -0,0 +1,33 @@
++set(CMake_C11_THREAD_LOCAL_BROKEN 0)
++if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_C11_STANDARD_COMPILE_OPTION)
++ if(NOT DEFINED CMake_C11_THREAD_LOCAL_WORKS)
++ message(STATUS "Checking if compiler supports C11 _Thread_local")
++ try_compile(CMake_C11_THREAD_LOCAL_WORKS
++ ${CMAKE_CURRENT_BINARY_DIR}
++ ${CMAKE_CURRENT_LIST_DIR}/cm_c11_thread_local.c
++ CMAKE_FLAGS -DCMAKE_C_STANDARD=11
++ OUTPUT_VARIABLE OUTPUT
++ )
++ if(CMake_C11_THREAD_LOCAL_WORKS AND "${OUTPUT}" MATCHES "error: expected '=', ',', ';', 'asm' or '__attribute__' before 'int'")
++ set_property(CACHE CMake_C11_THREAD_LOCAL_WORKS PROPERTY VALUE 0)
++ endif()
++ if(CMake_C11_THREAD_LOCAL_WORKS)
++ message(STATUS "Checking if compiler supports C11 _Thread_local - yes")
++ file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
++ "Determining if compiler supports C11 _Thread_local passed with the following output:\n"
++ "${OUTPUT}\n"
++ "\n"
++ )
++ else()
++ message(STATUS "Checking if compiler supports C11 _Thread_local - no")
++ file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
++ "Determining if compiler supports C11 _Thread_local failed with the following output:\n"
++ "${OUTPUT}\n"
++ "\n"
++ )
++ endif()
++ endif()
++ if(NOT CMake_C11_THREAD_LOCAL_WORKS)
++ set(CMake_C11_THREAD_LOCAL_BROKEN 1)
++ endif()
++endif()
More information about the svn-ports-all
mailing list