stdware / qmsetup

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

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 not suggested to be included as a subproject.

Features

  • Helpful CMake utilities
  • Generate configuration header files
  • Reorganize header files
  • Deploy project dependencies and fix rpaths
  • Support calling Doxygen via CMake conveniently
  • Support calling Qt Linguist Tools via CMake conveniently

Support Platforms

  • Microsoft Windows
  • Apple Macintosh
  • GNU/Linux

Dependencies

Required Packages

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 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_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/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

Here are some common use cases of CMake project, you can simplify many operations when using this library.

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 Doxygen Document

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"
)

Detailed Documents

The CMake Modules documentations is provided in the form of comment.

See examples to get detailed use cases.

Contributors

License

QMSetup is licensed under the MIT License.

About

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

License:MIT License


Languages

Language:C++ 34.4%Language:CMake 34.4%Language:CSS 21.7%Language:JavaScript 2.8%Language:Batchfile 2.7%Language:Shell 2.7%Language:HTML 1.3%