]> git.lyx.org Git - lyx.git/commitdiff
Support new hunspell C++ ABI if LyX is built against hunspell >= 1.5 2.3.2-staging
authorJuergen Spitzmueller <spitz@lyx.org>
Sat, 14 Apr 2018 08:35:59 +0000 (10:35 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Sat, 14 Apr 2018 08:35:59 +0000 (10:35 +0200)
Fixes: #10547
3rdparty/hunspell/Makefile.am
INSTALL
config/lyxinclude.m4
config/spell.m4
development/cmake/ConfigureChecks.cmake
development/cmake/configCompiler.h.cmake
src/HunspellChecker.cpp
status.23x

index 7e0429d014c8a91ef163df40075f9ad74c92e164..fe0502dd210a8576559739bacdd985b90a7a176a 100644 (file)
@@ -16,7 +16,7 @@ EXTRA_DIST = \
        1.6.2/src/hunspell/hunvisapi.h.in \
        1.6.2/src/hunspell/utf_info.cxx
 
-AM_CPPFLAGS += -DHUNSPELL_STATIC
+AM_CPPFLAGS += -DHUNSPELL_STATIC @STDLIB_DEBUG@
 
 liblyxhunspell_a_SOURCES = \
        1.6.2/src/hunspell/affentry.cxx \
diff --git a/INSTALL b/INSTALL
index 8d3b609c76d3914fb79a463737a2ec6866597997..9e9136733736c0668bd587e2f7142a2b09df867a 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -227,6 +227,9 @@ The following options allow you to tweak the generated code more precisely (see
     --without-included-boost is specified). You may have to use
     --disable-stdlib-debug when linking development versions against
     your system's boost library.
+    The same problem applies to hunspell (as of hunspell 1.5). So either
+    compile --with-included-hunspell or --disable-stdlib-debug when
+    linking development versions against your system's hunspell library.
 
   o --enable-monolithic-build[=boost,client,insets,mathed,core,tex2lyx,frontend-qt4]
     that enables monolithic build of the given parts of the source
index ead704b1665f17da4f7a3384aa3cb8bae184188c..2c1a9af12a8e9285424e9a13011612dd6b4c5197 100644 (file)
@@ -420,6 +420,7 @@ if test x$GXX = xyes; then
         lyx_flags="$lyx_flags stdlib-debug"
        AC_DEFINE(_GLIBCXX_DEBUG, 1, [libstdc++ debug mode])
        AC_DEFINE(_GLIBCXX_DEBUG_PEDANTIC, 1, [libstdc++ pedantic debug mode])
+       AC_SUBST(STDLIB_DEBUG, "-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
         ;;
     esac
   fi
index a15f9f6b3ddbe2626110a73212f16c5f79be3c6e..152e485ad77c597ba56398a831130b209d371d2e 100644 (file)
@@ -43,6 +43,24 @@ AC_DEFUN([CHECK_WITH_ENCHANT],
     fi
     ])
 
+AC_DEFUN([LYX_HAVE_HUNSPELL_CXXABI],
+[
+  AC_MSG_CHECKING([whether hunspell C++ (rather than C) ABI is provided])
+  save_CXXFLAGS=$CXXFLAGS
+  CXXFLAGS="$ENCHANT_CFLAGS $AM_CXXFLAGS $CXXFLAGS"
+
+# in the C++ ABI, stem() returns a vector, in the C ABI, it returns an int
+  AC_TRY_COMPILE([#include <hunspell/hunspell.hxx>],
+      [Hunspell sp("foo", "bar");
+       int i = sp.stem("test").size();],
+      [AC_MSG_RESULT(yes)
+       AC_DEFINE(HAVE_HUNSPELL_CXXABI, 1, [Define to 1 if hunspell C++ (rather than C) ABI is detected])
+       have_hunspell_cxx_abi=yes
+      ],
+      [AC_MSG_RESULT(no)])
+  CXXFLAGS=$save_CXXFLAGS
+])
+
 # Macro to add for using hunspell spellchecker libraries!     -*- sh -*-
 AC_DEFUN([CHECK_WITH_HUNSPELL],
 [
@@ -66,6 +84,12 @@ AC_DEFUN([CHECK_WITH_HUNSPELL],
                AC_MSG_RESULT(no)
        fi
     fi
+       LYX_HAVE_HUNSPELL_CXXABI
+       if test $enable_stdlib_debug = "yes" -a -n "$have_hunspell_cxx_abi" ; then
+               LYX_WARNING([Compiling LyX with stdlib-debug and system hunspell libraries may lead to
+   crashes. Consider using --disable-stdlib-debug or --with-included-hunspell.])
+             fi
+
     ])
 
 dnl Usage: LYX_USE_INCLUDED_HUNSPELL : select if the included hunspell should
@@ -96,6 +120,7 @@ AC_DEFUN([LYX_CHECK_SPELL_ENGINES],
 dnl the user wanted to use the included hunspell, so do not check for external hunspell
                lyx_use_hunspell=true
                AC_DEFINE(USE_HUNSPELL, 1, [Define as 1 to use the hunspell library])
+               AC_DEFINE(HAVE_HUNSPELL_CXXABI, 1, [Define to 1 if hunspell C++ (rather than C) ABI is detected])
                lyx_flags="$lyx_flags use-hunspell"
        else
                CHECK_WITH_HUNSPELL
index f09ba8bd921c460d69d83f1d3d10f9664558009e..3d6d5880fba6834bbe149b4838ae7388be591777 100644 (file)
@@ -72,6 +72,36 @@ check_type_size("long long"  HAVE_LONG_LONG)
 check_type_size(wchar_t HAVE_WCHAR_T)
 check_type_size(wint_t  HAVE_WINT_T)
 
+if(HUNSPELL_FOUND)
+  # check whether hunspell C++ (rather than C) ABI is provided
+  set(HunspellTestFile "${CMAKE_BINARY_DIR}/hunspelltest.cpp")
+  file(WRITE "${HunspellTestFile}"
+  "
+  #include <hunspell/hunspell.hxx>
+
+  int main()
+  {
+    Hunspell sp(\"foo\", \"bar\");
+    int i = sp.stem(\"test\").size();
+  return(0);
+  }
+  "
+  )
+
+  try_compile(HAVE_HUNSPELL_CXXABI
+    "${CMAKE_BINARY_DIR}"
+    "${HunspellTestFile}"
+    CMAKE_FLAGS
+      "-DINCLUDE_DIRECTORIES:STRING=${HUNSPELL_INCLUDE_DIR}"
+      "-DCMAKE_CXX_LINK_EXECUTABLE='${CMAKE_COMMAD} echo not linking now...'"
+  OUTPUT_VARIABLE  LOG2)
+
+  message(STATUS "HAVE_HUNSPELL_CXXABI = ${HAVE_HUNSPELL_CXXABI}")
+  #message(STATUS "LOG2 = ${LOG2}")
+  if(LYX_EXTERNAL_HUNSPELL AND LYX_STDLIB_DEBUG AND HAVE_HUNSPELL_CXXABI)
+    message(WARNING "Compiling LyX with stdlib-debug and system hunspell libraries may lead to crashes. Consider using -DLYX_STDLIB_DEBUG=OFF or -DLYX_EXTERNAL_HUNSPELL=OFF.")
+  endif()
+endif()
 
 #check_cxx_source_compiles(
 #      "
index 52f629e7bb8d02b2f0254bf19263da8db9774267..8934986cb02f72b66006285b2a45ab576e68bac0 100644 (file)
@@ -66,6 +66,9 @@
 #define HAVE_ALLOCA
 #endif
 
+/* whether hunspell C++ (rather than C) ABI is provided */
+#cmakedefine HAVE_HUNSPELL_CXXABI 1
+
 #cmakedefine HAVE_ICONV_CONST 1
 #ifdef HAVE_ICONV_CONST
 #define ICONV_CONST const
index 6dc6647b5cf4829687bc1418ef89dd9b707a09c4..1c2612e78e0fdc973e3e3a6302fc6e213626741e 100644 (file)
@@ -356,7 +356,11 @@ SpellChecker::Result HunspellChecker::check(WordLangTuple const & wl)
 
        LYXERR(Debug::GUI, "spellCheck: \"" <<
                   wl.word() << "\", lang = " << wl.lang()->lang()) ;
+#ifdef HAVE_HUNSPELL_CXXABI
+       if (h->spell(word_to_check, &info))
+#else
        if (h->spell(word_to_check.c_str(), &info))
+#endif
                return d->learned(wl) ? LEARNED_WORD : WORD_OK;
 
        if (info & SPELL_COMPOUND) {
@@ -411,6 +415,11 @@ void HunspellChecker::suggest(WordLangTuple const & wl,
                return;
        string const encoding = h->get_dic_encoding();
        string const word_to_check = to_iconv_encoding(wl.word(), encoding);
+#ifdef HAVE_HUNSPELL_CXXABI
+       vector<string> wlst = h->suggest(word_to_check);
+       for (auto const s : wlst)
+               suggestions.push_back(from_iconv_encoding(s, encoding));
+#else
        char ** suggestion_list;
        int const suggestion_number = h->suggest(&suggestion_list, word_to_check.c_str());
        if (suggestion_number <= 0)
@@ -418,6 +427,7 @@ void HunspellChecker::suggest(WordLangTuple const & wl,
        for (int i = 0; i != suggestion_number; ++i)
                suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding));
        h->free_list(&suggestion_list, suggestion_number);
+#endif
 }
 
 
@@ -430,6 +440,11 @@ void HunspellChecker::stem(WordLangTuple const & wl,
                return;
        string const encoding = h->get_dic_encoding();
        string const word_to_check = to_iconv_encoding(wl.word(), encoding);
+#ifdef HAVE_HUNSPELL_CXXABI
+       vector<string> wlst = h->stem(word_to_check);
+       for (auto const s : wlst)
+               suggestions.push_back(from_iconv_encoding(s, encoding));
+#else
        char ** suggestion_list;
        int const suggestion_number = h->stem(&suggestion_list, word_to_check.c_str());
        if (suggestion_number <= 0)
@@ -437,6 +452,7 @@ void HunspellChecker::stem(WordLangTuple const & wl,
        for (int i = 0; i != suggestion_number; ++i)
                suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding));
        h->free_list(&suggestion_list, suggestion_number);
+#endif
 }
 
 
index d85e56d0fb27e159895d0ac111e356d0c6a93bd9..265657be5b5fad313ee9d5f935e9102c55a060b3 100644 (file)
@@ -89,6 +89,9 @@ What's new
 
 * BUILD/INSTALLATION
 
+- Support new hunspell C++ ABI if LyX is built against hunspell >= 1.5
+  (bug 10547).
+
 
 
 ** Bug fixes: