Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Sep 2015 14:56:08 +0000 (UTC)
From:      Raphael Kubo da Costa <rakuco@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r397068 - head/devel/cmake/files
Message-ID:  <201509161456.t8GEu8ba041002@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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()



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201509161456.t8GEu8ba041002>