]> git.lyx.org Git - lyx.git/blobdiff - CMakeLists.txt
Update sk.po
[lyx.git] / CMakeLists.txt
index 59c9d7c5777486c3fd54a0f3285a3cb6ede99928..067b30cf3ac3d48876a7be115e1b605614f77f80 100644 (file)
@@ -217,9 +217,9 @@ else()
     unset(LYX_ENABLE_VALGRIND_TESTS CACHE)
   endif()
 endif()
-LYX_OPTION(ASAN             "Use address sanitizer" OFF ALL)
+LYX_COMBO(DEBUG_SANITIZE    "Use sanitize check" NONE ADDRESS UNSPECIFIED)
 #LYX_COMBO(USE_FILEDIALOG    "Use native or QT file dialog" QT NATIVE)
-LYX_COMBO(USE_QT            "Use Qt version as frontend" AUTO QT4 QT5)
+LYX_COMBO(USE_QT            "Use Qt version as frontend" AUTO QT5 QT6)
 LYX_COMBO(USE_IPO           "Interprocedural optimization" OFF AUTO ON)
 #LYX_OPTION(3RDPARTY_BUILD   "Build 3rdparty libs" OFF ALL)
 LYX_OPTION(DISABLE_CALLSTACK_PRINTING "do not print a callstack when crashing" OFF ALL)
@@ -231,6 +231,7 @@ LYX_COMBO(EXTERNAL_MYTHES   "OFF := Build 3rdparty lib mytheslib" AUTO OFF ON)
 
 # GCC specific
 LYX_OPTION(PROFILE              "Build with options for gprof" ${DefaultLyxProfile} GCC)
+LYX_OPTION(EXTERNAL_BOOST       "Use external boost" ${DefaultExternalLibs} GCC)
 LYX_OPTION(PROGRAM_SUFFIX       "Append version suffix to binaries" ON GCC)
 LYX_OPTION(DEBUG_GLIBC          "Enable libstdc++ debug mode" OFF GCC)
 LYX_OPTION(DEBUG_GLIBC_PEDANTIC "Enable libstdc++ pedantic debug mode" OFF GCC)
@@ -246,7 +247,49 @@ LYX_OPTION(DEPENDENCIES_DOWNLOAD "Download dependencies for MSVC 10" OFF MSVC)
 LYX_OPTION(DMG                   "Build as Mac bundle, needed for .dmg  (experimental) " OFF MAC)
 LYX_OPTION(COCOA                 "Use Cocoa on Mac" OFF MAC)
 
