blob: 0db32647b723dbb49161b7774f34c3088eee3c4a [file] [log] [blame]
Marat Dukhan71aacd32019-10-19 00:14:10 -07001CMAKE_MINIMUM_REQUIRED(VERSION 3.5 FATAL_ERROR)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -07002
Marat Dukhanbe01e8c2017-10-17 12:55:28 -07003# ---[ Project
Marat Dukhanfb701272017-10-26 01:11:11 +00004PROJECT(pthreadpool C CXX)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -07005
6# ---[ Options.
Marat Dukhanc3202af2017-11-03 16:02:16 -07007SET(PTHREADPOOL_LIBRARY_TYPE "default" CACHE STRING "Type of library (shared, static, or default) to build")
8SET_PROPERTY(CACHE PTHREADPOOL_LIBRARY_TYPE PROPERTY STRINGS default static shared)
Marat Dukhanefcb4692019-10-19 00:21:52 -07009OPTION(PTHREADPOOL_ALLOW_DEPRECATED_API "Enable deprecated API functions" ON)
Marat Dukhanbe1bd8e2020-04-07 19:14:45 -070010SET(PTHREADPOOL_SYNC_PRIMITIVE "default" CACHE STRING "Synchronization primitive (condvar, futex, gcd, event, or default) for worker threads")
11SET_PROPERTY(CACHE PTHREADPOOL_SYNC_PRIMITIVE PROPERTY STRINGS default condvar futex gcd event)
Marat Dukhan0672a7e2020-05-02 22:29:51 -070012IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?)$")
13 OPTION(PTHREADPOOL_ENABLE_FASTPATH "Enable fast path using atomic decrement instead of atomic compare-and-swap" ON)
14ELSE()
15 OPTION(PTHREADPOOL_ENABLE_FASTPATH "Enable fast path using atomic decrement instead of atomic compare-and-swap" OFF)
16ENDIF()
Marat Dukhan88dfae02019-10-19 01:01:15 -070017IF("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
18 OPTION(PTHREADPOOL_BUILD_TESTS "Build pthreadpool unit tests" ON)
19 OPTION(PTHREADPOOL_BUILD_BENCHMARKS "Build pthreadpool micro-benchmarks" ON)
20ELSE()
21 SET(PTHREADPOOL_BUILD_TESTS OFF CACHE BOOL "Build pthreadpool unit tests")
22 SET(PTHREADPOOL_BUILD_BENCHMARKS OFF CACHE BOOL "Build pthreadpool micro-benchmarks")
23ENDIF()
Marat Dukhanbe01e8c2017-10-17 12:55:28 -070024
25# ---[ CMake options
Marat Dukhan23bc8d12020-04-01 17:36:42 -070026INCLUDE(GNUInstallDirs)
27
Marat Dukhanbe01e8c2017-10-17 12:55:28 -070028IF(PTHREADPOOL_BUILD_TESTS)
29 ENABLE_TESTING()
30ENDIF()
31
Marat Dukhanf535e632019-10-19 04:53:23 -040032MACRO(PTHREADPOOL_TARGET_ENABLE_CXX11 target)
Marat Dukhan71aacd32019-10-19 00:14:10 -070033 SET_TARGET_PROPERTIES(${target} PROPERTIES
Marat Dukhanf535e632019-10-19 04:53:23 -040034 CXX_STANDARD 11
35 CXX_EXTENSIONS NO)
Marat Dukhan2b06b312018-02-25 00:45:56 +010036ENDMACRO()
37
Marat Dukhanefce26f2017-10-17 19:57:56 -070038# ---[ Download deps
Marat Dukhanb76d1ca2018-01-31 17:21:26 -080039IF(NOT DEFINED FXDIV_SOURCE_DIR)
Marat Dukhan9589e302019-10-19 00:36:50 -070040 MESSAGE(STATUS "Downloading FXdiv to ${CMAKE_BINARY_DIR}/FXdiv-source (define FXDIV_SOURCE_DIR to avoid it)")
41 CONFIGURE_FILE(cmake/DownloadFXdiv.cmake "${CMAKE_BINARY_DIR}/FXdiv-download/CMakeLists.txt")
Marat Dukhanefce26f2017-10-17 19:57:56 -070042 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
Marat Dukhan9589e302019-10-19 00:36:50 -070043 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/FXdiv-download")
Marat Dukhanefce26f2017-10-17 19:57:56 -070044 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
Marat Dukhan9589e302019-10-19 00:36:50 -070045 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/FXdiv-download")
46 SET(FXDIV_SOURCE_DIR "${CMAKE_BINARY_DIR}/FXdiv-source" CACHE STRING "FXdiv source directory")
Marat Dukhanefce26f2017-10-17 19:57:56 -070047ENDIF()
48
Marat Dukhanb76d1ca2018-01-31 17:21:26 -080049IF(PTHREADPOOL_BUILD_TESTS AND NOT DEFINED GOOGLETEST_SOURCE_DIR)
Marat Dukhan9589e302019-10-19 00:36:50 -070050 MESSAGE(STATUS "Downloading Google Test to ${CMAKE_BINARY_DIR}/googletest-source (define GOOGLETEST_SOURCE_DIR to avoid it)")
51 CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt")
Marat Dukhanefce26f2017-10-17 19:57:56 -070052 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
Marat Dukhan9589e302019-10-19 00:36:50 -070053 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")
Marat Dukhanefce26f2017-10-17 19:57:56 -070054 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
Marat Dukhan9589e302019-10-19 00:36:50 -070055 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")
56 SET(GOOGLETEST_SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-source" CACHE STRING "Google Test source directory")
Marat Dukhanefce26f2017-10-17 19:57:56 -070057ENDIF()
58
Marat Dukhanb76d1ca2018-01-31 17:21:26 -080059IF(PTHREADPOOL_BUILD_BENCHMARKS AND NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR)
Marat Dukhan9589e302019-10-19 00:36:50 -070060 MESSAGE(STATUS "Downloading Google Benchmark to ${CMAKE_BINARY_DIR}/googlebenchmark-source (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)")
61 CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CMAKE_BINARY_DIR}/googlebenchmark-download/CMakeLists.txt")
Marat Dukhanefce26f2017-10-17 19:57:56 -070062 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
Marat Dukhan9589e302019-10-19 00:36:50 -070063 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download")
Marat Dukhanefce26f2017-10-17 19:57:56 -070064 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
Marat Dukhan9589e302019-10-19 00:36:50 -070065 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download")
66 SET(GOOGLEBENCHMARK_SOURCE_DIR "${CMAKE_BINARY_DIR}/googlebenchmark-source" CACHE STRING "Google Benchmark source directory")
Marat Dukhanefce26f2017-10-17 19:57:56 -070067ENDIF()
68
Marat Dukhanbe01e8c2017-10-17 12:55:28 -070069# ---[ pthreadpool library
Marat Dukhanefcb4692019-10-19 00:21:52 -070070IF(PTHREADPOOL_ALLOW_DEPRECATED_API)
Marat Dukhanfc793bc2020-04-01 17:08:30 -070071 SET(PTHREADPOOL_SRCS src/legacy-api.c)
Marat Dukhanefcb4692019-10-19 00:21:52 -070072ENDIF()
Marat Dukhanbe9c8932020-04-01 22:40:00 -070073IF(EMSCRIPTEN)
Marat Dukhanfc793bc2020-04-01 17:08:30 -070074 LIST(APPEND PTHREADPOOL_SRCS src/shim.c)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -070075ELSE()
Marat Dukhanbe9c8932020-04-01 22:40:00 -070076 LIST(APPEND PTHREADPOOL_SRCS src/portable-api.c src/memory.c)
77 IF(APPLE AND (PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default" OR PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "gcd"))
78 LIST(APPEND PTHREADPOOL_SRCS src/gcd.c)
Marat Dukhan9b2c0ca2020-04-25 18:12:17 -070079 ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^(Windows|CYGWIN|MSYS)$" AND (PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default" OR PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "event"))
Marat Dukhanbe1bd8e2020-04-07 19:14:45 -070080 LIST(APPEND PTHREADPOOL_SRCS src/windows.c)
Marat Dukhanbe9c8932020-04-01 22:40:00 -070081 ELSE()
82 LIST(APPEND PTHREADPOOL_SRCS src/pthreads.c)
83 ENDIF()
Marat Dukhan0672a7e2020-05-02 22:29:51 -070084 IF(PTHREADPOOL_ENABLE_FASTPATH)
85 LIST(APPEND PTHREADPOOL_SRCS src/fastpath.c)
86 ENDIF()
Marat Dukhanbe01e8c2017-10-17 12:55:28 -070087ENDIF()
88
Marat Dukhanfc793bc2020-04-01 17:08:30 -070089ADD_LIBRARY(pthreadpool_interface INTERFACE)
Marat Dukhan2258d1e2017-10-24 15:11:16 -070090TARGET_INCLUDE_DIRECTORIES(pthreadpool_interface INTERFACE include)
Marat Dukhanefcb4692019-10-19 00:21:52 -070091IF(NOT PTHREADPOOL_ALLOW_DEPRECATED_API)
92 TARGET_COMPILE_DEFINITIONS(pthreadpool_interface INTERFACE PTHREADPOOL_NO_DEPRECATED_API=1)
93ENDIF()
Marat Dukhan2258d1e2017-10-24 15:11:16 -070094INSTALL(FILES include/pthreadpool.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
95
Marat Dukhanc3202af2017-11-03 16:02:16 -070096IF(PTHREADPOOL_LIBRARY_TYPE STREQUAL "default")
97 ADD_LIBRARY(pthreadpool ${PTHREADPOOL_SRCS})
98ELSEIF(PTHREADPOOL_LIBRARY_TYPE STREQUAL "shared")
Marat Dukhan372026a2017-11-03 15:52:32 -070099 ADD_LIBRARY(pthreadpool SHARED ${PTHREADPOOL_SRCS})
Marat Dukhanc3202af2017-11-03 16:02:16 -0700100ELSEIF(PTHREADPOOL_LIBRARY_TYPE STREQUAL "static")
Marat Dukhan372026a2017-11-03 15:52:32 -0700101 ADD_LIBRARY(pthreadpool STATIC ${PTHREADPOOL_SRCS})
Marat Dukhan7d3b3722017-11-03 16:08:49 -0700102ELSE()
103 MESSAGE(FATAL_ERROR "Unsupported library type ${PTHREADPOOL_LIBRARY_TYPE}")
Marat Dukhan372026a2017-11-03 15:52:32 -0700104ENDIF()
Marat Dukhan2b06b312018-02-25 00:45:56 +0100105
Marat Dukhanfc793bc2020-04-01 17:08:30 -0700106IF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "condvar")
107 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=0)
Marat Dukhanbe9c8932020-04-01 22:40:00 -0700108 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=0)
Marat Dukhanbe1bd8e2020-04-07 19:14:45 -0700109 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=0)
Marat Dukhanfc793bc2020-04-01 17:08:30 -0700110ELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "futex")
111 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=1)
Marat Dukhanbe9c8932020-04-01 22:40:00 -0700112 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=0)
Marat Dukhanbe1bd8e2020-04-07 19:14:45 -0700113 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=0)
Marat Dukhanbe9c8932020-04-01 22:40:00 -0700114ELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "gcd")
115 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=0)
116 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=1)
Marat Dukhanbe1bd8e2020-04-07 19:14:45 -0700117 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=0)
118ELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "event")
119 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=0)
120 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=0)
121 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=1)
Marat Dukhanfc793bc2020-04-01 17:08:30 -0700122ELSEIF(NOT PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default")
123 MESSAGE(FATAL_ERROR "Unsupported synchronization primitive ${PTHREADPOOL_SYNC_PRIMITIVE}")
124ENDIF()
Marat Dukhan0672a7e2020-05-02 22:29:51 -0700125IF(PTHREADPOOL_ENABLE_FASTPATH)
126 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_ENABLE_FASTPATH=1)
127ELSE()
128 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_ENABLE_FASTPATH=0)
129ENDIF()
Marat Dukhanfc793bc2020-04-01 17:08:30 -0700130
Marat Dukhanf535e632019-10-19 04:53:23 -0400131SET_TARGET_PROPERTIES(pthreadpool PROPERTIES
132 C_STANDARD 11
133 C_EXTENSIONS NO)
Marat Dukhan2258d1e2017-10-24 15:11:16 -0700134TARGET_LINK_LIBRARIES(pthreadpool PUBLIC pthreadpool_interface)
Marat Dukhan29f0e2c2019-09-30 15:22:14 -0700135TARGET_INCLUDE_DIRECTORIES(pthreadpool PRIVATE src)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700136IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
137 SET(CMAKE_THREAD_PREFER_PTHREAD TRUE)
Marat Dukhan16bd2292018-07-08 14:41:02 -0700138 IF(NOT CMAKE_GENERATOR STREQUAL "Xcode")
139 FIND_PACKAGE(Threads REQUIRED)
140 ENDIF()
Marat Dukhanfb701272017-10-26 01:11:11 +0000141 IF(CMAKE_USE_PTHREADS_INIT)
Marat Dukhanc4a4d1a2017-10-25 19:57:35 -0700142 IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
Marat Dukhan2b06b312018-02-25 00:45:56 +0100143 TARGET_COMPILE_OPTIONS(pthreadpool PUBLIC -pthread)
Marat Dukhanc4a4d1a2017-10-25 19:57:35 -0700144 ENDIF()
Marat Dukhanfb701272017-10-26 01:11:11 +0000145 ENDIF()
146 TARGET_LINK_LIBRARIES(pthreadpool PUBLIC ${CMAKE_THREAD_LIBS_INIT})
147ENDIF()
148IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
Marat Dukhan2b06b312018-02-25 00:45:56 +0100149 TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE _GNU_SOURCE=1)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700150ENDIF()
151
Marat Dukhanefce26f2017-10-17 19:57:56 -0700152# ---[ Configure FXdiv
153IF(NOT TARGET fxdiv)
154 SET(FXDIV_BUILD_TESTS OFF CACHE BOOL "")
155 SET(FXDIV_BUILD_BENCHMARKS OFF CACHE BOOL "")
156 ADD_SUBDIRECTORY(
Marat Dukhanb76d1ca2018-01-31 17:21:26 -0800157 "${FXDIV_SOURCE_DIR}"
Marat Dukhan9589e302019-10-19 00:36:50 -0700158 "${CMAKE_BINARY_DIR}/FXdiv")
Marat Dukhanefce26f2017-10-17 19:57:56 -0700159ENDIF()
160TARGET_LINK_LIBRARIES(pthreadpool PRIVATE fxdiv)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700161
162INSTALL(TARGETS pthreadpool
163 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
Marat Dukhan2258d1e2017-10-24 15:11:16 -0700164 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700165
166IF(PTHREADPOOL_BUILD_TESTS)
Marat Dukhanefce26f2017-10-17 19:57:56 -0700167 # ---[ Build google test
168 IF(NOT TARGET gtest)
169 SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
170 ADD_SUBDIRECTORY(
Marat Dukhanb76d1ca2018-01-31 17:21:26 -0800171 "${GOOGLETEST_SOURCE_DIR}"
Marat Dukhan9589e302019-10-19 00:36:50 -0700172 "${CMAKE_BINARY_DIR}/googletest")
Marat Dukhanefce26f2017-10-17 19:57:56 -0700173 ENDIF()
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700174
175 ADD_EXECUTABLE(pthreadpool-test test/pthreadpool.cc)
Marat Dukhanf535e632019-10-19 04:53:23 -0400176 SET_TARGET_PROPERTIES(pthreadpool-test PROPERTIES
177 CXX_STANDARD 11
178 CXX_EXTENSIONS NO)
Marat Dukhanefce26f2017-10-17 19:57:56 -0700179 TARGET_LINK_LIBRARIES(pthreadpool-test pthreadpool gtest gtest_main)
180 ADD_TEST(pthreadpool pthreadpool-test)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700181ENDIF()
182
183IF(PTHREADPOOL_BUILD_BENCHMARKS)
Marat Dukhanefce26f2017-10-17 19:57:56 -0700184 # ---[ Build google benchmark
185 IF(NOT TARGET benchmark)
Marat Dukhanf7c1b3b2017-11-10 15:45:01 -0800186 SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "")
Marat Dukhanefce26f2017-10-17 19:57:56 -0700187 ADD_SUBDIRECTORY(
Marat Dukhanb76d1ca2018-01-31 17:21:26 -0800188 "${GOOGLEBENCHMARK_SOURCE_DIR}"
Marat Dukhan9589e302019-10-19 00:36:50 -0700189 "${CMAKE_BINARY_DIR}/googlebenchmark")
Marat Dukhanefce26f2017-10-17 19:57:56 -0700190 ENDIF()
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700191
192 ADD_EXECUTABLE(latency-bench bench/latency.cc)
Marat Dukhanf535e632019-10-19 04:53:23 -0400193 SET_TARGET_PROPERTIES(latency-bench PROPERTIES
194 CXX_STANDARD 11
195 CXX_EXTENSIONS NO)
Marat Dukhanefce26f2017-10-17 19:57:56 -0700196 TARGET_LINK_LIBRARIES(latency-bench pthreadpool benchmark)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700197
198 ADD_EXECUTABLE(throughput-bench bench/throughput.cc)
Marat Dukhanf535e632019-10-19 04:53:23 -0400199 SET_TARGET_PROPERTIES(throughput-bench PROPERTIES
200 CXX_STANDARD 11
201 CXX_EXTENSIONS NO)
Marat Dukhanefce26f2017-10-17 19:57:56 -0700202 TARGET_LINK_LIBRARIES(throughput-bench pthreadpool benchmark)
Marat Dukhanbe01e8c2017-10-17 12:55:28 -0700203ENDIF()