Date: Tuesday, June 9, 2015 @ 21:39:58 Author: arojas Revision: 240458
Fix build with C++11 ABI Added: lyx/trunk/lyx-C-11.patch Modified: lyx/trunk/PKGBUILD ----------------+ PKGBUILD | 8 + lyx-C-11.patch | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 228 insertions(+), 2 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2015-06-09 18:07:05 UTC (rev 240457) +++ PKGBUILD 2015-06-09 19:39:58 UTC (rev 240458) @@ -17,15 +17,19 @@ install=lyx.install options=('emptydirs') source=(ftp://ftp.lyx.org/pub/lyx/stable/2.1.x/$pkgname-$pkgver.tar.xz - lyx.desktop lyxrc.dist) + lyx.desktop lyxrc.dist lyx-C-11.patch) sha1sums=('eba2e3476967cb33a59b9f7331df472d98d635bf' 'e2b8f6d6cdeec41e1d5795167f5557e4a6ea28ad' - '56416642cc3da2a13b87b84e6b87c1a239f3d09a') + '56416642cc3da2a13b87b84e6b87c1a239f3d09a' + 'ca8358890bb425a1ad13b462f974c2be501d601e') prepare() { cd "${srcdir}/${pkgname}-${pkgver}" find . -type f -exec sed -i 's|#!.*python|#!/usr/bin/env python2|' {} + sed -i 's|"python|"python2|' lib/configure.py src/support/os.cpp + +# Fix build with C++11 + patch -p1 -i "$srcdir"/lyx-C-11.patch } build() { Added: lyx-C-11.patch =================================================================== --- lyx-C-11.patch (rev 0) +++ lyx-C-11.patch 2015-06-09 19:39:58 UTC (rev 240458) @@ -0,0 +1,222 @@ +From be41e2d16f551103a9b7c5d22cb774eb5bfcb0d9 Mon Sep 17 00:00:00 2001 +From: Georg Baum <b...@lyx.org> +Date: Tue, 12 May 2015 21:23:06 +0200 +Subject: [PATCH 153/163] Fix build with GNU libstdc++ C++11 ABI + +The GNU libstdc++ that ships witch gcc 5 can be used with the same ABI as +older versions, or with a new ABI which is conformant to the C++11 standard. +LyX did not build if the latter was used: +https://kojipkgs.fedoraproject.org//work/tasks/1267/9651267/build.log + +This is now fixed by detecting the ABI version and disabling the wrong forward +declarations. At the same time, STD_STRING_USES_COW is switched off for the +C++11 ABI version, because the std::basic_string implementation is now C++11 +conformant. Since the GNU libstdc++ can also used by other compilers such as +clang, we must not test for the compiler version. +--- + config/lyxinclude.m4 | 80 ++++++++++++++++++++++----------- + development/cmake/ConfigureChecks.cmake | 46 +++++++++++++++++++ + development/cmake/config.h.cmake | 3 ++ + src/support/strfwd.h | 14 ++---- + status.21x | 3 ++ + 5 files changed, 110 insertions(+), 36 deletions(-) + +diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 +index 61ea48d..a0094c1 100644 +--- a/config/lyxinclude.m4 ++++ b/config/lyxinclude.m4 +@@ -120,37 +120,65 @@ done + ])dnl + + +-AC_DEFUN([LYX_PROG_CXX_WORKS], +-[rm -f conftest.C +-cat >conftest.C <<EOF +-class foo { +- // we require the mutable keyword +- mutable int bar; +- }; +- // we require namespace support +- namespace baz { +- int bar; +- } +- int main() { +- return(0); +- } +-EOF +-$CXX -c $CXXFLAGS $CPPFLAGS conftest.C >&5 || CXX= +-rm -f conftest.C conftest.o conftest.obj || true ++dnl Usage: LYX_PROG_CLANG: set lyx_cv_prog_clang to yes if the compiler is clang. ++AC_DEFUN([LYX_PROG_CLANG], ++[AC_CACHE_CHECK([whether the compiler is clang], ++ [lyx_cv_prog_clang], ++[AC_TRY_COMPILE([], [ ++#ifndef __clang__ ++ this is not clang ++#endif ++], ++[lyx_cv_prog_clang=yes ; CLANG=yes], [lyx_cv_prog_clang=no ; CLANG=no])]) + ]) + + +-AC_DEFUN([LYX_PROG_CXX], +-[AC_MSG_CHECKING([for a good enough C++ compiler]) +-LYX_SEARCH_PROG(CXX, $CXX $CCC g++ gcc c++ CC cxx xlC cc++, [LYX_PROG_CXX_WORKS]) ++dnl Usage: LYX_LIB_STDCXX: set lyx_cv_lib_stdcxx to yes if the STL library is libstdc++. ++AC_DEFUN([LYX_LIB_STDCXX], ++[AC_CACHE_CHECK([whether STL is libstdc++], ++ [lyx_cv_lib_stdcxx], ++[AC_TRY_COMPILE([#include<vector>], [ ++#if ! defined(__GLIBCXX__) && ! defined(__GLIBCPP__) ++ this is not libstdc++ ++#endif ++], ++[lyx_cv_lib_stdcxx=yes], [lyx_cv_lib_stdcxx=no])]) ++]) + +-if test -z "$CXX" ; then +- AC_MSG_ERROR([Unable to find a good enough C++ compiler]) +-fi +-AC_MSG_RESULT($CXX) + +-AC_PROG_CXX +-AC_PROG_CXXCPP ++dnl Usage: LYX_LIB_STDCXX_CXX11_ABI: set lyx_cv_lib_stdcxx_cxx11_abi to yes ++dnl if the STL library is GNU libstdc++ and the C++11 ABI is used. ++AC_DEFUN([LYX_LIB_STDCXX_CXX11_ABI], ++[AC_CACHE_CHECK([whether STL is libstdc++ using the C++11 ABI], ++ [lyx_cv_lib_stdcxx_cxx11_abi], ++[AC_TRY_COMPILE([#include<vector>], [ ++#if ! defined(_GLIBCXX_USE_CXX11_ABI) || ! _GLIBCXX_USE_CXX11_ABI ++ this is not libstdc++ using the C++11 ABI ++#endif ++], ++[lyx_cv_lib_stdcxx_cxx11_abi=yes], [lyx_cv_lib_stdcxx_cxx11_abi=no])]) ++]) ++ ++ ++AC_DEFUN([LYX_PROG_CXX], ++[AC_REQUIRE([AC_PROG_CXX]) ++AC_REQUIRE([AC_PROG_CXXCPP]) ++ ++AC_LANG_PUSH(C++) ++LYX_PROG_CLANG ++LYX_LIB_STDCXX ++LYX_LIB_STDCXX_CXX11_ABI ++AC_LANG_POP(C++) ++ ++if test $lyx_cv_lib_stdcxx = "yes" ; then ++ if test $lyx_cv_lib_stdcxx_cxx11_abi = "yes" ; then ++ AC_DEFINE(USE_GLIBCXX_CXX11_ABI, 1, [use GNU libstdc++ with C++11 ABI]) ++ fi ++else ++ if test $lyx_cv_prog_clang = "yes" ; then ++ AC_DEFINE(USE_LLVM_LIBCPP, 1, [use libc++ provided by llvm instead of GNU libstdc++]) ++ fi ++fi + + ### We might want to get or shut warnings. + AC_ARG_ENABLE(warnings, +diff --git a/development/cmake/ConfigureChecks.cmake b/development/cmake/ConfigureChecks.cmake +index 71291a5..a738160 100644 +--- a/development/cmake/ConfigureChecks.cmake ++++ b/development/cmake/ConfigureChecks.cmake +@@ -112,3 +112,49 @@ check_cxx_source_compiles( + " + SIZEOF_WCHAR_T_IS_4) + ++# Check whether STL is libstdc++ ++check_cxx_source_compiles( ++ " ++ #include <vector> ++ int main() { ++ #if ! defined(__GLIBCXX__) && ! defined(__GLIBCPP__) ++ this is not libstdc++ ++ #endif ++ return(0); ++ } ++ " ++lyx_cv_lib_stdcxx) ++ ++# Check whether STL is libstdc++ with C++11 ABI ++check_cxx_source_compiles( ++ " ++ #include <vector> ++ int main() { ++ #if ! defined(_GLIBCXX_USE_CXX11_ABI) || ! _GLIBCXX_USE_CXX11_ABI ++ this is not libstdc++ using the C++11 ABI ++ #endif ++ return(0); ++ } ++ " ++USE_GLIBCXX_CXX11_ABI) ++ ++check_cxx_source_compiles( ++ " ++ #ifndef __clang__ ++ this is not clang ++ #endif ++ int main() { ++ return(0); ++ } ++ " ++lyx_cv_prog_clang) ++ ++set(USE_LLVM_LIBCPP) ++set(USE_GLIBCXX_CXX11_ABI) ++if(NOT lyx_cv_lib_stdcxx) ++ if(lyx_cv_prog_clang) ++ # use libc++ provided by llvm instead of GNU libstdc++ ++ set(USE_LLVM_LIBCPP 1) ++ endif() ++endif() ++ +diff --git a/development/cmake/config.h.cmake b/development/cmake/config.h.cmake +index 7bbe09e..a392b51 100644 +--- a/development/cmake/config.h.cmake ++++ b/development/cmake/config.h.cmake +@@ -57,6 +57,9 @@ + #cmakedefine LYX_USE_TR1 1 + #cmakedefine LYX_USE_TR1_REGEX 1 + ++// use GNU libstdc++ with C++11 ABI ++#cmakedefine USE_GLIBCXX_CXX11_ABI 1 ++ + #cmakedefine Z_PREFIX 1 + + #cmakedefine ASPELL_FOUND 1 +diff --git a/src/support/strfwd.h b/src/support/strfwd.h +index de8588c..f39426e 100644 +--- a/src/support/strfwd.h ++++ b/src/support/strfwd.h +@@ -13,14 +13,6 @@ + #ifndef STRFWD_H + #define STRFWD_H + +-// This includes does nothing but defining _LIBCPP_VERSION +-// if libc++ is used (rather than libstdc++) - we first +-// check if we have at least a c++03 standard before +-// including the file +-#if (__cplusplus > 19971L) +-#include <ciso646> +-#endif +- + #ifdef USE_WCHAR_T + + // Prefer this if possible because GNU libstdc++ has usable +@@ -36,8 +28,10 @@ namespace lyx { typedef boost::uint32_t char_type; } + + #endif + +-// Forward definitions do not work with libc++ +-#ifdef _LIBCPP_VERSION ++// For gcc5 with the new std::string ABI forward declarations would work in ++// principle, but I am not sure whether we want non-standard ++// "namespace __cxx11" in our sources. ++#if defined(USE_LLVM_LIBCPP) || defined(USE_GLIBCXX_CXX11_ABI) + #include <string> + #else + +-- +1.9.3 +