]> git.lyx.org Git - lyx.git/blobdiff - CMakeLists.txt
Simplify
[lyx.git] / CMakeLists.txt
index 2bf99209c5d9a94758506a9a805f7928174d611b..38e11b8a0b4707a936f1655be47d17111ca44503 100644 (file)
@@ -2,12 +2,11 @@
 # Licence details can be found in the file COPYING.
 #
 # Copyright (c) 2006-2011 Peter Kümmel, <syntheticpp@gmx.net>
-# Copyright (c) 2008-2011 Kornel Benko, <Kornel.Benko@berlin.de>
+# Copyright (c) 2008-2020 Kornel Benko, <Kornel.Benko@berlin.de>
 
 cmake_minimum_required(VERSION 3.1.0)
 
 set(LYX_PROJECT LyX)
-
 # Instruct cmake to not use gnu extensions,
 # this prevents the mix of '-std=c++*' and '-std=gnu++*' flags
 set(CMAKE_CXX_EXTENSIONS OFF)
@@ -51,6 +50,9 @@ if(COMMAND cmake_policy)
        if(POLICY CMP0075)
                cmake_policy(SET CMP0075 NEW)
        endif()
+       if(POLICY CMP0077)
+               cmake_policy(SET CMP0077 NEW)
+       endif()
 endif()
 
 set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
@@ -75,9 +77,9 @@ if(NOT help AND NOT HELP)
   # 'project' triggers the searching for a compiler
   project(${LYX_PROJECT})
   if (CMAKE_COMPILER_IS_GNUCXX)
-    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.0")
+    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9")
       message(STATUS "Gnu CXX compiler version = ${CMAKE_CXX_COMPILER_VERSION}")
-      message(STATUS "is too old, should be >= 4.0")
+      message(STATUS "is too old, should be >= 4.9")
       message(FATAL_ERROR "Exiting")
     endif()
   endif()
@@ -102,9 +104,6 @@ endif()
 include(LyXMacros)
 include(LyXDestinations)
 
-# Try to get some informations from configure.ac
-include(LyXPaths)
-
 # Value of USE_POSIX_PACKAGING is needed in determineversionandbuildtype()
 if(WIN32)
        set(CMAKE_PREFIX_PATH Specify-path-to-Qt CACHE PATH "Used Qt version")
@@ -136,33 +135,56 @@ list(GET _version_list 4 LYX_RELEASE_PATCH)
 # 3. parameter: default value, ON or OFF
 # 4. parameter: system on which option is used: ALL, GCC, MSVC, ...
 
+# Usage LYX_COMBO
+# 1. parameter: name without prefix 'LYX_'
+# 2. parameter: description
+# 3. parameter: default value
+# 4-n parameter: possible other string values
+
+LYX_OPTION_INIT()
+LYX_COMBO(ENABLE_BUILD_TYPE  "Allows to tweak the compiled code" AUTO release prerelease development gprof)
+
+if(LYX_ENABLE_BUILD_TYPE MATCHES "AUTO")
+  message(STATUS "Selecting build type defaults from configure.ac")
+else()
+  set(LYX_BUILD_TYPE "${LYX_ENABLE_BUILD_TYPE}")
+  message(STATUS "Selecting build type defaults from LYX_ENABLE_BUILD_TYPE")
+endif()
 
 # Select some defaults depending on LYX_BUILD_TYPE
+# they can always be overwritten by the respective command line settings
+# These settings are only effective on fresh(==empty) CMakeCache.txt
 if(LYX_BUILD_TYPE STREQUAL "development")
   set(DefaultLyxDebug ON)
   set(DefaultLyxRelease OFF)
   set(DefaultLyxStdlibDebug ON)
   set(DefaultLyxEnableAssertions ON)
+  set(DefaultLyxProfile OFF)
+  set(DefaultExternalLibs OFF)
 elseif(LYX_BUILD_TYPE STREQUAL "prerelease")
   set(DefaultLyxDebug OFF)
   set(DefaultLyxRelease OFF)
   set(DefaultLyxStdlibDebug OFF)
   set(DefaultLyxEnableAssertions OFF)
+  set(DefaultLyxProfile OFF)
+  set(DefaultExternalLibs ON)
 elseif(LYX_BUILD_TYPE STREQUAL "release")
   set(DefaultLyxDebug OFF)
   set(DefaultLyxRelease ON)
   set(DefaultLyxStdlibDebug OFF)
   set(DefaultLyxEnableAssertions OFF)
