1*b095b053SXin LiCMAKE_MINIMUM_REQUIRED(VERSION 3.5 FATAL_ERROR) 2*b095b053SXin Li 3*b095b053SXin Li# ---[ Project 4*b095b053SXin LiPROJECT(pthreadpool C CXX) 5*b095b053SXin Li 6*b095b053SXin Li# ---[ Options. 7*b095b053SXin LiSET(PTHREADPOOL_LIBRARY_TYPE "default" CACHE STRING "Type of library (shared, static, or default) to build") 8*b095b053SXin LiSET_PROPERTY(CACHE PTHREADPOOL_LIBRARY_TYPE PROPERTY STRINGS default static shared) 9*b095b053SXin LiOPTION(PTHREADPOOL_ALLOW_DEPRECATED_API "Enable deprecated API functions" ON) 10*b095b053SXin LiSET(PTHREADPOOL_SYNC_PRIMITIVE "default" CACHE STRING "Synchronization primitive (condvar, futex, gcd, event, or default) for worker threads") 11*b095b053SXin LiSET_PROPERTY(CACHE PTHREADPOOL_SYNC_PRIMITIVE PROPERTY STRINGS default condvar futex gcd event) 12*b095b053SXin LiIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|AMD64|x86(_64)?)$") 13*b095b053SXin Li OPTION(PTHREADPOOL_ENABLE_FASTPATH "Enable fast path using atomic decrement instead of atomic compare-and-swap" ON) 14*b095b053SXin LiELSE() 15*b095b053SXin Li OPTION(PTHREADPOOL_ENABLE_FASTPATH "Enable fast path using atomic decrement instead of atomic compare-and-swap" OFF) 16*b095b053SXin LiENDIF() 17*b095b053SXin LiIF("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}") 18*b095b053SXin Li OPTION(PTHREADPOOL_BUILD_TESTS "Build pthreadpool unit tests" ON) 19*b095b053SXin Li OPTION(PTHREADPOOL_BUILD_BENCHMARKS "Build pthreadpool micro-benchmarks" ON) 20*b095b053SXin LiELSE() 21*b095b053SXin Li SET(PTHREADPOOL_BUILD_TESTS OFF CACHE BOOL "Build pthreadpool unit tests") 22*b095b053SXin Li SET(PTHREADPOOL_BUILD_BENCHMARKS OFF CACHE BOOL "Build pthreadpool micro-benchmarks") 23*b095b053SXin LiENDIF() 24*b095b053SXin Li 25*b095b053SXin Li# ---[ CMake options 26*b095b053SXin LiINCLUDE(GNUInstallDirs) 27*b095b053SXin Li 28*b095b053SXin LiIF(PTHREADPOOL_BUILD_TESTS) 29*b095b053SXin Li ENABLE_TESTING() 30*b095b053SXin LiENDIF() 31*b095b053SXin Li 32*b095b053SXin LiMACRO(PTHREADPOOL_TARGET_ENABLE_CXX11 target) 33*b095b053SXin Li SET_TARGET_PROPERTIES(${target} PROPERTIES 34*b095b053SXin Li CXX_STANDARD 11 35*b095b053SXin Li CXX_EXTENSIONS NO) 36*b095b053SXin LiENDMACRO() 37*b095b053SXin Li 38*b095b053SXin Li# ---[ Download deps 39*b095b053SXin LiIF(NOT DEFINED FXDIV_SOURCE_DIR) 40*b095b053SXin Li MESSAGE(STATUS "Downloading FXdiv to ${CMAKE_BINARY_DIR}/FXdiv-source (define FXDIV_SOURCE_DIR to avoid it)") 41*b095b053SXin Li CONFIGURE_FILE(cmake/DownloadFXdiv.cmake "${CMAKE_BINARY_DIR}/FXdiv-download/CMakeLists.txt") 42*b095b053SXin Li EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 43*b095b053SXin Li WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/FXdiv-download") 44*b095b053SXin Li EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build . 45*b095b053SXin Li WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/FXdiv-download") 46*b095b053SXin Li SET(FXDIV_SOURCE_DIR "${CMAKE_BINARY_DIR}/FXdiv-source" CACHE STRING "FXdiv source directory") 47*b095b053SXin LiENDIF() 48*b095b053SXin Li 49*b095b053SXin LiIF(PTHREADPOOL_BUILD_TESTS AND NOT DEFINED GOOGLETEST_SOURCE_DIR) 50*b095b053SXin Li MESSAGE(STATUS "Downloading Google Test to ${CMAKE_BINARY_DIR}/googletest-source (define GOOGLETEST_SOURCE_DIR to avoid it)") 51*b095b053SXin Li CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt") 52*b095b053SXin Li EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 53*b095b053SXin Li WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download") 54*b095b053SXin Li EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build . 55*b095b053SXin Li WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download") 56*b095b053SXin Li SET(GOOGLETEST_SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-source" CACHE STRING "Google Test source directory") 57*b095b053SXin LiENDIF() 58*b095b053SXin Li 59*b095b053SXin LiIF(PTHREADPOOL_BUILD_BENCHMARKS AND NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR) 60*b095b053SXin Li MESSAGE(STATUS "Downloading Google Benchmark to ${CMAKE_BINARY_DIR}/googlebenchmark-source (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)") 61*b095b053SXin Li CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CMAKE_BINARY_DIR}/googlebenchmark-download/CMakeLists.txt") 62*b095b053SXin Li EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 63*b095b053SXin Li WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download") 64*b095b053SXin Li EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build . 65*b095b053SXin Li WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download") 66*b095b053SXin Li SET(GOOGLEBENCHMARK_SOURCE_DIR "${CMAKE_BINARY_DIR}/googlebenchmark-source" CACHE STRING "Google Benchmark source directory") 67*b095b053SXin LiENDIF() 68*b095b053SXin Li 69*b095b053SXin Li# ---[ pthreadpool library 70*b095b053SXin LiIF(PTHREADPOOL_ALLOW_DEPRECATED_API) 71*b095b053SXin Li SET(PTHREADPOOL_SRCS src/legacy-api.c) 72*b095b053SXin LiENDIF() 73*b095b053SXin LiIF(EMSCRIPTEN) 74*b095b053SXin Li LIST(APPEND PTHREADPOOL_SRCS src/shim.c) 75*b095b053SXin LiELSE() 76*b095b053SXin Li LIST(APPEND PTHREADPOOL_SRCS src/portable-api.c src/memory.c) 77*b095b053SXin Li IF(APPLE AND (PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default" OR PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "gcd")) 78*b095b053SXin Li LIST(APPEND PTHREADPOOL_SRCS src/gcd.c) 79*b095b053SXin Li ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^(Windows|CYGWIN|MSYS)$" AND (PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default" OR PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "event")) 80*b095b053SXin Li LIST(APPEND PTHREADPOOL_SRCS src/windows.c) 81*b095b053SXin Li ELSE() 82*b095b053SXin Li LIST(APPEND PTHREADPOOL_SRCS src/pthreads.c) 83*b095b053SXin Li ENDIF() 84*b095b053SXin Li IF(PTHREADPOOL_ENABLE_FASTPATH) 85*b095b053SXin Li LIST(APPEND PTHREADPOOL_SRCS src/fastpath.c) 86*b095b053SXin Li ENDIF() 87*b095b053SXin LiENDIF() 88*b095b053SXin Li 89*b095b053SXin LiADD_LIBRARY(pthreadpool_interface INTERFACE) 90*b095b053SXin LiTARGET_INCLUDE_DIRECTORIES(pthreadpool_interface INTERFACE include) 91*b095b053SXin LiIF(NOT PTHREADPOOL_ALLOW_DEPRECATED_API) 92*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool_interface INTERFACE PTHREADPOOL_NO_DEPRECATED_API=1) 93*b095b053SXin LiENDIF() 94*b095b053SXin LiINSTALL(FILES include/pthreadpool.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 95*b095b053SXin Li 96*b095b053SXin LiIF(PTHREADPOOL_LIBRARY_TYPE STREQUAL "default") 97*b095b053SXin Li ADD_LIBRARY(pthreadpool ${PTHREADPOOL_SRCS}) 98*b095b053SXin LiELSEIF(PTHREADPOOL_LIBRARY_TYPE STREQUAL "shared") 99*b095b053SXin Li ADD_LIBRARY(pthreadpool SHARED ${PTHREADPOOL_SRCS}) 100*b095b053SXin LiELSEIF(PTHREADPOOL_LIBRARY_TYPE STREQUAL "static") 101*b095b053SXin Li ADD_LIBRARY(pthreadpool STATIC ${PTHREADPOOL_SRCS}) 102*b095b053SXin LiELSE() 103*b095b053SXin Li MESSAGE(FATAL_ERROR "Unsupported library type ${PTHREADPOOL_LIBRARY_TYPE}") 104*b095b053SXin LiENDIF() 105*b095b053SXin Li 106*b095b053SXin LiIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "condvar") 107*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=0) 108*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=0) 109*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=0) 110*b095b053SXin LiELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "futex") 111*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=1) 112*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=0) 113*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=0) 114*b095b053SXin LiELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "gcd") 115*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=0) 116*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=1) 117*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=0) 118*b095b053SXin LiELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "event") 119*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=0) 120*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=0) 121*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=1) 122*b095b053SXin LiELSEIF(NOT PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default") 123*b095b053SXin Li MESSAGE(FATAL_ERROR "Unsupported synchronization primitive ${PTHREADPOOL_SYNC_PRIMITIVE}") 124*b095b053SXin LiENDIF() 125*b095b053SXin LiIF(PTHREADPOOL_ENABLE_FASTPATH) 126*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_ENABLE_FASTPATH=1) 127*b095b053SXin LiELSE() 128*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_ENABLE_FASTPATH=0) 129*b095b053SXin LiENDIF() 130*b095b053SXin Li 131*b095b053SXin LiSET_TARGET_PROPERTIES(pthreadpool PROPERTIES 132*b095b053SXin Li C_STANDARD 11 133*b095b053SXin Li C_EXTENSIONS NO) 134*b095b053SXin LiTARGET_LINK_LIBRARIES(pthreadpool PUBLIC pthreadpool_interface) 135*b095b053SXin LiTARGET_INCLUDE_DIRECTORIES(pthreadpool PRIVATE src) 136*b095b053SXin LiIF(NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") 137*b095b053SXin Li SET(CMAKE_THREAD_PREFER_PTHREAD TRUE) 138*b095b053SXin Li IF(NOT CMAKE_GENERATOR STREQUAL "Xcode") 139*b095b053SXin Li FIND_PACKAGE(Threads REQUIRED) 140*b095b053SXin Li ENDIF() 141*b095b053SXin Li IF(CMAKE_USE_PTHREADS_INIT) 142*b095b053SXin Li IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android") 143*b095b053SXin Li TARGET_COMPILE_OPTIONS(pthreadpool PUBLIC -pthread) 144*b095b053SXin Li ENDIF() 145*b095b053SXin Li ENDIF() 146*b095b053SXin Li TARGET_LINK_LIBRARIES(pthreadpool PUBLIC ${CMAKE_THREAD_LIBS_INIT}) 147*b095b053SXin LiENDIF() 148*b095b053SXin LiIF(CMAKE_SYSTEM_NAME STREQUAL "Linux") 149*b095b053SXin Li TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE _GNU_SOURCE=1) 150*b095b053SXin LiENDIF() 151*b095b053SXin Li 152*b095b053SXin Li# ---[ Configure FXdiv 153*b095b053SXin LiIF(NOT TARGET fxdiv) 154*b095b053SXin Li SET(FXDIV_BUILD_TESTS OFF CACHE BOOL "") 155*b095b053SXin Li SET(FXDIV_BUILD_BENCHMARKS OFF CACHE BOOL "") 156*b095b053SXin Li ADD_SUBDIRECTORY( 157*b095b053SXin Li "${FXDIV_SOURCE_DIR}" 158*b095b053SXin Li "${CMAKE_BINARY_DIR}/FXdiv") 159*b095b053SXin LiENDIF() 160*b095b053SXin LiTARGET_LINK_LIBRARIES(pthreadpool PRIVATE fxdiv) 161*b095b053SXin Li 162*b095b053SXin LiINSTALL(TARGETS pthreadpool 163*b095b053SXin Li LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 164*b095b053SXin Li ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) 165*b095b053SXin Li 166*b095b053SXin LiIF(PTHREADPOOL_BUILD_TESTS) 167*b095b053SXin Li # ---[ Build google test 168*b095b053SXin Li IF(NOT TARGET gtest) 169*b095b053SXin Li SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE) 170*b095b053SXin Li ADD_SUBDIRECTORY( 171*b095b053SXin Li "${GOOGLETEST_SOURCE_DIR}" 172*b095b053SXin Li "${CMAKE_BINARY_DIR}/googletest") 173*b095b053SXin Li ENDIF() 174*b095b053SXin Li 175*b095b053SXin Li ADD_EXECUTABLE(pthreadpool-test test/pthreadpool.cc) 176*b095b053SXin Li SET_TARGET_PROPERTIES(pthreadpool-test PROPERTIES 177*b095b053SXin Li CXX_STANDARD 11 178*b095b053SXin Li CXX_EXTENSIONS NO) 179*b095b053SXin Li TARGET_LINK_LIBRARIES(pthreadpool-test pthreadpool gtest gtest_main) 180*b095b053SXin Li ADD_TEST(pthreadpool pthreadpool-test) 181*b095b053SXin LiENDIF() 182*b095b053SXin Li 183*b095b053SXin LiIF(PTHREADPOOL_BUILD_BENCHMARKS) 184*b095b053SXin Li # ---[ Build google benchmark 185*b095b053SXin Li IF(NOT TARGET benchmark) 186*b095b053SXin Li SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "") 187*b095b053SXin Li ADD_SUBDIRECTORY( 188*b095b053SXin Li "${GOOGLEBENCHMARK_SOURCE_DIR}" 189*b095b053SXin Li "${CMAKE_BINARY_DIR}/googlebenchmark") 190*b095b053SXin Li ENDIF() 191*b095b053SXin Li 192*b095b053SXin Li ADD_EXECUTABLE(latency-bench bench/latency.cc) 193*b095b053SXin Li SET_TARGET_PROPERTIES(latency-bench PROPERTIES 194*b095b053SXin Li CXX_STANDARD 11 195*b095b053SXin Li CXX_EXTENSIONS NO) 196*b095b053SXin Li TARGET_LINK_LIBRARIES(latency-bench pthreadpool benchmark) 197*b095b053SXin Li 198*b095b053SXin Li ADD_EXECUTABLE(throughput-bench bench/throughput.cc) 199*b095b053SXin Li SET_TARGET_PROPERTIES(throughput-bench PROPERTIES 200*b095b053SXin Li CXX_STANDARD 11 201*b095b053SXin Li CXX_EXTENSIONS NO) 202*b095b053SXin Li TARGET_LINK_LIBRARIES(throughput-bench pthreadpool benchmark) 203*b095b053SXin LiENDIF() 204