-# Try to get some informations from configure.ac
+# On Windows, download the dependencies if need be.
+if(LYX_DEPENDENCIES_DOWNLOAD)
+       message(STATUS)
+       # Do not check for bitness against CMAKE_SIZEOF_VOID_P, as it relates to the bitness of the CMake executable,
+       # not that of the compiler.
+       if(MSVC_VERSION GREATER_EQUAL 1920 AND "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" MATCHES "x64")
+               set(LYX_DEPENDENCIES_DIR ${TOP_BINARY_DIR}/msvc2019-deps-64)
+               set(deps_files lyx-windows-deps-msvc2019_64.zip)
+               set(deps_server http://ftp.lyx.org/pub/lyx/devel/win_deps)
+               set(GNUWIN32_DIR ${LYX_DEPENDENCIES_DIR}/lyx-windows-deps-msvc2019-64)
+       elseif(MSVC_VERSION GREATER_EQUAL 1920)
+               set(LYX_DEPENDENCIES_DIR ${TOP_BINARY_DIR}/msvc2019-deps)
+               set(deps_files lyx-windows-deps-msvc2019_32.zip)
+               set(deps_server http://ftp.lyx.org/pub/lyx/devel/win_deps)
+               set(GNUWIN32_DIR ${LYX_DEPENDENCIES_DIR}/lyx-windows-deps-msvc2019)
+       elseif(MSVC_VERSION GREATER_EQUAL 1900 AND NOT "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" MATCHES "x64")
+               set(LYX_DEPENDENCIES_DIR ${TOP_BINARY_DIR}/msvc2015-deps)
+               set(deps_files lyx-windows-deps-msvc2015.zip)
+               set(deps_server http://ftp.lyx.org/pub/lyx/devel/win_deps)
+               set(GNUWIN32_DIR ${LYX_DEPENDENCIES_DIR}/lyx-windows-deps-msvc2015)
+       else()
+               message(FATAL_ERROR "error: no dependency package known for the selected MSVC version.")
+       endif()
+       message(STATUS "Using downloaded dependencies in ${LYX_DEPENDENCIES_DIR}")
+       foreach(it ${deps_files})
+               set(already_downloaded already_downloaded-NOTFOUND CACHE PATH "downloaded" FORCE)
+               find_file(already_downloaded ${it} "${LYX_DEPENDENCIES_DIR}/download")
+               if(NOT already_downloaded)
+                       message(STATUS "Downloading ${it} ...")
+                       file(DOWNLOAD ${deps_server}/${it} ${LYX_DEPENDENCIES_DIR}/download/${it} SHOW_PROGRESS STATUS status LOG log)
+                       list(GET status 0 status_code)
+                       list(GET status 1 status_string)
+                       if(NOT status_code EQUAL 0)
+                               file(REMOVE ${LYX_DEPENDENCIES_DIR}/${it})
+                               message(FATAL_ERROR "error: downloading '${it}' failed. status_code: ${status_code}, status_string: ${status_string}. \nLog: ${log} ")
+                       endif()
+                       execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${LYX_DEPENDENCIES_DIR}/download/${it}
+                                       WORKING_DIRECTORY ${LYX_DEPENDENCIES_DIR})
+               endif()
+       endforeach()
+endif()
+
+# Try to get some information from configure.ac
 include(LyXPaths)
 
 
@@ -274,6 +317,11 @@ if (LYX_ENABLE_VALGRIND_TESTS)
                message(FATAL_ERROR "Cannot use valgrind tests, executable valgrind is missing. Please disable LYX_ENABLE_VALGRIND_TESTS")
        endif()
 endif()
+if (LYX_DEBUG_GLIBC OR LYX_DEBUG_GLIBC_PEDANTIC OR LYX_STDLIB_DEBUG)
+  if (LYX_EXTERNAL_BOOST)
+    message(FATAL_ERROR "Using external boost not compatible with debug mode for stdlib")
+  endif()
+endif()
 
 if(LYX_DMG)
        set(LYX_BUNDLE ON)
@@ -303,40 +351,6 @@ else()
        set(LYX_MERGE_REBUILD OFF)
 endif()
 
-if(LYX_DEPENDENCIES_DOWNLOAD)
-       message(STATUS)
-       if(MSVC14)
-               set(LYX_DEPENDENCIES_DIR ${TOP_BINARY_DIR}/msvc2015-deps)
-               set(deps_files lyx-windows-deps-msvc2015.zip)
-               set(deps_server http://ftp.lyx.de/LyX-Windows-Deps)
-               set(GNUWIN32_DIR ${LYX_DEPENDENCIES_DIR}/lyx-windows-deps-msvc2015)
-       elseif(MSVC10)
-               set(LYX_DEPENDENCIES_DIR ${TOP_BINARY_DIR}/msvc2010-deps)
-               set(deps_files lyx-windows-deps-msvc2010.zip)
-               set(deps_server http://ftp.lyx.de/LyX-Windows-Deps)
-               set(GNUWIN32_DIR ${LYX_DEPENDENCIES_DIR}/lyx-windows-deps-msvc2010)
-       else()
-               message(FATAL_ERROR "error: no dependency package known for the selected MSVC version.")
-       endif()
-    message(STATUS "Using downloaded dependencies in ${LYX_DEPENDENCIES_DIR}")
-       foreach(it ${deps_files})
-               set(already_downloaded already_downloaded-NOTFOUND CACHE PATH "downloaded" FORCE)
-               find_file(already_downloaded ${it} "${LYX_DEPENDENCIES_DIR}/download")
-               if(NOT already_downloaded)
-                       message(STATUS "Downloading ${it} ...")
-                       file(DOWNLOAD ${deps_server}/${it} ${LYX_DEPENDENCIES_DIR}/download/${it} SHOW_PROGRESS STATUS status LOG log)
-                       list(GET status 0 status_code)
-                       list(GET status 1 status_string)
-                       if(NOT status_code EQUAL 0)
-                               file(REMOVE ${LYX_DEPENDENCIES_DIR}/${it})
-                               message(FATAL_ERROR "error: downloading '${it}' failed. status_code: ${status_code}, status_string: ${status_string}. \nLog: ${log} ")
-                       endif()
-                       execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${LYX_DEPENDENCIES_DIR}/download/${it}
-                                     WORKING_DIRECTORY ${LYX_DEPENDENCIES_DIR})
-               endif()
-       endforeach()
-endif()
-
 message(STATUS)
 
 set(EXECUTABLE_OUTPUT_PATH  ${TOP_BINARY_DIR}/bin)
@@ -660,6 +674,19 @@ else()
   set(LYX_CXX_FLAGS "")
 endif()
 
+if (LYX_DEBUG_SANITIZE MATCHES "ADDRESS")
+    set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
+    message(STATUS)
+    message(STATUS "Address sanitizer enabled. Usage:")
+    message(STATUS "    wget https://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/asan/scripts/asan_symbolize.py")
+    message(STATUS "    chmod  +x ./asan_symbolize.py")
+    message(STATUS "    ./bin/${_lyx} 2>&1 | ./asan_symbolize.py  | c++filt ")
+    message(STATUS)
+elseif (LYX_DEBUG_SANITIZE MATCHES "UNSPECIFIED")
+    set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -fsanitize=undefined -fno-omit-frame-pointer")
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fno-omit-frame-pointer")
+endif()
+
 if(MSVC)
   if (CXX11_FLAG MATCHES "\\+\\+([0-9]+)")
     set(CMAKE_CXX_STANDARD ${CMAKE_MATCH_1})
@@ -685,7 +712,14 @@ else()
        # The following setting with LYX_GCC11_MODE is needed because cmake does not honor
        # CMAKE_CXX_STANDARD while performing tests like
        # check_cxx_source_compiles("..." HAVE_DEF_MAKE_UNIQUE)
-       set(LYX_CXX_FLAGS "-Wall -Wextra -Wno-deprecated-copy ${LYX_GCC11_MODE}${LYX_CXX_FLAGS}")
+       include(CheckCXXCompilerFlag)
+       unset(CHECK_WNODEPRECATEDCOPY_FLAG CACHE)
+       CHECK_CXX_COMPILER_FLAG("-Wdeprecated-copy" CHECK_WNODEPRECATEDCOPY_FLAG)
+       if(${CHECK_WNODEPRECATEDCOPY_FLAG})
+               set(LYX_CXX_FLAGS "-Wall -Wextra -Wno-deprecated-copy ${LYX_GCC11_MODE}${LYX_CXX_FLAGS}")
+       else()
+               set(LYX_CXX_FLAGS "-Wall -Wextra ${LYX_GCC11_MODE}${LYX_CXX_FLAGS}")
+       endif()
        if(LYX_STDLIB_DEBUG)
          set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
         else()
@@ -705,16 +739,6 @@ else()
        endif()
 endif()
 
-if(LYX_ASAN)
-    set(CMAKE_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer -g ${CMAKE_CXX_FLAGS}")
-    message(STATUS)
-    message(STATUS "Address sanitizer enabled. Usage:")
-    message(STATUS "    wget https://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/asan/scripts/asan_symbolize.py")
-    message(STATUS "    chmod  +x ./asan_symbolize.py")
-    message(STATUS "    ./bin/${_lyx} 2>&1 | ./asan_symbolize.py  | c++filt ")
-    message(STATUS)
-endif()
-
 set(LYX_CXX_FLAGS_EXTRA "" CACHE STRING "Desired semicolon separated list of extra cxx compile flags, like '-Werror'")
 mark_as_advanced(LYX_CXX_FLAGS_EXTRA)
 if(LYX_CXX_FLAGS_EXTRA)
@@ -729,36 +753,63 @@ endif()
 
 set(min_qt5_version "5.6")
 if(LYX_USE_QT MATCHES "AUTO")
-       # try qt5 first
-       find_package(Qt5Core CONFIG QUIET)
-       if(Qt5Core_FOUND)
-               set(LYX_USE_QT "QT5" CACHE STRING "Valid qt version" FORCE)
+       # try qt6 first
+       find_package(Qt6Core CONFIG QUIET)
+       if (Qt6Core_Found)
+               set(LYX_USE_QT "QT6" CACHE STRING "Valid qt version" FORCE)
                message(STATUS "Qt5Core_VERSION = ${Qt5Core_VERSION}")
-               if(Qt5Core_VERSION VERSION_LESS ${min_qt5_version})
-                       find_package(Qt4 "4.5.0" QUIET)
-                       if(QT4_FOUND)
-                               set(LYX_USE_QT "QT4" CACHE STRING "Valid qt version" FORCE)
+       else()
+               find_package(Qt5Core CONFIG QUIET)
+               if(Qt5Core_FOUND)
+                       set(LYX_USE_QT "QT5" CACHE STRING "Valid qt version" FORCE)
+                       message(STATUS "Qt5Core_VERSION = ${Qt5Core_VERSION}")
+                       if(Qt5Core_VERSION VERSION_LESS ${min_qt5_version})
+                               message(FATAL_ERROR "No appropriate QT-version found")
                        endif()
+               else()
+                       message(FATAL_ERROR "No appropriate QT-version found")
                endif()
-       else()
-               set(LYX_USE_QT "QT4" CACHE STRING "Valid qt version" FORCE)
        endif()
 endif()
-if(LYX_USE_QT MATCHES "QT5")
+
+set(QtCore5CompatLibrary)
+set(QtCore5CompatModule)
+if(LYX_USE_QT MATCHES "QT6|QT5")
+       if (LYX_USE_QT MATCHES "QT6")
+               set(QtVal "Qt6")
+               macro (qt_add_resources)
+                       Qt6_add_resources(${ARGN})
+               endmacro()
+               macro (qt_wrap_uifiles)
+                       Qt6_wrap_ui(${ARGN})
+               endmacro()
+       else()
+               set(QtVal "Qt5")
+               macro (qt_add_resources)
+                       Qt5_add_resources(${ARGN})
+               endmacro()
+               macro (qt_wrap_uifiles)
+                       Qt5_wrap_ui(${ARGN})
+               endmacro()
+       endif()
        # set QPA_XCB if QT uses X11
-       find_package(Qt5Core CONFIG REQUIRED)
-       if (Qt5Core_FOUND)
-               find_package(Qt5Widgets CONFIG REQUIRED)
+       find_package(${QtVal}Core CONFIG REQUIRED)
+       if (${QtVal}Core_FOUND)
+               find_package(${QtVal}Widgets CONFIG REQUIRED)
                if(APPLE)
-                       find_package(Qt5MacExtras CONFIG REQUIRED)
+                       if (LYX_USE_QT MATCHES "QT6")
+                               find_package(${QtVal}MacExtras CONFIG QUIET)
+                       else()
+                               find_package(${QtVal}MacExtras CONFIG REQUIRED)
+                       endif()
                endif()
-               find_package(Qt5X11Extras CONFIG QUIET)
-               find_package(Qt5WinExtras CONFIG QUIET)
-               set(QTVERSION ${Qt5Core_VERSION})
+               find_package(${QtVal}X11Extras CONFIG QUIET)
+               find_package(${QtVal}WinExtras CONFIG QUIET)
+               set(QTVERSION ${${QtVal}Core_VERSION})
                if (QTVERSION VERSION_LESS ${min_qt5_version})
                        message(STATUS "QTVERSION = \"${QTVERSION}\"")
-                       message(STATUS "This version is not recommended, try either option -DLYX_USE_QT=QT4 or")
-                       message(STATUS "install QT-Version >= \"${min_qt5_version}\"")
+                       message(STATUS "This version is not recommended,")
+                       message(STATUS "please install QT-Version >= \"${min_qt5_version}\"")
                        # see thread in lyx-devel list
                        # From: Jean-Pierre Chrétien <jeanpierre.chretien@free.fr>
                        # Date 11.03.2017
@@ -767,38 +818,21 @@ if(LYX_USE_QT MATCHES "QT5")
                endif()
                macro (qt_use_modules lyxtarget)
                        foreach (_tg ${ARGN})
-                               find_package(Qt5${_tg} CONFIG REQUIRED)
-                               target_link_libraries(${lyxtarget} Qt5::${_tg})
+                               find_package(${QtVal}${_tg} CONFIG REQUIRED)
+                               target_link_libraries(${lyxtarget} ${QtVal}::${_tg})
                        endforeach()
                endmacro()
-               macro (qt_add_resources)
-                       qt5_add_resources(${ARGN})
-               endmacro()
-               macro (qt_wrap_uifiles)
-                       qt5_wrap_ui(${ARGN})
-               endmacro()
                message(STATUS "Found Qt-Version ${QTVERSION}")
                if(WIN32)
-                       set(LYX_QTMAIN_LIBRARY ${Qt5Core_QTMAIN_LIBRARIES})
+                       set(LYX_QTMAIN_LIBRARY ${${QtVal}Core_QTMAIN_LIBRARIES})
+               endif()
+               if (LYX_USE_QT MATCHES "QT6")
+                       get_target_property(QT_MOC_EXECUTABLE Qt6::moc LOCATION)
+                       find_package(Qt6 COMPONENTS Core5Compat REQUIRED)
+                       include_directories(${Qt6Core5Compat_INCLUDE_DIRS})
+                       set(QtCore5CompatLibrary Qt6::Core5Compat)
+                       set(QtCore5CompatModule Core5Compat)
                endif()
-       endif()
-elseif(LYX_USE_QT MATCHES "QT4")
-       if(LYX_XMINGW)
-               set(QT_MINGW_DIR ${LYX_QT4} CACHE PATH "Qt for Mingw" FORCE)
-               list(APPEND CMAKE_FIND_ROOT_PATH ${QT_MINGW_DIR} ${GNUWIN32_DIR})
-       endif()
-       find_package(Qt4 "4.5.0" REQUIRED)
-       macro (qt_use_modules)
-       endmacro()
-       macro (qt_add_resources)
-               qt4_add_resources(${ARGN})
-       endmacro()
-       macro (qt_wrap_uifiles)
-               qt4_wrap_ui(${ARGN})
-       endmacro()
-        set(LYX_QTMAIN_LIBRARY ${QT_QTSVG_LIBRARY})
-       if(WIN32)
-               list(APPEND LYX_QTMAIN_LIBRARY ${QT_QTMAIN_LIBRARIES})
        endif()
 else()
   message(FATAL_ERROR "Unhandled value for LYX_USE_QT (${LYX_USE_QT})")
@@ -927,6 +961,15 @@ if(NOT LYX_EXTERNAL_DTL)
   add_subdirectory(3rdparty/dtl)
 endif()
 
+# Set only include path.
+# Use internal boost, which is known to exist
+# we don't need any libraries
+set(Lyx_Boost_Libraries)
+add_definitions(-DBOOST_USER_CONFIG=<config.h>)
+include_directories(${TOP_SRC_DIR}/3rdparty/boost)
+
+include_directories(${TOP_SRC_DIR}/3rdparty/nod)
+
 if(WIN32)
        if(LYX_CONSOLE)
                set(LYX_QTMAIN_LIBRARY)
@@ -978,9 +1021,9 @@ if(LYX_PCH)
                                COMPILE_FLAGS "/Ycconfig.h /Fp\$(IntDir)/config.pch")
                        set(${name_}_sources ${${name_}_sources} ${TOP_BINARY_DIR}/config_pch.cpp
                                ${TOP_BINARY_DIR}/pcheaders.h)
-                       set(CMAKE_CXX_FLAGS_DEBUG       "${CMAKE_CXX_FLAGS_DEBUG} /DLYX_PCH_STL /DLYX_PCH_QT")
-                       set(CMAKE_CXX_FLAGS_RELEASE     "${CMAKE_CXX_FLAGS_RELEASE} /DLYX_PCH_STL /DLYX_PCH_QT")
-                       set(CMAKE_CXX_FLAGS_MINSIZEREL  "${CMAKE_CXX_FLAGS_MINSIZEREL} /DLYX_PCH_STL")
+                       set(CMAKE_CXX_FLAGS_DEBUG       "${CMAKE_CXX_FLAGS_DEBUG} /DLYX_PCH_STL /DLYX_PCH_BOOST /DLYX_PCH_QT")
+                       set(CMAKE_CXX_FLAGS_RELEASE     "${CMAKE_CXX_FLAGS_RELEASE} /DLYX_PCH_STL /DLYX_PCH_BOOST /DLYX_PCH_QT")
+                       set(CMAKE_CXX_FLAGS_MINSIZEREL  "${CMAKE_CXX_FLAGS_MINSIZEREL} /DLYX_PCH_STL /DLYX_PCH_BOOST")
                endmacro(lyx_add_msvc_pch)
                macro(lyx_add_gcc_pch name_)
                endmacro()
@@ -988,7 +1031,7 @@ if(LYX_PCH)
                macro(lyx_add_msvc_pch name_)
                endmacro()
                macro(lyx_add_gcc_pch name_)
-                       add_definitions(-DLYX_PCH_STL -DLYX_PCH_QT)
+                       add_definitions(-DLYX_PCH_STL -DLYX_PCH_BOOST -DLYX_PCH_QT)
                        ADD_PRECOMPILED_HEADER(${name_} ${TOP_BINARY_DIR}/config_pch.cpp ${TOP_BINARY_DIR}/config.h.gch)
                endmacro()
        endif()
@@ -1048,12 +1091,19 @@ if(MSVC)
 
        endif()
 
-       if (NOT Qt5Core_FOUND)
+       if (NOT (Qt5Core_FOUND OR Qt6Core_FOUND))
                set(CMAKE_CXX_FLAGS_DEBUG      "${CMAKE_CXX_FLAGS_DEBUG} /Zc:wchar_t-")
                set(CMAKE_CXX_FLAGS_RELEASE    "${CMAKE_CXX_FLAGS_RELEASE} /Zc:wchar_t-")
                set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /Zc:wchar_t-")
        endif()
 
+       if (MSVC_VERSION GREATER_EQUAL 1914)
+               # Ensure the __cplusplus macro is set to a sensible value.
+               set(CMAKE_CXX_FLAGS_DEBUG      "${CMAKE_CXX_FLAGS_DEBUG} /Zc:__cplusplus")
+               set(CMAKE_CXX_FLAGS_RELEASE    "${CMAKE_CXX_FLAGS_RELEASE} /Zc:__cplusplus")
+               set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /Zc:__cplusplus")
+       endif()
+
        message(STATUS "----- Warning level      : ${CMAKE_CXX_WARNING_LEVEL}  ${WARNING_LEVEL_MESSAGE}")
        message(STATUS "----- Warnings as errors : ${MSVC_W_ERROR}")
        message(STATUS "----- Warnings disabled  : ${MSVC_W_DISABLE}")
@@ -1123,7 +1173,7 @@ unset(opts)
 unset(tmp_vi)
 
 if(QTVERSION MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+).*")
-       MATH(EXPR QT4_VERSION "(${CMAKE_MATCH_1}<<16)|(${CMAKE_MATCH_2}<<8)|${CMAKE_MATCH_3}")
+       MATH(EXPR QTx_VERSION "(${CMAKE_MATCH_1}<<16)|(${CMAKE_MATCH_2}<<8)|${CMAKE_MATCH_3}")
 endif()