OK, as simple as possible, that works:
cmake_minimum_required(VERSION 3.21...3.27)
# Note: update this to your new project's name and version
project(
Useful
VERSION 1.0
LANGUAGES CXX
)
set(LIB_NAME Useful)
set(USEFUL_BUILD_SHARED_LIBS YES)
if(USEFUL_BUILD_SHARED_LIBS)
add_library(${LIB_NAME} SHARED)
else()
add_library(${LIB_NAME} STATIC)
endif()
include(GNUInstallDirs)
include(GenerateExportHeader)
include(CMakePackageConfigHelpers)
string(TOUPPER ${LIB_NAME} UPPER_LIB_NAME)
generate_export_header(${LIB_NAME}
EXPORT_MACRO_NAME ${UPPER_LIB_NAME}_EXPORT
EXPORT_FILE_NAME ${LIB_NAME}_Export.hpp
)
target_sources(${LIB_NAME}
PRIVATE Useful.cpp
)
target_sources(${LIB_NAME}
PUBLIC
FILE_SET public_header_files
TYPE HEADERS
BASE_DIRS
"${PROJECT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_BINARY_DIR}"
FILES
"${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}_Export.hpp"
"${PROJECT_SOURCE_DIR}/include/Useful.hpp"
PRIVATE
FILE_SET private_header_files
TYPE HEADERS
BASE_DIRS "${PROJECT_SOURCE_DIR}/source"
FILES source/DefaultLocale.hpp
)
target_include_directories(${LIB_NAME}
PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
install(
TARGETS ${LIB_NAME}
EXPORT ${LIB_NAME}Exports
FILE_SET public_header_files
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
COMPONENT Development
)
# install(
# FILES $<TARGET_FILE_DIR:${LIB_NAME}>/${LIB_NAME}.pdb
# # is the most implicit (expect PDB be next to the library), yet the only one that universally works
# DESTINATION ${CMAKE_INSTALL_BINDIR}
# OPTIONAL
# )
set(config_package_location ${CMAKE_INSTALL_DATADIR}/cmake/${LIB_NAME})
install(
EXPORT ${LIB_NAME}Exports
FILE ${LIB_NAME}Config.cmake
NAMESPACE Proj::
DESTINATION ${config_package_location}
COMPONENT Development
)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}ConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}ConfigVersion.cmake"
DESTINATION ${config_package_location}
COMPONENT Development
)
include(cpack)