playground/cmake_demo/simple_library/CMakeLists.txt
2024-08-31 22:26:15 -04:00

186 lines
5.8 KiB
CMake

cmake_minimum_required(VERSION 3.5)
project(
SimpleLibrary
VERSION 1.0.0
LANGUAGES CXX)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
#
# auto genrate a stamp header
#
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND git rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CUSTOM_VALUE "Blah blah custom value.")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/include/version.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/include/simple/version.h")
add_custom_target(
generate_version_h ALL
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/include/simple/version.h")
#
# Build
#
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
"${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O2 -g -DNDEBUG")
set(CMAKE_BUILD_TYPE
"Release"
CACHE STRING "Choose the type of build." FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
"RelWithDebInfo")
file(GLOB_RECURSE SOURCES "src/*.cpp")
# file(GLOB_RECURSE HEADERS "include/*.h")
# shared - set_target_properties is so that the binary is libSimpleLibrary.so
# add_depdencies so the config.h file is auto generated
add_library(SimpleLibraryShared SHARED ${SOURCES})
target_include_directories(
SimpleLibraryShared
PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/simple>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
$<INSTALL_INTERFACE:include/simple>)
set_target_properties(SimpleLibraryShared PROPERTIES OUTPUT_NAME
"SimpleLibrary")
add_dependencies(SimpleLibraryShared generate_version_h doc_doxygen)
# static - set_target_properties is so that the binary is libSimpleLibrary.a
# add_depdencies so the config.h file is auto generated
add_library(SimpleLibraryStatic STATIC ${SOURCES})
set_target_properties(SimpleLibraryStatic PROPERTIES OUTPUT_NAME
"SimpleLibrary")
target_include_directories(
SimpleLibraryStatic
PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/simple>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
$<INSTALL_INTERFACE:include/simple>)
add_dependencies(SimpleLibraryStatic generate_version_h doc_doxygen)
#
# Test
#
enable_testing()
add_subdirectory(test)
#
# doxygen
#
find_package(Doxygen REQUIRED)
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
add_custom_target(
doc_doxygen # ALL otherwise it's constantly being rebuilt
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating API documentation with Doxygen"
VERBATIM)
#
# man page
#
# look into pandoc that'll turn markdown into man pages.
add_custom_target(
man ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/man
${CMAKE_CURRENT_BINARY_DIR}/man
COMMENT "Copying man pages")
#
# CMake find support
#
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/SimpleLibraryConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion)
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/SimpleLibraryConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/SimpleLibraryConfig.cmake"
INSTALL_DESTINATION lib/cmake/SimpleLibrary)
#
# Install
#
install(
TARGETS SimpleLibraryShared SimpleLibraryStatic
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
PUBLIC_HEADER DESTINATION include/simple)
install(DIRECTORY include/simple/ DESTINATION include/simple)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/simple/version.h"
DESTINATION include/simple)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SimpleLibraryConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/SimpleLibraryConfigVersion.cmake"
DESTINATION lib/cmake/SimpleLibrary)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc/html
DESTINATION share/doc/SimpleLibrary)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/man/ DESTINATION share/man)
#
# CPack
#
set(CPACK_PACKAGE_NAME "SimpleLibrary")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_CONTACT "RAS <sprague.a.rick@gmail.com>")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A simple library example")
set(CPACK_PACKAGE_VENDOR "Your Organization")
set(CPACK_PACKAGE_LICENSE "MIT")
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-Source")
# Debian specific settings
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "RAS <sprague.a.rick@gmail.com>")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.27)")
set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
set(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
include(CPack)
cpack_add_component_group(Development)
cpack_add_component(
Headers
DISPLAY_NAME "C++ Headers"
DESCRIPTION "C++ header files for SimpleLibrary"
GROUP Development
REQUIRED)
cpack_add_component(
Libraries
DISPLAY_NAME "Libraries"
DESCRIPTION "Shared and static libraries for SimpleLibrary"
GROUP Development
REQUIRED)
cpack_add_component(
Doxygen
DISPLAY_NAME "Doxygen Documentation"
DESCRIPTION "API documentation generated by Doxygen"
GROUP Development
REQUIRED)