+  set(DefaultLyxProfile OFF)
+  set(DefaultExternalLibs ON)
+elseif(LYX_BUILD_TYPE STREQUAL "gprof")
+  set(DefaultLyxDebug ON)
+  set(DefaultLyxRelease OFF)
+  set(DefaultLyxStdlibDebug OFF)
+  set(DefaultLyxEnableAssertions OFF)
+  set(DefaultLyxProfile ON)
+  set(DefaultExternalLibs OFF)
 else()
-  message(FATAL_ERROR "Unknown build type (${LYX_BUILD_TYPE}) encountered")
+  message(FATAL_ERROR "Invalid build type (${LYX_BUILD_TYPE}) encountered")
 endif()
-# Usage LYX_COMBO
-# 1. parameter: name without prefix 'LYX_'
-# 2. parameter: description
-# 3. parameter: default value
-# 4-n parameter: possible other string values
-
-LYX_OPTION_INIT()
 
 # Options for all compilers/systems
 LYX_OPTION(CPACK            "Use the CPack management (Implies LYX_INSTALL option)" OFF ALL)
@@ -195,24 +217,25 @@ 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)
-LYX_OPTION(EXTERNAL_Z       "OFF := Build 3rdparty lib zlib" ON ALL)
-LYX_OPTION(EXTERNAL_DTL     "OFF := Build 3rdparty commands dt2dv and dv2dt" ON ALL)
-LYX_OPTION(EXTERNAL_ICONV   "OFF := Build 3rdparty lib iconvlib" ON ALL)
-LYX_OPTION(EXTERNAL_HUNSPELL "OFF := Build 3rdparty lib hunspelllib" ON ALL)
+LYX_OPTION(EXTERNAL_Z       "OFF := Build 3rdparty lib zlib" ${DefaultExternalLibs} ALL)
+LYX_OPTION(EXTERNAL_DTL     "OFF := Build 3rdparty commands dt2dv and dv2dt" ${DefaultExternalLibs} ALL)
+LYX_OPTION(EXTERNAL_ICONV   "OFF := Build 3rdparty lib iconvlib" ${DefaultExternalLibs} ALL)
+LYX_OPTION(EXTERNAL_HUNSPELL "OFF := Build 3rdparty lib hunspelllib" ${DefaultExternalLibs} ALL)
 LYX_COMBO(EXTERNAL_MYTHES   "OFF := Build 3rdparty lib mytheslib" AUTO OFF ON)
 
 # GCC specific
-LYX_OPTION(PROFILE              "Build with options for gprof" OFF GCC)
-LYX_OPTION(EXTERNAL_BOOST       "Use external boost" OFF GCC)
+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)
+LYX_OPTION(DEBUG_GLIBC_ASSERTIONS "Enable stdlib-assertions debug mode" OFF GCC)
 LYX_OPTION(STDLIB_DEBUG         "Use debug stdlib" ${DefaultLyxStdlibDebug} GCC)
 
 # MSVC specific
@@ -225,6 +248,51 @@ 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)
 
+# 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)
+
 
 if(help OR HELP)
        message(STATUS)
@@ -232,6 +300,8 @@ if(help OR HELP)
        message(STATUS)
        LYX_OPTION_LIST_ALL(help)
        message(STATUS)
+       unset(help CACHE)
+       unset(HELP CACHE)
        RETURN()
 endif()
 
@@ -282,40 +352,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)
@@ -353,13 +389,7 @@ unset(LYX_GCC11_MODE)
 if(UNIX OR MINGW)
        if (CMAKE_CXX_COMPILER_ID MATCHES "^([cC]lang|AppleClang)$")
          # ignore the GCC_VERSION for clang
-         # and use the resulting CXX11_STD_REGEX found in FindCXX11Compiler.cmake
          message(STATUS "Using clang")
-         if(CXX11_STD_REGEX)
-           set(LYX_USE_STD_REGEX 1)
-         else()
-           set(LYX_USE_STD_REGEX 0)
-         endif()
        else()
          execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpfullversion OUTPUT_VARIABLE GCC_VERSION ERROR_VARIABLE _error RESULT_VARIABLE _err OUTPUT_STRIP_TRAILING_WHITESPACE)
          #message(STATUS "dumpfullversion: error = ${_error}, result = ${_err}")
