1- cmake_minimum_required (VERSION 3.14 ...3.22 )
1+ cmake_minimum_required (VERSION 3.24 ...3.31 )
22
33# ---- Project ----
44
@@ -24,15 +24,18 @@ endif()
2424include (cmake/CPM.cmake)
2525
2626# PackageProject.cmake will be used to make our target installable
27- CPMAddPackage("gh:TheLartians/PackageProject.cmake@1.8 .0" )
27+ CPMAddPackage("gh:TheLartians/PackageProject.cmake@1.13 .0" )
2828
2929CPMAddPackage(
3030 NAME fmt
31- GIT_TAG 10.2.1
31+ GIT_TAG 11.1.4
3232 GITHUB_REPOSITORY fmtlib/fmt
3333 OPTIONS "FMT_INSTALL YES" # create an installable target
3434)
3535
36+ set (CMAKE_SKIP_INSTALL_RULES YES )
37+ set (CMAKE_VERIFY_INTERFACE_HEADER_SETS ${PROJECT_IS_TOP_LEVEL} )
38+
3639# ---- Add source files ----
3740
3841# Note: globbing sources is considered bad practice as CMake's generators may not detect new files
@@ -42,9 +45,27 @@ file(GLOB_RECURSE sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/source/
4245
4346# ---- Create library ----
4447
48+ # the location where the project's version header will be placed should match the project's regular
49+ # header paths
50+ string (TOLOWER ${PROJECT_NAME} /version .h VERSION_HEADER_LOCATION)
51+
4552# Note: for header-only libraries change all PUBLIC flags to INTERFACE and create an interface
4653# target: add_library(${PROJECT_NAME} INTERFACE)
47- add_library (${PROJECT_NAME} ${headers} ${sources} )
54+ add_library (${PROJECT_NAME} )
55+ target_sources (
56+ ${PROJECT_NAME}
57+ PRIVATE ${sources}
58+ PUBLIC FILE_SET
59+ greater_public_headers
60+ TYPE
61+ HEADERS
62+ BASE_DIRS
63+ ${CMAKE_CURRENT_SOURCE_DIR} /include
64+ ${CMAKE_CURRENT_BINARY_DIR}
65+ FILES
66+ ${headers}
67+ ${CMAKE_CURRENT_BINARY_DIR} /${VERSION_HEADER_LOCATION}
68+ )
4869set_target_properties (${PROJECT_NAME} PROPERTIES CXX_STANDARD 17)
4970
5071# being a cross-platform target, we enforce standards conformance on MSVC
@@ -53,18 +74,18 @@ target_compile_options(${PROJECT_NAME} PUBLIC "$<$<COMPILE_LANG_AND_ID:CXX,MSVC>
5374# Link dependencies
5475target_link_libraries (${PROJECT_NAME} PRIVATE fmt::fmt)
5576
56- target_include_directories (
57- ${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR} /include >
58- $<INSTALL_INTERFACE:include /${PROJECT_NAME} -${PROJECT_VERSION} >
59- )
77+ if (CMAKE_SKIP_INSTALL_RULES)
78+ set (GREETER_VERSION \"${PROJECT_VERSION} \")
79+ string (TOUPPER ${PROJECT_NAME} UPPERCASE_PROJECT_NAME)
80+ configure_file (${PACKAGE_PROJECT_ROOT_PATH} /version .h.in ${VERSION_HEADER_LOCATION} @ONLY)
81+ add_library (${PROJECT_NAME} ::${PROJECT_NAME} ALIAS ${PROJECT_NAME} )
82+
83+ return ()
84+ endif ()
6085
6186# ---- Create an installable target ----
6287# this allows users to install and find the library via `find_package()`.
6388
64- # the location where the project's version header will be placed should match the project's regular
65- # header paths
66- string (TOLOWER ${PROJECT_NAME} /version .h VERSION_HEADER_LOCATION)
67-
6889packageProject(
6990 NAME ${PROJECT_NAME}
7091 VERSION ${PROJECT_VERSION}
@@ -74,5 +95,5 @@ packageProject(
7495 INCLUDE_DESTINATION include /${PROJECT_NAME} -${PROJECT_VERSION}
7596 VERSION_HEADER "${VERSION_HEADER_LOCATION} "
7697 COMPATIBILITY SameMajorVersion
77- DEPENDENCIES "fmt 10.2.1 "
98+ DEPENDENCIES "fmt 11.1.4 "
7899)
0 commit comments