Skip to content

Commit 0863e16

Browse files
author
Paul T
authored
Better vcpkg support (ptsouchlos#45)
Use cmake directly to install library instead of PackageProject
1 parent b2446db commit 0863e16

File tree

7 files changed

+74
-33
lines changed

7 files changed

+74
-33
lines changed

.github/workflows/install.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ jobs:
3535

3636
- name: build and install library
3737
run: |
38-
cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release -DTP_BUILD_EXAMPLES=OFF -DTP_BUILD_TESTS=ON -DTP_BUILD_BENCHMARKS=OFF
38+
cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release -DTP_BUILD_EXAMPLES=OFF -DTP_BUILD_TESTS=ON -DTP_BUILD_BENCHMARKS=OFF -DCMAKE_INSTALL_PREFIX="/usr/local"
3939
sudo cmake --build build --target install
4040
rm -rf build
4141
4242
- name: configure
43-
run: cmake -Stest -Bbuild -DTEST_INSTALLED_VERSION=1
43+
run: cmake -Stest -Bbuild -DTEST_INSTALLED_VERSION=1 -Dthread-pool_DIR="/usr/local/lib/cmake/thread-pool-0.6.0/"
4444

4545
- name: build
4646
run: cmake --build build --config Debug -j4

CMakeLists.txt

Lines changed: 53 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
44

55
# Note: update this to your new project's name and version
66
project(
7-
ThreadPool
7+
thread-pool
88
VERSION 0.6.0
99
LANGUAGES CXX
1010
)
@@ -56,21 +56,17 @@ if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
5656
)
5757
endif()
5858

59-
# ---- Add dependencies via CPM ----
6059
# see https://github.com/TheLartians/CPM.cmake for more info
6160
include(cmake/CPM.cmake)
6261

63-
# PackageProject.cmake will be used to make our target installable
64-
CPMAddPackage("gh:TheLartians/[email protected]")
65-
66-
# ---- Add source files ----
62+
# add source files
6763
file(GLOB_RECURSE headers CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
6864

6965
find_package(Threads REQUIRED)
7066

7167
# ---- Create library ----
7268
add_library(${PROJECT_NAME} INTERFACE)
73-
add_library(dp::thread-pool ALIAS ${PROJECT_NAME})
69+
add_library(dp::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
7470

7571
target_link_libraries(${PROJECT_NAME} INTERFACE Threads::Threads)
7672

@@ -83,31 +79,62 @@ endif()
8379
# being a cross-platform target, we enforce standards conformance on MSVC
8480
target_compile_options(${PROJECT_NAME} INTERFACE $<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/permissive->)
8581

86-
target_include_directories(
87-
${PROJECT_NAME} INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
88-
$<INSTALL_INTERFACE:include/${PROJECT_NAME}-${PROJECT_VERSION}>
89-
)
90-
91-
# ---- Create an installable target ----
92-
# this allows users to install and find the library via `find_package()`.
93-
9482
# the location where the project's version header will be placed should match the project's regular
9583
# header paths here we get the root folder of the include directory but getting the directory name
9684
# from one of the headers paths
9785
list(GET headers 0 first_header)
9886
get_filename_component(include_dir_path ${first_header} DIRECTORY)
9987
get_filename_component(include_dir_name ${include_dir_path} NAME)
100-
string(TOLOWER ${include_dir_name}/version.h VERSION_HEADER_LOCATION)
101-
packageProject(
102-
NAME ${PROJECT_NAME}
103-
VERSION ${PROJECT_VERSION}
104-
NAMESPACE ${PROJECT_NAME}
105-
BINARY_DIR ${PROJECT_BINARY_DIR}
106-
INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include
107-
INCLUDE_DESTINATION include/${PROJECT_NAME}-${PROJECT_VERSION}
108-
VERSION_HEADER "${VERSION_HEADER_LOCATION}"
109-
COMPATIBILITY SameMajorVersion
110-
DEPENDENCIES "Threads" ARCH_INDEPENDENT YES
88+
89+
configure_file(
90+
${PROJECT_SOURCE_DIR}/cmake/version.h.in ${PROJECT_BINARY_DIR}/include/thread_pool/version.h
91+
@ONLY
92+
)
93+
94+
target_include_directories(
95+
${PROJECT_NAME}
96+
INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
97+
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
98+
$<INSTALL_INTERFACE:include/${PROJECT_NAME}-${PROJECT_VERSION}>
99+
)
100+
101+
# ---- Create an installable target ----
102+
# this allows users to install and find the library via `find_package()`.
103+
104+
include(CMakePackageConfigHelpers)
105+
include(GNUInstallDirs)
106+
107+
# Installation help
108+
configure_package_config_file(
109+
"${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}-config.cmake.in"
110+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
111+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION}"
112+
)
113+
114+
write_basic_package_version_file(
115+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" COMPATIBILITY SameMajorVersion
116+
ARCH_INDEPENDENT
117+
)
118+
119+
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}-targets)
120+
121+
install(
122+
EXPORT ${PROJECT_NAME}-targets
123+
NAMESPACE dp::
124+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION}"
125+
FILE "${PROJECT_NAME}-targets.cmake"
126+
)
127+
128+
install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
129+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
130+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION}
131+
)
132+
133+
install(FILES ${headers}
134+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}-${PROJECT_VERSION}/thread_pool
135+
)
136+
install(FILES ${PROJECT_BINARY_DIR}/include/thread_pool/version.h
137+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}-${PROJECT_VERSION}/thread_pool
111138
)
112139

