cmake_minimum_required(VERSION 3.16) project(vym LANGUAGES CXX) # See also https://doc.qt.io/qt-6.5/cmake-get-started.html set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if (CMAKE_SYSTEM_NAME STREQUAL Linux) message(STATUS "vym: using UNIX in cmake") # FIXME-0 still required? endif() set(QtComponents LinguistTools Network PrintSupport Qml Svg SvgWidgets Widgets Xml ) set(QtLibraries Qt6::Network Qt6::PrintSupport Qt6::Qml Qt6::Svg Qt6::SvgWidgets Qt6::Widgets Qt6::Xml ) # Switch on Debug mode on command line with # cmake -DCMAKE_BUILD_TYPE=Debug . # # or uncomment here: # set(CMAKE_BUILD_TYPE Debug) # Should no longer needed with qt_standard_project_setup() below... set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) # On Linux DBUS is used for IPC with vym # On openSUSE install it using: zypper install dbus-1-devel if (CMAKE_SYSTEM_NAME STREQUAL Linux) find_package(DBus1) if(DBus1_FOUND) message(STATUS "vym: Deteced Linux and DBUS1, adding DBUS interfaces") LIST(APPEND QtComponents DBus) LIST(APPEND QtLibraries Qt6::DBus) endif() endif() if(WIN32) set(OPENSSL_ROOT_DIR "C:/OpenSSL-Win64") find_package(OpenSSL) if( OPENSSL_FOUND ) include_directories(${OPENSSL_INCLUDE_DIRS}) link_directories(${OPENSSL_LIBRARIES}) message(STATUS "vym: Using OpenSSL version: ${OPENSSL_VERSION}") else() message(STATUS "vym: No openSSL found?!") # Error; with REQUIRED, pkg_search_module() will throw an error by it's own endif() set(CMAKE_INSTALL_DATAROOTDIR ".") endif() # https://doc.qt.io/qt-6/qt-standard-project-setup.html find_package(Qt6 REQUIRED COMPONENTS Core) qt_standard_project_setup( I18N_TRANSLATED_LANGUAGES el cs_CZ de en es fr hr_HR ia it ja pt_BR ru sv zh_CN zh_TW ) # FIXME add missing translations include(GNUInstallDirs) find_package(Qt6 COMPONENTS ${QtComponents} REQUIRED) list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_SOURCE_DIR}/forms") get_target_property(QtLibraryType Qt6::Widgets TYPE) if(QtLibraryType STREQUAL STATIC_LIBRARY) message(STATUS "vym: Static Qt linkage") list(APPEND QtLibraries Qt6::QSvgPlugin) endif() include_directories( ${CMAKE_SOURCE_DIR} ) # Source files file(GLOB VymSources RELATIVE ${CMAKE_SOURCE_DIR} "src/*.cpp") if(WIN32) list(APPEND VymSources src/mkdtemp.cpp vym.rc ) ADD_COMPILE_DEFINITIONS(_USE_MATH_DEFINES) endif() # Add DBUS interfaces to sources, if DBUS is available on platform if(DBus1_FOUND) list(APPEND VymSources src/dbus/adaptormodel.cpp src/dbus/adaptorvym.cpp) include_directories(${CMAKE_SOURCE_DIR}/src/dbus ${CMAKE_SOURCE_DIR}/src) ADD_COMPILE_DEFINITIONS(VYM_DBUS) endif() # Translations # # To update the translation files based on source code changes # add the targest update_translations and release_translations # # See also (for Qt 6): # https://doc.qt.io/qt-6/qtlinguist-cmake-qt-add-lrelease.html file(GLOB ts_files RELATIVE ${CMAKE_SOURCE_DIR} "lang/*.ts") #message(STATUS "vym: Creating ${CMAKE_BINARY_DIR}/translations") #file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/translations") set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/translations) qt_add_translations(TARGETS vym TS_FILE_DIR ${CMAKE_SOURCE_DIR}/lang # TS_OUTPUT_DIRECTORY in Qt 6.9 RESOURCE_PREFIX ${CMAKE_BINARY_DIR}/translations #QM_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/translations # Only in Qt 6.9 ) #qt_add_lrelease(target TS_FILES ${ts_files} QM_FILES_OUTPUT_VARIABLE ${CMAKE_BINARY_DIR}/translations) add_compile_definitions(CMAKE_SOURCE_DIR) message(STATUS "vym: CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}") message(STATUS "vym: ts_files: ${ts_files}") message(STATUS "vym: qm_files: ${qm_files}") # On Unix-like systems, place app data under a dedicated subdir # so runtime looks in .../share/vym for resources. set(VYM_SHARE_SUBDIR "vym") ADD_COMPILE_DEFINITIONS(VYMBASEDIR="${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/${VYM_SHARE_SUBDIR}") # FIXME qm_files needed? #add_executable(vym ${VymSources} vym.qrc ${qm_files}) qt_add_executable(vym MACOSX_BUNDLE ${VymSources} vym.qrc ${qm_files} ) # FIXME Icon missing? # FIXME Move add_executable to end? target_link_libraries(vym PRIVATE ${QtLibraries}) #FIXME shoud translations/ really be in CMAKE_BINARY_DIR? Or better e.g. in Contents? # add_custom_target(make-translations-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/translations) add_dependencies(vym make-translations-directory) if(WIN32) set_target_properties(vym PROPERTIES WIN32_EXECUTABLE TRUE) install(TARGETS vym DESTINATION "${CMAKE_INSTALL_PREFIX}") else() install(TARGETS vym DESTINATION bin) endif() if(APPLE) message(STATUS "vym: Detected APPLE") set(MACOSX_BUNDLE_EXECUTABLE_NAME ${PROJECT_NAME}) # Prepare Info.plist set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}" MACOSX_BUNDLE_BUNDLE_VERSION "2.9.5xx" #"${PROJECT_VERSION}" # FIXME Version missing^ MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}" MACOSX_BUNDLE_GUI_IDENTIFIER "org.insilmaril.vym" MACOSX_BUNDLE_ICON_FILE "icons/vym.icns" MACOSX_BUNDLE TRUE ) # Root paths to be copied to vym.app bundle (adjust if needed) set(DIRLIST demos doc exports flags icons macros styles) foreach(CURRENT_DIR ${DIRLIST}) set(SOURCE_DIR "${CMAKE_SOURCE_DIR}/${CURRENT_DIR}") set(RESOURCE_DIR "${CMAKE_BINARY_DIR}/vym.app/Contents/Resources/${CURRENT_DIR}") # --- 1. Add all subdirectories of SOURCE to the include path --- # Get all subdirectories recursively file(GLOB_RECURSE SOURCE_SUBDIRS LIST_DIRECTORIES true RELATIVE ${SOURCE_DIR} "${SOURCE_DIR}/*") set(INCLUDE_DIRS "") foreach(path ${SOURCE_SUBDIRS}) if(IS_DIRECTORY "${SOURCE_DIR}/${path}") list(APPEND INCLUDE_DIRS "${SOURCE_DIR}/${path}") endif() endforeach() # Add SOURCE itself too list(APPEND INCLUDE_DIRS "${SOURCE_DIR}") # Add them to your target target_include_directories(vym PRIVATE ${INCLUDE_DIRS}) message(STATUS "CURRENT_DIR=${CURRENT_DIR} includeDirs=${INCLUDE_DIRS}") # --- 2. Copy SOURCE_DIR -> RESOURCE_DIR at build time --- add_custom_command( TARGET vym POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${SOURCE_DIR}" "${RESOURCE_DIR}" COMMENT "Copying SOURCE directory ${SOURCE_DIR} to RESOURCE directory ${RESOURCE_DIR}..." ) endforeach() # Finally copy generated translations to bundle add_custom_command( TARGET vym POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_BINARY_DIR}/translations" "${RESOURCE_DIR}" COMMENT "Copying translations directory to RESOURCE directory ${RESOURCE_DIR}..." ) endif() message(STATUS "vym: CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}") message(STATUS "vym: CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}") message(STATUS "vym: CMAKE_INSTALL_DATAROOTDIR=${CMAKE_INSTALL_DATAROOTDIR}") install(DIRECTORY demos DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${VYM_SHARE_SUBDIR}) install(DIRECTORY doc DESTINATION ${CMAKE_INSTALL_DOCDIR} FILES_MATCHING PATTERN "*.pdf") install(FILES doc/vym.1.gz DESTINATION ${CMAKE_INSTALL_MANDIR}) install(FILES README.md LICENSE.txt DESTINATION ${CMAKE_INSTALL_DOCDIR}) install(DIRECTORY exports flags icons macros ${CMAKE_BINARY_DIR}/translations scripts styles DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${VYM_SHARE_SUBDIR}) if(UNIX) install(FILES icons/vym.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps) # Disabling PR #109 for now: # FIXME # file(CREATE_LINK ../apps/vym.png application-x-vym.png SYMBOLIC) # install(FILES ${CMAKE_BINARY_DIR}/application-x-vym.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/mimetypes) install(FILES config/vym.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/packages) install(FILES config/vym.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) endif()