mirror of
https://github.com/vimpunk/mio.git
synced 2025-12-06 16:57:01 +08:00
133 lines
4.3 KiB
CMake
133 lines
4.3 KiB
CMake
cmake_minimum_required(VERSION 3.8)
|
|
|
|
#
|
|
# Here we check whether mio is being configured in isolation or as a component
|
|
# of a larger project. To do so, we query whether the `PROJECT_NAME` CMake
|
|
# variable has been defined. In the case it has, we can conclude mio is a
|
|
# subproject.
|
|
#
|
|
# This convention has been borrowed from the Catch C++ unit testing library.
|
|
#
|
|
if(DEFINED PROJECT_NAME)
|
|
set(subproject ON)
|
|
else()
|
|
set(subproject OFF)
|
|
endif()
|
|
|
|
project(mio VERSION 1.0.0 LANGUAGES C CXX)
|
|
include (CTest)
|
|
include (CMakeDependentOption)
|
|
|
|
# Generate 'compile_commands.json' for clang_complete
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
#
|
|
# The `mio.testing` options only appear as cmake-gui and ccmake options iff
|
|
# mio is the highest level project. In the case that mio is a subproject, these
|
|
# options are hidden from the user interface and set to `OFF`
|
|
#
|
|
# Iff mio is the highest level project, this option is defaulted to the value
|
|
# of the traditional course grain testing option `BUILD_TESTING` established by
|
|
# the CTest module
|
|
#
|
|
CMAKE_DEPENDENT_OPTION(mio.tests
|
|
"Build the mio tests and integrate with ctest"
|
|
${BUILD_TESTING} "NOT subproject" OFF)
|
|
|
|
#
|
|
# mio has no compiled components. As such, we declare it as an `INTERFACE`
|
|
# library, which denotes a collection of target properties to be applied
|
|
# transitively to linking targets. In our case, this amounts to an include
|
|
# directory and project header files.
|
|
#
|
|
add_library(mio INTERFACE)
|
|
add_library(mio::mio ALIAS mio)
|
|
|
|
#
|
|
# mio requires C++ 11 support, at a minimum. Setting the `cxx_std_11` compile
|
|
# features ensures that the corresponding C++ standard flag is populated in
|
|
# targets linking to mio
|
|
#
|
|
target_compile_features(mio INTERFACE cxx_std_11)
|
|
|
|
#
|
|
# The include directory for mio can be expected to vary between build
|
|
# and installaion. Here we use a CMake generator expression to dispatch
|
|
# on how the configuration under which this library is being consumed.
|
|
#
|
|
target_include_directories(mio INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
|
|
$<INSTALL_INTERFACE:include>)
|
|
|
|
add_subdirectory(include/mio)
|
|
|
|
if(mio.tests)
|
|
add_subdirectory(test)
|
|
endif()
|
|
|
|
#
|
|
# Non-testing header files (preserving relative paths) are installed to the
|
|
# `include` subdirectory of the `$INSTALL_DIR/${CMAKE_INSTALL_PREFIX}`
|
|
# directory. Source file permissions preserved.
|
|
#
|
|
install(DIRECTORY include/
|
|
DESTINATION include
|
|
USE_SOURCE_PERMISSIONS
|
|
FILES_MATCHING PATTERN "*.*pp")
|
|
|
|
#
|
|
# As a header-only library, there are no target components to be installed
|
|
# directly (the PUBLIC_HEADER property is not white listed for INTERFACE
|
|
# targets for some reason).
|
|
#
|
|
# However, it is worthwhile export our target description in order to later
|
|
# generate a CMake configuration file for consumption by CMake's `find_package`
|
|
# intrinsic
|
|
#
|
|
install(TARGETS mio EXPORT mioConfig)
|
|
install(EXPORT mioConfig
|
|
FILE mioConfig.cmake
|
|
NAMESPACE mio::
|
|
DESTINATION share/cmake/mio
|
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
|
|
|
|
include(CMakePackageConfigHelpers) # provides `write_basic_package_version_file`
|
|
write_basic_package_version_file("mioConfigVersion.cmake"
|
|
VERSION ${mio_VERSION}
|
|
COMPATIBILITY SameMajorVersion)
|
|
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/mioConfigVersion.cmake"
|
|
DESTINATION share/cmake/mio
|
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
|
|
|
|
#
|
|
# Rudimentary CPack support.
|
|
#
|
|
# CPack provides a mechanism to generate installation packaging for a project,
|
|
# e.g., self-extracting shell scripts, compressed tarballs, Debian Package files,
|
|
# RPM Package Manager files, Windows NSIS installation wizards,
|
|
# Apple Disk Images (.dmg), etc.
|
|
#
|
|
# Any system libraries required (runtimes, threading, etc) should be bundled
|
|
# with the project for this type of installation. The
|
|
# `InstallRequiredSystemLibraries` CMake module attempts to provide this
|
|
# functionality in an automated way. Additional libraries may be specified as
|
|
#
|
|
# ```cmake
|
|
# list(APPEND CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS <library>)
|
|
# ```
|
|
#
|
|
# A packaged installation can be generated by calling
|
|
#
|
|
# ```sh
|
|
# cpack -G <packaging type> --config CPackConfig.cmake
|
|
# ```
|
|
#
|
|
# See `cpack --help` or the CPack documentation for more information.
|
|
#
|
|
include( InstallRequiredSystemLibraries )
|
|
set( CPACK_PACKAGE_VENDOR "mandreyel" )
|
|
set( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" )
|
|
set( CMAKE_PROJECT_HOMEPAGE_URL "https://github.com/mandreyel/mio" )
|
|
include( CPack )
|