Skip to content

Commit d7c1425

Browse files
author
Connor Baker
committed
cmake: add USE_SYSTEM_* options; support find_package(pthreadpool)
1 parent edeb5d6 commit d7c1425

2 files changed

Lines changed: 58 additions & 22 deletions

File tree

CMakeLists.txt

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ ELSE()
2121
SET(PTHREADPOOL_BUILD_TESTS OFF CACHE BOOL "Build pthreadpool unit tests")
2222
SET(PTHREADPOOL_BUILD_BENCHMARKS OFF CACHE BOOL "Build pthreadpool micro-benchmarks")
2323
ENDIF()
24+
OPTION(USE_SYSTEM_LIBS "Use system libraries instead of downloading and building them" OFF)
25+
OPTION(USE_SYSTEM_GOOGLE_BENCHMARK "Use system Google Benchmark library instead of downloading and building it" ${USE_SYSTEM_LIBS})
26+
OPTION(USE_SYSTEM_GOOGLE_TEST "Use system Google Test library instead of downloading and building it" ${USE_SYSTEM_LIBS})
27+
OPTION(USE_SYSTEM_FXDIV "Use system FXdiv library instead of downloading and building it" ${USE_SYSTEM_LIBS})
2428

2529
# ---[ CMake options
2630
INCLUDE(GNUInstallDirs)
@@ -40,7 +44,10 @@ MACRO(PTHREADPOOL_TARGET_ENABLE_CXX11 target)
4044
ENDMACRO()
4145

4246
# ---[ Download deps
43-
IF(NOT DEFINED FXDIV_SOURCE_DIR)
47+
IF(USE_SYSTEM_FXDIV)
48+
FIND_PACKAGE(FXdiv REQUIRED)
49+
ADD_LIBRARY(fxdiv INTERFACE IMPORTED)
50+
ELSEIF(NOT DEFINED FXDIV_SOURCE_DIR)
4451
MESSAGE(STATUS "Downloading FXdiv to ${CMAKE_BINARY_DIR}/FXdiv-source (define FXDIV_SOURCE_DIR to avoid it)")
4552
CONFIGURE_FILE(cmake/DownloadFXdiv.cmake "${CMAKE_BINARY_DIR}/FXdiv-download/CMakeLists.txt")
4653
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
@@ -50,24 +57,32 @@ IF(NOT DEFINED FXDIV_SOURCE_DIR)
5057
SET(FXDIV_SOURCE_DIR "${CMAKE_BINARY_DIR}/FXdiv-source" CACHE STRING "FXdiv source directory")
5158
ENDIF()
5259

53-
IF(PTHREADPOOL_BUILD_TESTS AND NOT DEFINED GOOGLETEST_SOURCE_DIR)
54-
MESSAGE(STATUS "Downloading Google Test to ${CMAKE_BINARY_DIR}/googletest-source (define GOOGLETEST_SOURCE_DIR to avoid it)")
55-
CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt")
56-
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
57-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")
58-
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
59-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")
60-
SET(GOOGLETEST_SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-source" CACHE STRING "Google Test source directory")
60+
IF(PTHREADPOOL_BUILD_TESTS)
61+
IF(USE_SYSTEM_GOOGLE_TEST)
62+
FIND_PACKAGE(GTest REQUIRED)
63+
ELSEIF(NOT DEFINED GOOGLETEST_SOURCE_DIR)
64+
MESSAGE(STATUS "Downloading Google Test to ${CMAKE_BINARY_DIR}/googletest-source (define GOOGLETEST_SOURCE_DIR to avoid it)")
65+
CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt")
66+
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
67+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")
68+
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
69+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")
70+
SET(GOOGLETEST_SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-source" CACHE STRING "Google Test source directory")
71+
ENDIF()
6172
ENDIF()
6273

63-
IF(PTHREADPOOL_BUILD_BENCHMARKS AND NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR)
64-
MESSAGE(STATUS "Downloading Google Benchmark to ${CMAKE_BINARY_DIR}/googlebenchmark-source (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)")
65-
CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CMAKE_BINARY_DIR}/googlebenchmark-download/CMakeLists.txt")
66-
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
67-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download")
68-
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
69-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download")
70-
SET(GOOGLEBENCHMARK_SOURCE_DIR "${CMAKE_BINARY_DIR}/googlebenchmark-source" CACHE STRING "Google Benchmark source directory")
74+
IF(PTHREADPOOL_BUILD_BENCHMARKS)
75+
IF(USE_SYSTEM_GOOGLE_BENCHMARK)
76+
FIND_PACKAGE(benchmark REQUIRED)
77+
ELSEIF(NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR)
78+
MESSAGE(STATUS "Downloading Google Benchmark to ${CMAKE_BINARY_DIR}/googlebenchmark-source (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)")
79+
CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CMAKE_BINARY_DIR}/googlebenchmark-download/CMakeLists.txt")
80+
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
81+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download")
82+
EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
83+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download")
84+
SET(GOOGLEBENCHMARK_SOURCE_DIR "${CMAKE_BINARY_DIR}/googlebenchmark-source" CACHE STRING "Google Benchmark source directory")
85+
ENDIF()
7186
ENDIF()
7287

