Add support for enchant 2.x

As of enchant 2.x, it is required to create a Broker instance instead
of relying on a static one provided by the library.

Add autoconf and cmake (courtesy of Kornel) tests that check whether
one can indeed instantiate a Broker object, and act on the result in a
new broker() helper function.

Fixes bug #10986.

(cherry picked from commit 63a4e82874)
This commit is contained in:
Jean-Marc Lasgouttes 2018-01-24 16:19:34 +01:00 committed by Juergen Spitzmueller
parent 0ddb1435c9
commit b3cca8086d
4 changed files with 60 additions and 15 deletions

View File

@ -23,7 +23,21 @@ AC_DEFUN([CHECK_WITH_ASPELL],
fi
])
# Macro to add for using enchant spellchecker libraries! -*- sh -*-
AC_DEFUN([LYX_HAVE_ENCHANT2],
[
AC_MSG_CHECKING([whether enchant is version 2.x at least])
save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$ENCHANT_CFLAGS $AM_CXXFLAGS $CXXFLAGS"
AC_TRY_COMPILE([#include <enchant++.h>],
[enchant::Broker broker;],
[AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_ENCHANT2, 1, [Define to 1 if enchant 2.x is detected])
],
[AC_MSG_RESULT(no)])
CXXFLAGS=$save_CXXFLAGS
])
AC_DEFUN([CHECK_WITH_ENCHANT],
[
lyx_use_enchant=true
@ -31,16 +45,17 @@ AC_DEFUN([CHECK_WITH_ENCHANT],
test "$with_enchant" = "no" && lyx_use_enchant=false
if $lyx_use_enchant; then
PKG_CHECK_MODULES([ENCHANT], [enchant], [], [lyx_use_enchant=false])
AC_MSG_CHECKING([whether to use enchant])
if $lyx_use_enchant ; then
AC_MSG_RESULT(yes)
AC_DEFINE(USE_ENCHANT, 1, [Define as 1 to use the enchant library])
lyx_flags="$lyx_flags use-enchant"
else
AC_MSG_RESULT(no)
fi
fi
PKG_CHECK_MODULES([ENCHANT], [enchant], [], [lyx_use_enchant=false])
AC_MSG_CHECKING([whether to use enchant])
if $lyx_use_enchant ; then
AC_MSG_RESULT(yes)
AC_DEFINE(USE_ENCHANT, 1, [Define as 1 to use the enchant library])
LYX_HAVE_ENCHANT2
lyx_flags="$lyx_flags use-enchant"
else
AC_MSG_RESULT(no)
fi
fi
])
# Macro to add for using hunspell spellchecker libraries! -*- sh -*-

View File

@ -195,6 +195,24 @@ check_cxx_source_compiles(
"
LYX_USE_STD_CALL_ONCE)
if (ENCHANT_FOUND)
set(CMAKE_REQUIRED_INCLUDES ${ENCHANT_INCLUDE_DIR})
set(CMAKE_REQUIRED_LIBRARIES ${ENCHANT_LIBRARY})
# Check, whether enchant is version 2.x at least
check_cxx_source_compiles(
"
#include <enchant++.h>
enchant::Broker broker;
int main() {
return(0);
}
"
HAVE_ENCHANT2)
if (HAVE_ENCHANT2)
message(STATUS "ENCHANT2 found")
endif()
endif()
set(USE_LLVM_LIBCPP)
set(STD_STRING_USES_COW)
set(USE_GLIBCXX_CXX11_ABI)

View File

@ -88,6 +88,9 @@ ${Include_used_spellchecker}
// Define to 1 if std::call_once is supported by the compiler
#cmakedefine LYX_USE_STD_CALL_ONCE 1
// Define to 1 if enchant is version 2.x at least
#cmakedefine HAVE_ENCHANT2 1
#endif // config.h guard
#define MYTHES_H_LOCATION <${MYTHES_DIR}/mythes.hxx>

View File

@ -30,6 +30,17 @@ namespace lyx {
namespace {
enchant::Broker & broker()
{
#ifdef HAVE_ENCHANT2
static enchant::Broker thebroker;
return thebroker;
#else
return *enchant::Broker::instance();
#endif
}
struct Speller {
enchant::Dict * speller;
};
@ -68,12 +79,11 @@ EnchantChecker::Private::~Private()
enchant::Dict * EnchantChecker::Private::addSpeller(string const & lang)
{
enchant::Broker * instance = enchant::Broker::instance();
Speller m;
try {
LYXERR(Debug::FILES, "request enchant speller for language " << lang);
m.speller = instance->request_dict(lang);
m.speller = broker().request_dict(lang);
}
catch (enchant::Exception & e) {
// FIXME error handling?
@ -186,8 +196,7 @@ bool EnchantChecker::hasDictionary(Language const * lang) const
{
if (!lang)
return false;
enchant::Broker * instance = enchant::Broker::instance();
return (instance->dict_exists(lang->code()));
return broker().dict_exists(lang->code());
}