@@ -369,14 +399,8 @@ if(UNIX OR MINGW)
            #message(STATUS "dumpversion: error = ${_error}, result = ${_err}")
          endif()
          message(STATUS "Using GCC version ${GCC_VERSION}")
-         if(GCC_VERSION VERSION_LESS 4.6)
-               message(FATAL_ERROR "gcc >= 4.6 is required.")
-         elseif(GCC_VERSION VERSION_LESS 4.9)
-               # <regex> in gcc is unusable in versions less than 4.9.0
-               # see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631
-               set(LYX_USE_STD_REGEX 0)
-         else()
-               set(LYX_USE_STD_REGEX 1)
+         if(GCC_VERSION VERSION_LESS 4.9)
+               message(FATAL_ERROR "gcc >= 4.9 is required.")
          endif()
        endif()
        set(LYX_GCC11_MODE "${CXX11_FLAG}")
@@ -384,9 +408,6 @@ else()
        if(MSVC_VERSION LESS 1900)
                # Drop support for msvc versions prior to 1900 (Visual Studio 2015)
                message(FATAL_ERROR "Visual Studio >= 2015 is required.")
-               set(LYX_USE_STD_REGEX 0)
-       else()
-               set(LYX_USE_STD_REGEX 1)
        endif()
 endif()
 
@@ -639,6 +660,26 @@ else()
        set(LYX_DEBUG ON)
 endif()
 
+set(min_qt5_version "5.6")
+if(LYX_USE_QT MATCHES "AUTO")
+       # 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}")
+       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()
+       endif()
+endif()
 
 # When shared libs are supported enable this option
 #LYX_OPTION(SHARED_LIBRARIES "Build shared libraries" OFF ALL)
@@ -654,6 +695,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})
@@ -664,24 +718,43 @@ else()
        if(NOT LYX_QUIET)
                set(CMAKE_VERBOSE_MAKEFILE ON)
        endif()
-       set(LYX_CXX_FLAGS "-Wall -Wunused-parameter ${LYX_GCC11_MODE}${LYX_CXX_FLAGS}")
-       if(LYX_GCC11_MODE MATCHES "\\+\\+(14|11|98)")
+       if(LYX_GCC11_MODE MATCHES "\\+\\+([0-9][0-9])")
          # Thanks to Brad King <brad.king@kitware.com>
          # for the pointer to https://cmake.org/cmake/help/v3.6/variable/CMAKE_CXX_STANDARD.html
          # This allows us to use QT5.7 with recent g++ (version >= 4.9) compilers
          # and still use our own c++ extension tests
-         set(CMAKE_CXX_STANDARD ${CMAKE_MATCH_1})
-         message(STATUS "CMAKE_CXX_STANDARD set to ${CMAKE_CXX_STANDARD}")
+         set(std_num ${CMAKE_MATCH_1})
+         set(CMAKE_CXX_STANDARD ${std_num})
+       else()
+         message(STATUS "Setting CMAKE_CXX_STANDARD 11 as fallback")
+         set(CMAKE_CXX_STANDARD 11)
+         set(LYX_GCC11_MODE "--std=c++11")
        endif()
-       if(LYX_STDLIB_DEBUG)
-         set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
-        else()
-          if(LYX_DEBUG_GLIBC)
-            set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG")
-          endif()
-          if(LYX_DEBUG_GLIBC_PEDANTIC)
-            set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG_PEDANTIC")
-          endif()
+       # 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)
+       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()
+       message(STATUS "LYX_USE_QT = ${LYX_USE_QT}")
+       if(LYX_USE_QT MATCHES "QT6")
+         if (LYX_DEBUG_GLIBC OR LYX_DEBUG_GLIBC_PEDANTIC)
+           message(WARNING "Compiling LyX with stdlib-debug and Qt6 library may lead to crashes. Consider dropping -DLYX_DEBUG_GLIBC=ON and -DLYX_DEBUG_GLIBC_PEDANTIC=ON")
+         endif()
+       endif()
+       if(LYX_STDLIB_DEBUG OR LYX_DEBUG_GLIBC_ASSERTIONS)
+         set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_ASSERTIONS")
+       endif()
+       if(LYX_DEBUG_GLIBC)
+         set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG")
+       endif()
+       if(LYX_DEBUG_GLIBC_PEDANTIC)
+         set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG_PEDANTIC")
        endif()
        set(CMAKE_CXX_FLAGS       "${LYX_CXX_FLAGS} -fno-strict-aliasing " CACHE STRING "Set CXX flags" FORCE)
        set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -D_DEBUG" CACHE STRING "Set debug flags" FORCE)
