/qmsetup

CMake Modules and Basic Libraries for C/C++ projects.

Primary LanguageCMakeMIT LicenseMIT

QMSetup

QMSetup is a set of CMake Modules and Basic Libraries for C/C++ projects.

This project is independent from Qt and other 3rdparty libraries. Due to the fact that it encompasses some tools that need to be compiled, it's strongly not suggested to be included as a subproject.

Features

Helpful Functions

  • Path, Version functions
  • Target configuration functions
  • Qt related functions

Generators

  • Generate Windows RC files, manifest files
  • Generate MacOS Bundle info files
  • Generate configuration header files
  • Generate Git information header files

Filesystem Utilities

  • Reorganize header files
  • Copy files and directories after build

Install Utilities

  • Deploy project dependencies and fix rpaths

Extended Build Rules

  • Create translations with Qt Linguist tools
  • Create source files with Protobuf compiler
  • Create documentations with Doxygen

Support Platforms

  • Microsoft Windows
  • Apple Macintosh
  • GNU/Linux

Dependencies

Required Packages

Windows

Windows deploy command acquires the shared library paths by reading the PE files and searching the specified paths so that it doesn't depend on dumpbin tool.

Unix

Unix deploy command acquires the shared library paths by running ldd/otool command and fixes the rpaths by runing the patchelf/install_name_tool command, make sure you have installed them.

sudo apt install patchelf

Build System

  • C++ 17
  • CMake 3.19

Open-Source Libraries

Integrate

Clone

Via Https

git clone --recursive https://github.com/stdware/qmsetup.git

Via SSH

git clone --recursive git@github.com:stdware/qmsetup.git

Preinstall (Suggested)

Build & Install

cmake -B build -DCMAKE_BUILD_TYPE=Release \
               -DCMAKE_INSTALL_PREFIX=/path/to
cmake -B build --target all
cmake -B build --target install

Import

cmake -Dqmsetup_DIR=/path/to/lib/cmake/qmsetup ...
find_package(qmsetup REQUIRED)

Sub-project

It still needs to be installed, but the installation occurs during the CMake Configure phase and is executed only once.

find_package(qmsetup QUIET)

if (NOT TARGET qmsetup::library)
    # Modify this variable according to your project structure
    set(_source_dir ${CMAKE_CURRENT_SOURCE_DIR}/qmsetup)

    # Import install function
    include("${_source_dir}/cmake/modules/private/InstallPackage.cmake")

    # Install package in place
    set(_package_path)
    qm_install_package(qmsetup
        SOURCE_DIR ${_source_dir}
        BUILD_TYPE Release
        RESULT_PATH _package_path
    )

    # Find package again
    find_package(qmsetup REQUIRED PATHS ${_package_path})

    # Update import path
    set(qmsetup_DIR ${_package_path} CACHE PATH "" FORCE)
endif()

Quick Start

Examples

You can use the functions in this library to greatly simplify several kinds of common build rules.

Generate Configuration Header

qm_import(Preprocess)

qm_add_definition(FOO false)
qm_add_definition(BAR 114514)
qm_add_definition(BAZ "ABC" STRING_LITERAL)

qm_generate_config(${CMAKE_BINARY_DIR}/conf.h)

Reorganize Include Directory

qm_import(Preprocess)

qm_sync_include(src/core ${CMAKE_BINARY_DIR}/include/MyCore
    INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/MyCore
)

Sync Resource Files After Build

qm_import(Filesystem)

qm_add_copy_command(${PROJECT_NAME}
    SOURCES
        file.txt
        dir_to_copy
        dir_contents_to_copy/
    DESTINATION .
)

Deploy Project And All Dependencies

qm_import(Deploy)

qm_deploy_directory("${CMAKE_INSTALL_PREFIX}"
    COMMENT "Deploy project spectacularly"
    PLUGINS "iconengines/qsvgicon" "bearer/qgenericbearer"
    QML Qt QtQml
    PLUGIN_DIR share/plugins
    QML_DIR share/qml
)

Add Qt Translations

qm_import(Translate)

qm_find_qt(LinguistTools)
qm_add_translation(${PROJECT_NAME}_translations
    LOCALES ja_JP zh_CN zh_TW
    PREFIX ${PROJECT_NAME}
    TARGETS ${PROJECT_NAME}
    TS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/translations
    QM_DIR ${CMAKE_CURRENT_BINARY_DIR}/translations
)

Generate Protubuf Source Files

qm_import(Protobuf)

find_package(Protobuf REQUIRED)
qm_create_protobuf(_proto_src
    INPUT a.proto b.proto
    INCLUDE_DIRECTORIES src/proto
    OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/proto
)
target_sources(${PROJECT_NAME} PUBLIC ${_proto_src})

Generate Doxygen HTML Documentations

qm_import(Doxygen)

find_package(Doxygen REQUIRED)
qm_setup_doxygen(${PROJECT_NAME}_RunDoxygen
    NAME ${PROJECT_NAME}
    DESCRIPTION "my project"
    MDFILE "${CMAKE_SOURCE_DIR}/README.md"
    OUTPUT_DIR "${CMAK_BINARY_DIR}/doc"
    INPUT src
    TARGETS ${PROJECT_NAME}
    DEPENDS ${PROJECT_NAME}
    NO_EXPAND_MACROS
        Q_OBJECT
        Q_GADGET
        Q_DECLARE_TR_FUNCTIONS
    COMPILE_DEFINITIONS 
        Q_SIGNALS=Q_SIGNALS
        Q_SLOTS=Q_SLOTS
    GENERATE_TAGFILE "${PROJECT_NAME}_tagfile.xml"
    INSTALL_DIR "doc"
)

Find Modules

Use qm_find_package to find supported third-party packages.

Detailed Documentations

The CMake Modules documentations is provided in the comments.

See examples to get detailed use cases.

Contributors

License

QMSetup is licensed under the MIT License.