X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=CMakeLists.txt;h=5e9c7c860b93ae77a46cdb056819eb05076fc075;hb=157d67d55d38ecd1893c0ec5f46d688a4aa91b42;hp=65d3a6e06ef9a998b2a129232a8dfd71851e2f73;hpb=adf62c31843c94bc5bbb3531bfe66a28ca9ee3be;p=features.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 65d3a6e06e..5e9c7c860b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 QT4 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) @@ -247,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) @@ -309,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) @@ -666,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}) @@ -691,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() @@ -711,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) @@ -735,32 +753,62 @@ 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}) + find_package(Qt4 "4.5.0" QUIET) + if(QT4_FOUND) + set(LYX_USE_QT "QT4" CACHE STRING "Valid qt version" FORCE) + endif() endif() + else() + set(LYX_USE_QT "QT4" CACHE STRING "Valid qt version" FORCE) 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") @@ -773,19 +821,20 @@ 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") @@ -1063,7 +1112,7 @@ 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-")