X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=development%2Fcmake%2FConfigureChecks.cmake;h=9062372c38e107156a7e561bce340045b0cd53e0;hb=1a800bf3e502a3072bd41aafdb7a74726bdeb880;hp=0290c4d9e7ce83b16e98c916c0af8b7e65077de3;hpb=7796ad3a3686694733b936076a3086f8d275f64b;p=lyx.git diff --git a/development/cmake/ConfigureChecks.cmake b/development/cmake/ConfigureChecks.cmake index 0290c4d9e7..9062372c38 100644 --- a/development/cmake/ConfigureChecks.cmake +++ b/development/cmake/ConfigureChecks.cmake @@ -12,6 +12,7 @@ include(CheckFunctionExists) include(CheckLibraryExists) include(CheckTypeSize) include(CheckCXXSourceCompiles) +include(CheckCXXSourceRuns) include(MacroBoolTo01) include(TestBigEndian) @@ -33,6 +34,8 @@ foreach(_h_file aspell.h aspell/aspell.h limits.h locale.h check_include_files(${_h_file} HAVE_${_HF}) set(Include_Defines "${Include_Defines}#cmakedefine HAVE_${_HF} 1\n") endforeach() +check_include_file_cxx(regex HAVE_REGEX) +set(Include_Defines "${Include_Defines}#cmakedefine HAVE_REGEX 1\n") configure_file(${LYX_CMAKE_DIR}/configIncludes.cmake ${TOP_BINARY_DIR}/configIncludes.h.cmake) configure_file(${TOP_BINARY_DIR}/configIncludes.h.cmake ${TOP_BINARY_DIR}/configIncludes.h) @@ -59,15 +62,60 @@ check_symbol_exists(pid_t "sys/types.h" HAVE_PID_T) check_symbol_exists(intmax_t "inttypes.h" HAVE_INTTYPES_H_WITH_UINTMAX) check_symbol_exists(uintmax_t "stdint.h" HAVE_STDINT_H_WITH_UINTMAX) check_symbol_exists(LC_MESSAGES "locale.h" HAVE_LC_MESSAGES) +check_symbol_exists(PATH_MAX "limits.h" HAVE_DEF_PATH_MAX) check_type_size(intmax_t HAVE_INTMAX_T) macro_bool_to_01(HAVE_UINTMAX_T HAVE_STDINT_H_WITH_UINTMAX) check_type_size("long double" HAVE_LONG_DOUBLE) -check_type_size("long long" HAVE_LONG_LONG) +check_type_size("long long" HAVE_LONG_LONG_INT) 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 + + int main() + { + Hunspell sp(\"foo\", \"bar\"); + int i = sp.stem(\"test\").size(); + return(0); + } + " + ) + +# The trick with faking the link command (see the else block) does not work +# with XCode (350a9daf). +if(APPLE OR LYX_EXTERNAL_HUNSPELL) + try_compile(HAVE_HUNSPELL_CXXABI + "${CMAKE_BINARY_DIR}" + "${HunspellTestFile}" + CMAKE_FLAGS + "-DINCLUDE_DIRECTORIES:STRING=${HUNSPELL_INCLUDE_DIR}" + LINK_LIBRARIES ${HUNSPELL_LIBRARY} + OUTPUT_VARIABLE LOG2) +else() + try_compile(HAVE_HUNSPELL_CXXABI + "${CMAKE_BINARY_DIR}" + "${HunspellTestFile}" + CMAKE_FLAGS + "-DINCLUDE_DIRECTORIES:STRING=${HUNSPELL_INCLUDE_DIR}" + # At this point, ../lib/libhunspell.a has not been built so we + # cannot complete the linking. + "-DCMAKE_CXX_LINK_EXECUTABLE='${CMAKE_COMMAD} echo dummy (fake) link command since libhunspell.a not built yet.'" + OUTPUT_VARIABLE LOG2) +endif() + + message(STATUS "HAVE_HUNSPELL_CXXABI = ${HAVE_HUNSPELL_CXXABI}") + #message(STATUS "LOG2 = ${LOG2}") + if(LYX_EXTERNAL_HUNSPELL AND (LYX_STDLIB_DEBUG OR LYX_DEBUG_GLIBC OR LYX_DEBUG_GLIBC_PEDANTIC) AND HAVE_HUNSPELL_CXXABI) + message(FATAL_ERROR "Compiling LyX with stdlib-debug and system hunspell libraries may lead to crashes. Consider using '-DLYX_STDLIB_DEBUG=OFF -DLYX_DEBUG_GLIBC=OFF -DLYX_DEBUG_GLIBC_PEDANTIC=OFF' or -DLYX_EXTERNAL_HUNSPELL=OFF.") + endif() +endif() #check_cxx_source_compiles( # " @@ -113,6 +161,16 @@ check_cxx_source_compiles( SIZEOF_WCHAR_T_IS_4) check_cxx_source_compiles( + " + int i[ ( sizeof(long long)>sizeof(long) ? 1 : -1 ) ]; + int main(){return 0;} + " +SIZEOF_LONG_LONG_GREATER_THAN_SIZEOF_LONG) + +if(LYX_DISABLE_CALLSTACK_PRINTING) + set(LYX_CALLSTACK_PRINTING OFF CACHE BOOL "Print callstack when crashing") +else() + check_cxx_source_compiles( " #include #include @@ -124,7 +182,8 @@ check_cxx_source_compiles( abi::__cxa_demangle(\"abcd\", 0, 0, &status); } " -LYX_CALLSTACK_PRINTING) + LYX_CALLSTACK_PRINTING) +endif() # Check whether STL is libstdc++ check_cxx_source_compiles( @@ -137,7 +196,20 @@ check_cxx_source_compiles( return(0); } " -STD_STRING_USES_COW) +lyx_cv_lib_stdcxx) + +# Check whether STL is libstdc++ with C++11 ABI +check_cxx_source_compiles( + " + #include + 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( " @@ -150,21 +222,111 @@ check_cxx_source_compiles( " lyx_cv_prog_clang) +check_cxx_source_compiles( + " + #include + using std::make_unique; + int main() { + return(0); + } + " +HAVE_DEF_MAKE_UNIQUE) + +check_cxx_source_compiles( + " + #include + static std::once_flag flag; + int main() { + std::call_once(flag, [](){ return; }); + return(0); + } + " +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::Broker broker; + int main() { + return(0); + } + " + HAVE_ENCHANT2) + if (HAVE_ENCHANT2) + message(STATUS "ENCHANT2 found") + endif() +endif() + set(USE_LLVM_LIBCPP) -if(NOT STD_STRING_USES_COW) +set(STD_STRING_USES_COW) +set(USE_GLIBCXX_CXX11_ABI) +if(lyx_cv_lib_stdcxx) + if(NOT USE_GLIBCXX_CXX11_ABI) + set(STD_STRING_USES_COW 1) + endif() +else() if(lyx_cv_prog_clang) # use libc++ provided by llvm instead of GNU libstdc++ set(USE_LLVM_LIBCPP 1) endif() endif() -if(LYX_USE_QT MATCHES "QT5") - if (Qt5X11Extras_FOUND) - get_target_property(_x11extra_prop Qt5::X11Extras IMPORTED_CONFIGURATIONS) - get_target_property(_x11extra_link_libraries Qt5::X11Extras IMPORTED_LOCATION_${_x11extra_prop}) +set(QPA_XCB) +set(HAVE_QT5_X11_EXTRAS) +set(HAVE_QT6_X11_EXTRAS) +if (LYX_USE_QT MATCHES "QT5|QT6") + if (LYX_USE_QT MATCHES "QT5") + set(QtVal Qt5) + else() + set(QtVal Qt6) + endif() + set(CMAKE_REQUIRED_INCLUDES ${${QtVal}Core_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_FLAGS) + #message(STATUS "${QtVal}Core_INCLUDE_DIRS = ${${QtVal}Core_INCLUDE_DIRS}") + check_include_file_cxx(QtGui/qtgui-config.h HAVE_QTGUI_CONFIG_H) + if (HAVE_QTGUI_CONFIG_H) + set(lyx_qt_config "QtGui/qtgui-config.h") + else() + set(lyx_qt_config "QtCore/qconfig.h") + endif() + if(WIN32) + set(QT_USES_X11 OFF CACHE BOOL "Win32 compiled without X11") + # The try_run for minngw would not work here anyway + else() + check_cxx_source_runs( + " + #include <${lyx_qt_config}> + #include + using namespace std; + string a(QT_QPA_DEFAULT_PLATFORM_NAME); + int main(int argc, char **argv) + { + if (a.compare(\"xcb\") == 0) + return(0); + else + return 1; + } + " + QT_USES_X11) + if(QT_USES_X11 AND NOT LYX_USE_QT MATCHES "QT6") + set(QPA_XCB ${QT_USES_X11}) + message(STATUS "Found QPA_XCB = ${QPA_XCB}") + endif() + endif() + + if (${QtVal}X11Extras_FOUND) + get_target_property(_x11extra_prop ${QtVal}::X11Extras IMPORTED_CONFIGURATIONS) + get_target_property(_x11extra_link_libraries ${QtVal}::X11Extras IMPORTED_LOCATION_${_x11extra_prop}) set(CMAKE_REQUIRED_LIBRARIES ${_x11extra_link_libraries}) - set(CMAKE_REQUIRED_INCLUDES ${Qt5X11Extras_INCLUDE_DIRS}) - set(CMAKE_REQUIRED_FLAGS ${Qt5X11Extras_EXECUTABLE_COMPILE_FLAGS}) + set(CMAKE_REQUIRED_INCLUDES ${${QtVal}X11Extras_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_FLAGS "${${QtVal}X11Extras_EXECUTABLE_COMPILE_FLAGS} -fPIC -DQT_NO_VERSION_TAGGING") + #message(STATUS "CMAKE_REQUIRED_LIBRARIES = ${_x11extra_link_libraries}") + #message(STATUS "CMAKE_REQUIRED_INCLUDES = ${${QtVal}X11Extras_INCLUDE_DIRS}") + #message(STATUS "CMAKE_REQUIRED_FLAGS = ${CMAKE_REQUIRED_FLAGS}") check_cxx_source_compiles( " #include @@ -173,22 +335,19 @@ if(LYX_USE_QT MATCHES "QT5") bool isX11 = QX11Info::isPlatformX11(); } " - QT_USES_X11) + QT_HAS_X11_EXTRAS) + string(TOUPPER ${QtVal} QTVAL) + set(HAVE_${QTVAL}_X11_EXTRAS ${QT_HAS_X11_EXTRAS}) + set(LYX_${QTVAL}_X11_EXTRAS_LIBRARY ${_x11extra_link_libraries}) + endif() + if (${QtVal}WinExtras_FOUND) + get_target_property(_winextra_prop ${QtVal}::WinExtras IMPORTED_CONFIGURATIONS) + string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE) + get_target_property(_winextra_link_libraries ${QtVal}::WinExtras IMPORTED_LOCATION_${BUILD_TYPE}) + set(CMAKE_REQUIRED_LIBRARIES ${_winextra_link_libraries}) + set(CMAKE_REQUIRED_INCLUDES ${${QtVal}WinExtras_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_FLAGS ${${QtVal}WinExtras_EXECUTABLE_COMPILE_FLAGS}) endif() -elseif(LYX_USE_QT MATCHES "QT4") - set(CMAKE_REQUIRED_LIBRARIES ${QT_QTGUI_LIBRARY}) - set(CMAKE_REQUIRED_INCLUDES ${QT_INCLUDES}) - check_cxx_source_compiles( - " - #include - int main() - { - QX11Info *qxi = new QX11Info; - qxi->~QX11Info(); - } - " - QT_USES_X11) else() message(FATAL_ERROR "Check for QT_USES_X11: Not handled LYX_USE_QT (= ${LYX_USE_QT})") endif() -