@@ -704,38 +777,44 @@ if(LYX_XMINGW)
        list(APPEND CMAKE_FIND_ROOT_PATH ${GNUWIN32_DIR})
 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)
-               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)
-                       endif()
-               endif()
+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(LYX_USE_QT "QT4" CACHE STRING "Valid qt version" FORCE)
+               set(QtVal "Qt5")
+               macro (qt_add_resources)
+                       Qt5_add_resources(${ARGN})
+               endmacro()
+               macro (qt_wrap_uifiles)
+                       Qt5_wrap_ui(${ARGN})
+               endmacro()
        endif()
-endif()
-if(LYX_USE_QT MATCHES "QT5")
        # 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
@@ -744,38 +823,28 @@ 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)
+                       # We don't know why QtZlib is included, and ideally we
+                       # would have a different fix than relying on this
+                       # variable (which as "Private" in the name indicates,
+                       # it might be a fragile workaround).
+                       # See ML discussion here:
+                       # https://www.mail-archive.com/search?l=mid&q=CAGU9VOqpkngYBumnNh%3DcuzQ585GsS7TJbhHa903nJSfy-davRg%40mail.gmail.com
+                       list(REMOVE_ITEM Qt6Core5Compat_INCLUDE_DIRS ${_Qt6ZlibPrivate_OWN_INCLUDE_DIRS})
+                       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})")
@@ -794,7 +863,7 @@ set(Include_used_spellchecker)   # String will be inserted into config.h
 
 if (LYX_EXTERNAL_MYTHES MATCHES "AUTO")
   # try system library first
-  find_package(MyThesLIB)
+  find_package(MYTHESLIB)
   if (MYTHESLIB_FOUND)
     set(LYX_EXTERNAL_MYTHES ON CACHE STRING "OFF:= Build 3rdparty mytheslib" FORCE)
   else()
@@ -802,7 +871,7 @@ if (LYX_EXTERNAL_MYTHES MATCHES "AUTO")
   endif()
 endif()
 if (LYX_EXTERNAL_MYTHES MATCHES "ON")
-  find_package(MyThesLIB REQUIRED)
+  find_package(MYTHESLIB REQUIRED)
 else()
   add_subdirectory(3rdparty/mythes)
 endif()
@@ -838,6 +907,7 @@ endforeach()
 
 if(GNUWIN32_DIR)
        list(APPEND CMAKE_PROGRAM_PATH "${GNUWIN32_DIR}/Python" )
+       list(APPEND CMAKE_PROGRAM_PATH "${GNUWIN32_DIR}/Perl/bin" )
 endif()
 
 # Search for python default version first
@@ -885,6 +955,8 @@ if(LYX_NLS)
 endif()
 
 if(LYX_EXTERNAL_ICONV)
+  # Possible remnants of previous run without external iconv
+  file(REMOVE_RECURSE "${CMAKE_BINARY_DIR}/libiconv" "${CMAKE_BINARY_DIR}/3rdparty/libiconv")
   find_package(ICONV REQUIRED)
 else()
   add_subdirectory(3rdparty/libiconv)
@@ -901,40 +973,14 @@ if(NOT LYX_EXTERNAL_DTL)
   add_subdirectory(3rdparty/dtl)
 endif()
 
