# Copyright (C) 2023 Jakub Melka # # This file is part of PDF4QT. # # PDF4QT is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # with the written consent of the copyright owner, any later version. # # PDF4QT is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PDF4QT. If not, see . cmake_minimum_required(VERSION 3.16) set(PDF4QT_VERSION 1.4.0.0) message(STATUS "Build type - CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") project(PDF4QT VERSION ${PDF4QT_VERSION} LANGUAGES CXX) option(PDF4QT_INSTALL_DEPENDENCIES "Install dependencies" ON) option(PDF4QT_INSTALL_QT_DEPENDENCIES "Install Qt dependencies" ON) add_compile_definitions(PDF4QT_PROJECT_VERSION="${PDF4QT_VERSION}") add_compile_definitions(QT_NO_EMIT) if(WIN32 AND MSVC) option(PDF4QT_INSTALL_MSVC_REDISTRIBUTABLE "Install MSVC redistributable package" ON) option(PDF4QT_INSTALL_PREPARE_WIX_INSTALLER "Prepare Wix installer for Windows" ON) endif() option(PDF4QT_BUILD_ONLY_CORE_LIBRARY "Build only core library" OFF) set(PDF4QT_QT_ROOT "" CACHE PATH "Qt root directory") if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Installation directory" FORCE) endif() set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) include(GNUInstallDirs) if(PDF4QT_BUILD_ONLY_CORE_LIBRARY) find_package(Qt6 REQUIRED COMPONENTS Core Gui Svg Xml) else() find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Svg Xml PrintSupport TextToSpeech Test) endif() qt_standard_project_setup() find_package(OpenSSL REQUIRED) find_package(lcms REQUIRED) find_package(ZLIB REQUIRED) find_package(Freetype REQUIRED) find_package(OpenJPEG CONFIG REQUIRED) find_package(JPEG REQUIRED) find_package(PNG REQUIRED) find_package(blend2d CONFIG REQUIRED) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTORCC_OPTIONS "--threshold;0;--compress;9") if (MSVC) add_compile_options(/bigobj /W4 /wd5054 /wd4127 /wd4702) endif() if (MINGW) add_compile_options("-Wa,-mbig-obj") endif() if (UNIX AND NOT APPLE AND CMAKE_COMPILER_IS_GNUCXX) set(LINUX_GCC ON) endif() if (UNIX AND NOT APPLE) set(PDF4QT_LINUX ON) endif() if (LINUX_GCC) find_package(TBB REQUIRED) endif() option(PDF4QT_INSTALL_TO_USR "Install to usr directory" ON) if(PDF4QT_LINUX) set(PDF4QT_INSTALL_LIB_DIR_IMPL lib) set(PDF4QT_INSTALL_BIN_DIR_IMPL bin) # Check if VCPKG_OVERLAY_PORTS is set as an environment variable or a CMake argument if(NOT DEFINED ENV{VCPKG_OVERLAY_PORTS} AND NOT DEFINED VCPKG_OVERLAY_PORTS) message(WARNING "The VCPKG_OVERLAY_PORTS variable is not set! Application can crash in Open/Save dialog due to incompatible LIBPNG.") else() set(VCPKG_OVERLAY_PORTS_VALUE "$ENV{VCPKG_OVERLAY_PORTS}") if(DEFINED VCPKG_OVERLAY_PORTS) set(VCPKG_OVERLAY_PORTS_VALUE "${VCPKG_OVERLAY_PORTS}") endif() message(STATUS "The VCPKG_OVERLAY_PORTS variable is set to: ${VCPKG_OVERLAY_PORTS_VALUE}") endif() else() set(PDF4QT_INSTALL_LIB_DIR_IMPL bin) set(PDF4QT_INSTALL_BIN_DIR_IMPL bin) endif() if(PDF4QT_INSTALL_TO_USR) set(PDF4QT_INSTALL_LIB_DIR usr/${PDF4QT_INSTALL_LIB_DIR_IMPL}) set(PDF4QT_INSTALL_BIN_DIR usr/${PDF4QT_INSTALL_BIN_DIR_IMPL}) set(PDF4QT_INSTALL_SHARE_DIR usr/share) else() set(PDF4QT_INSTALL_LIB_DIR ${PDF4QT_INSTALL_LIB_DIR_IMPL}) set(PDF4QT_INSTALL_BIN_DIR ${PDF4QT_INSTALL_BIN_DIR_IMPL}) set(PDF4QT_INSTALL_SHARE_DIR share) endif() add_subdirectory(Pdf4QtLibCore) if(NOT PDF4QT_BUILD_ONLY_CORE_LIBRARY) add_subdirectory(Pdf4QtLibWidgets) add_subdirectory(CodeGenerator) add_subdirectory(JBIG2_Viewer) add_subdirectory(PdfExampleGenerator) add_subdirectory(PdfTool) add_subdirectory(UnitTests) add_subdirectory(Pdf4QtLibGui) add_subdirectory(Pdf4QtEditorPlugins) add_subdirectory(Pdf4QtEditor) add_subdirectory(Pdf4QtViewer) add_subdirectory(Pdf4QtPageMaster) add_subdirectory(Pdf4QtDiff) add_subdirectory(Pdf4QtLaunchPad) add_subdirectory(WixInstaller) endif() message("CMAKE_PREFIX_PATH = " ${CMAKE_PREFIX_PATH}) message("CMAKE_TOOLCHAIN_FILE = " ${CMAKE_TOOLCHAIN_FILE}) configure_file(version.txt.in version.txt) if(NOT PDF4QT_BUILD_ONLY_CORE_LIBRARY) if(WIN32) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Desktop/44x44/ RUNTIME DESTINATION ${PDF4QT_INSTALL_BIN_DIR}/assets/44x44 FILES_MATCHING PATTERN *.png) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Desktop/150x150/ RUNTIME DESTINATION ${PDF4QT_INSTALL_BIN_DIR}/assets/150x150 FILES_MATCHING PATTERN *.png) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/AppxManifest.xml.in ${CMAKE_CURRENT_BINARY_DIR}/AppxManifest.xml) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/AppxManifest.xml DESTINATION ${PDF4QT_INSTALL_BIN_DIR}) install(FILES assets/logo.png DESTINATION ${PDF4QT_INSTALL_BIN_DIR}/assets) else() configure_file(make-package.sh.in make-package.sh) install(FILES Desktop/io.github.JakubMelka.Pdf4qt.Pdf4QtDiff.desktop Desktop/io.github.JakubMelka.Pdf4qt.Pdf4QtPageMaster.desktop Desktop/io.github.JakubMelka.Pdf4qt.Pdf4QtViewer.desktop Desktop/io.github.JakubMelka.Pdf4qt.Pdf4QtEditor.desktop Desktop/io.github.JakubMelka.Pdf4qt.desktop DESTINATION ${PDF4QT_INSTALL_SHARE_DIR}/applications) install(FILES Desktop/io.github.JakubMelka.Pdf4qt.Pdf4QtDiff.svg Desktop/io.github.JakubMelka.Pdf4qt.Pdf4QtPageMaster.svg Desktop/io.github.JakubMelka.Pdf4qt.Pdf4QtViewer.svg Desktop/io.github.JakubMelka.Pdf4qt.Pdf4QtEditor.svg Desktop/io.github.JakubMelka.Pdf4qt.svg DESTINATION ${PDF4QT_INSTALL_SHARE_DIR}/icons/hicolor/scalable/apps) install(FILES Desktop/io.github.JakubMelka.Pdf4qt.appdata.xml DESTINATION ${PDF4QT_INSTALL_SHARE_DIR}/metainfo) install(FILES Desktop/128x128/io.github.JakubMelka.Pdf4qt.Pdf4QtDiff.png Desktop/128x128/io.github.JakubMelka.Pdf4qt.Pdf4QtPageMaster.png Desktop/128x128/io.github.JakubMelka.Pdf4qt.Pdf4QtViewer.png Desktop/128x128/io.github.JakubMelka.Pdf4qt.Pdf4QtEditor.png Desktop/128x128/io.github.JakubMelka.Pdf4qt.png DESTINATION ${PDF4QT_INSTALL_SHARE_DIR}/icons/hicolor/128x128/apps) endif() endif() if(PDF4QT_INSTALL_DEPENDENCIES AND NOT PDF4QT_BUILD_ONLY_CORE_LIBRARY) install(DIRECTORY ${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/ RUNTIME DESTINATION ${PDF4QT_INSTALL_LIB_DIR}/ FILES_MATCHING PATTERN "*.dll" PATTERN "*.so" PATTERN "*.dylib" ) if("${PDF4QT_QT_ROOT}" STREQUAL "") message(WARNING "Set variable PDF4QT_QT_ROOT to Qt6 root directory") endif() if(PDF4QT_INSTALL_QT_DEPENDENCIES) install(DIRECTORY ${PDF4QT_QT_ROOT}/bin/ RUNTIME DESTINATION ${PDF4QT_INSTALL_LIB_DIR}/ FILES_MATCHING REGEX "(Qt6Core|Qt6Gui|Qt6PrintSupport|Qt6Svg|Qt6TextToSpeech|Qt6Widgets|Qt6Xml|Qt6Multimedia|Qt6Network)\\..*" PATTERN "Debug" EXCLUDE PATTERN "*.pdb" EXCLUDE ) install(DIRECTORY ${PDF4QT_QT_ROOT}/plugins/platforms/ RUNTIME DESTINATION ${PDF4QT_INSTALL_LIB_DIR}/platforms/ FILES_MATCHING PATTERN "qwindows.dll" PATTERN "*.so" PATTERN "*.dylib" PATTERN "*.pdb" EXCLUDE ) install(DIRECTORY ${PDF4QT_QT_ROOT}/plugins/iconengines/ RUNTIME DESTINATION ${PDF4QT_INSTALL_LIB_DIR}/iconengines/ FILES_MATCHING REGEX "qsvgicon\\..*" PATTERN "*.pdb" EXCLUDE ) install(DIRECTORY ${PDF4QT_QT_ROOT}/plugins/imageformats/ RUNTIME DESTINATION ${PDF4QT_INSTALL_LIB_DIR}/imageformats/ FILES_MATCHING PATTERN "*.dll" PATTERN "*.so" PATTERN "*.dylib" REGEX "d\\..*" EXCLUDE PATTERN "*.pdb" EXCLUDE ) install(DIRECTORY ${PDF4QT_QT_ROOT}/plugins/styles/ RUNTIME DESTINATION ${PDF4QT_INSTALL_LIB_DIR}/styles/ FILES_MATCHING PATTERN "*.dll" PATTERN "*.so" PATTERN "*.dylib" REGEX "d\\..*" EXCLUDE PATTERN "*.pdb" EXCLUDE ) install(DIRECTORY ${PDF4QT_QT_ROOT}/plugins/texttospeech/ RUNTIME DESTINATION ${PDF4QT_INSTALL_LIB_DIR}/texttospeech/ FILES_MATCHING PATTERN "*.dll" PATTERN "*.so" PATTERN "*.dylib" REGEX "d\\..*" EXCLUDE PATTERN "*.pdb" EXCLUDE ) endif() if(WIN32 AND MSVC AND PDF4QT_INSTALL_MSVC_REDISTRIBUTABLE) if(DEFINED ENV{MSVC_REDISTRIBUTABLES_PATH}) set(MSVC_REDISTRIBUTABLES_PATH $ENV{MSVC_REDISTRIBUTABLES_PATH}) message(STATUS "Using existing MSVC Redistributable Package Path = ${MSVC_REDISTRIBUTABLES_PATH}") else() get_filename_component(MSVC_REDISTRIBUTABLES_PATH $ENV{VCToolsRedistDir}/$ENV{VSCMD_ARG_TGT_ARCH}/Microsoft.VC${MSVC_TOOLSET_VERSION}.CRT/ ABSOLUTE) message(STATUS "MSVC Redistributable Package Path = ${MSVC_REDISTRIBUTABLES_PATH}") endif() install(DIRECTORY ${MSVC_REDISTRIBUTABLES_PATH}/ RUNTIME DESTINATION ${PDF4QT_INSTALL_LIB_DIR}/ FILES_MATCHING PATTERN "*.dll" ) endif() endif() #macro(dump_variables) # message(STATUS "dump_variables------------------------------------------{") # get_cmake_property(_variableNames VARIABLES) # foreach (_variableName ${_variableNames}) # message(STATUS "${_variableName}=${${_variableName}}") # endforeach() # message(STATUS "dump_variables------------------------------------------}") #endmacro() # #dump_variables()