113140
option(TP_BUILD_TESTS "Turn on to build unit tests." ON)

CMakePresets.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
"description": "Target the Windows Subsystem for Linux (WSL) or a remote Linux system.",
88
"generator": "Ninja",
99
"binaryDir": "${sourceDir}/out/build/${presetName}",
10-
"installDir": "${sourceDir}/out/install/${presetName}",
1110
"condition": {
1211
"type": "equals",
1312
"lhs": "${hostSystemName}",

benchmark/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
22

3-
project(ThreadPoolBenchmarks LANGUAGES CXX)
3+
project(thread-pool-benchmarks LANGUAGES CXX)
44

55
# --- Import tools ----
66
include(../cmake/tools.cmake)

cmake/thread-pool-config.cmake.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
@PACKAGE_INIT@
2+
3+
include("${CMAKE_CURRENT_LIST_DIR}/thread-pool-targets.cmake")
4+
5+
include(CMakeFindDependencyMacro)
6+
find_dependency(Threads REQUIRED)

cmake/version.h.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#pragma once
2+
3+
#define THREADPOOL_VERSION "@PROJECT_VERSION@"
4+
5+
#define THREADPOOL_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
6+
#define THREADPOOL_VERSION_MINOR @PROJECT_VERSION_MINOR@
7+
#define THREADPOOL_VERSION_PATCH @PROJECT_VERSION_PATCH@
8+
#define THREADPOOL_VERSION_TWEAK @PROJECT_VERSION_TWEAK@

test/CMakeLists.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
22

3-
project(ThreadPoolTests LANGUAGES CXX)
3+
project(thread-pool-tests LANGUAGES CXX)
44

55
# ---- Options ----
66
option(TEST_INSTALLED_VERSION "Test the version found by find_package" OFF)
@@ -26,15 +26,16 @@ CPMAddPackage(
2626
)
2727

2828
if(TEST_INSTALLED_VERSION)
29+
# testing the installed version, so we assume this is the top level CMakeLists.txt
2930
enable_testing()
30-
find_package(ThreadPool REQUIRED)
31+
find_package(thread-pool REQUIRED)
3132
endif()
3233

3334
# ---- Create binary ----
3435

3536
file(GLOB sources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp)
3637
add_executable(${PROJECT_NAME} ${sources})
37-
target_link_libraries(${PROJECT_NAME} doctest::doctest ThreadPool::ThreadPool)
38+
target_link_libraries(${PROJECT_NAME} doctest::doctest dp::thread-pool)
3839

3940
target_compile_options(
4041
${PROJECT_NAME} INTERFACE $<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/fsanitize=address>

0 commit comments

Comments
 (0)