-if(LYX_USE_STD_REGEX)
-  # 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)
-else()
-  # Using boost-regex
-  if(LYX_EXTERNAL_BOOST)
-    message(STATUS "Searching for external boost")
-    find_package(Boost COMPONENTS regex)
-    if(Boost_FOUND)
-      message(STATUS "Boost found")
-      message(STATUS "Boost-libs = ${Boost_LIBRARIES}")
-      set(Lyx_Boost_Libraries ${Boost_LIBRARIES})
-      if (LYX_STDLIB_DEBUG OR LYX_DEBUG_GLIBC OR LYX_DEBUG_GLIBC_PEDANTIC)
-       # Comment from  Jean-Marc Lasgouttes:
-       # In general, system boost libraries are incompatible with
-       # the use of stdlib-debug in libstdc++. See ticket #9736 for
-       # details.
-       message(FATAL_ERROR "Compiling LyX with stdlib-debug and system boost libraries may lead to crashes. Consider using '-DLYX_STDLIB_DEBUG=OFF -DLYX_DEBUG_GLIBC=OFF -DLYX_DEBUG_GLIBC_PEDANTIC=OFF' or using '-DLYX_EXTERNAL_BOOST=OFF'")
-      endif()
-    else()
-      message(FATAL_ERROR "Boost not found" ${Boost_ERROR_REASON})
-    endif()
-  else()
-    # Using included boost
-    set(Lyx_Boost_Libraries boost_regex)
-    add_definitions(-DBOOST_USER_CONFIG=<config.h>)
-    include_directories(${TOP_SRC_DIR}/3rdparty/boost)
-    add_subdirectory(3rdparty/boost "${TOP_BINARY_DIR}/3rdparty/boost")
-  endif()
-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)
@@ -1039,9 +1085,9 @@ if(MSVC)
                # add here warnings which should be disabled /wdXXXX
                set(MSVC_W_DISABLE "/wd4288 /wd4355 /wd4800 /wd4996 /wd4311 /wd4312 /wd4505 /wd4267 /wd4512 /wd4245 /wd4127 /wd4180 /wd4231")
 
-               set(CMAKE_CXX_FLAGS_DEBUG      "${CMAKE_CXX_FLAGS_DEBUG} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
-               set(CMAKE_CXX_FLAGS_RELEASE    "${CMAKE_CXX_FLAGS_RELEASE} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
-               set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
+               set(CMAKE_CXX_FLAGS_DEBUG      "${CMAKE_CXX_FLAGS_DEBUG} /W4 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
+               set(CMAKE_CXX_FLAGS_RELEASE    "${CMAKE_CXX_FLAGS_RELEASE} /W4 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
+               set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /W4 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
 
        else()
                set(CMAKE_CXX_WARNING_LEVEL 3 CACHE STRING "Warning level" FORCE)
@@ -1057,12 +1103,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}")
@@ -1132,11 +1185,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}")
-endif()
-
-if (NOT HAVE_REGEX)
-       set(LYX_USE_STD_REGEX 0)
+       MATH(EXPR QTx_VERSION "(${CMAKE_MATCH_1}<<16)|(${CMAKE_MATCH_2}<<8)|${CMAKE_MATCH_3}")
 endif()
 
 
@@ -1149,16 +1198,6 @@ endif ()
 add_custom_target (lyx_run_tests COMMAND ${cmd})
 set_target_properties(lyx_run_tests PROPERTIES FOLDER "tests")
 
-if(LYX_ASAN)
-    set(LYX_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer -g")
-    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/lyx2.2 2>&1 | ./asan_symbolize.py  | c++filt ")
-    message(STATUS)
-endif()
-
 if(LYX_INSTALL)
        if(${LYX_PYTHON_EXECUTABLE} MATCHES "-NOTFOUND")
                message(STATUS "Python required to create doc!")
@@ -1173,6 +1212,10 @@ include(../Install)
 
 # By running the URL tests first, time can be saved when running the ctests in
 # parallel since the URL tests take a long time to run (e.g. 10 minutes).
+
+# Needed, because of perl scripts in checkurls autotests and batchtests
+find_package(Perl REQUIRED)
+
 if(LYX_ENABLE_URLTESTS)
        add_subdirectory(development/checkurls "${TOP_BINARY_DIR}/checkurls")
 endif()
@@ -1238,4 +1281,10 @@ endif()
 # can be run last
 add_subdirectory(development/cmake/post_install)
 
+string(TIMESTAMP current_date "%Y-%m-%d %H:%M")
+execute_process(COMMAND ${LYX_GITVERSION} describe --tags
+       WORKING_DIRECTORY "${TOP_SRC_DIR}"
+       OUTPUT_VARIABLE current_version
+       OUTPUT_STRIP_TRAILING_WHITESPACE)
+file(APPEND "${TOP_BINARY_DIR}/Testing/IgnoredCount" "${current_date} ${current_version} Ignored tests = ${LYX_ignored_count}\n")
 message(STATUS)