7388
# ---[ pthreadpool library
@@ -91,11 +106,15 @@ ELSE()
91106
ENDIF()
92107

93108
ADD_LIBRARY(pthreadpool_interface INTERFACE)
94-
TARGET_INCLUDE_DIRECTORIES(pthreadpool_interface INTERFACE include)
109+
TARGET_INCLUDE_DIRECTORIES(pthreadpool_interface INTERFACE
110+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
111+
$<INSTALL_INTERFACE:include>
112+
)
95113
IF(NOT PTHREADPOOL_ALLOW_DEPRECATED_API)
96114
TARGET_COMPILE_DEFINITIONS(pthreadpool_interface INTERFACE PTHREADPOOL_NO_DEPRECATED_API=1)
97115
ENDIF()
98-
INSTALL(FILES include/pthreadpool.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
116+
INSTALL(TARGETS pthreadpool_interface EXPORT ${CMAKE_PROJECT_NAME}Targets)
117+
INSTALL(DIRECTORY include/ DESTINATION include)
99118

100119
IF(PTHREADPOOL_LIBRARY_TYPE STREQUAL "default")
101120
ADD_LIBRARY(pthreadpool ${PTHREADPOOL_SRCS})
@@ -154,7 +173,7 @@ IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
154173
ENDIF()
155174

156175
# ---[ Configure FXdiv
157-
IF(NOT TARGET fxdiv)
176+
IF(NOT TARGET fxdiv AND NOT USE_SYSTEM_FXDIV)
158177
SET(FXDIV_BUILD_TESTS OFF CACHE BOOL "")
159178
SET(FXDIV_BUILD_BENCHMARKS OFF CACHE BOOL "")
160179
ADD_SUBDIRECTORY(
@@ -163,13 +182,25 @@ IF(NOT TARGET fxdiv)
163182
ENDIF()
164183
TARGET_LINK_LIBRARIES(pthreadpool PRIVATE fxdiv)
165184

185+
INCLUDE(CMakePackageConfigHelpers)
186+
CONFIGURE_PACKAGE_CONFIG_FILE(
187+
${CMAKE_CURRENT_SOURCE_DIR}/cmake/${CMAKE_PROJECT_NAME}-config.cmake.in
188+
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config.cmake
189+
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}
190+
)
191+
166192
INSTALL(TARGETS pthreadpool
193+
EXPORT ${CMAKE_PROJECT_NAME}Targets
167194
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
168195
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
196+
INSTALL(EXPORT ${CMAKE_PROJECT_NAME}Targets
197+
FILE ${CMAKE_PROJECT_NAME}-config.cmake
198+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}
199+
)
169200

170201
IF(PTHREADPOOL_BUILD_TESTS)
171202
# ---[ Build google test
172-
IF(NOT TARGET gtest)
203+
IF(NOT TARGET gtest AND NOT USE_SYSTEM_GOOGLE_TEST)
173204
SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
174205
ADD_SUBDIRECTORY(
175206
"${GOOGLETEST_SOURCE_DIR}"
@@ -193,7 +224,7 @@ ENDIF()
193224

194225
IF(PTHREADPOOL_BUILD_BENCHMARKS)
195226
# ---[ Build google benchmark
196-
IF(NOT TARGET benchmark)
227+
IF(NOT TARGET benchmark AND NOT USE_SYSTEM_GOOGLE_BENCHMARK)
197228
SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "")
198229
ADD_SUBDIRECTORY(
199230
"${GOOGLEBENCHMARK_SOURCE_DIR}"

cmake/pthreadpool-config.cmake.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@PACKAGE_INIT@
2+
3+
include("${CMAKE_CURRENT_LIST_DIR}/pthreadpoolTargets.cmake")
4+
5+
check_required_components(pthreadpool)

0 commit comments

Comments
 (0)