aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarat Dukhan <marat@fb.com>2017-10-17 12:55:28 -0700
committerMarat Dukhan <marat@fb.com>2017-10-17 12:55:28 -0700
commitbe01e8cf59f680e14bf5f1fc575a7a133a4a5d7d (patch)
tree67cffa85433e19b0e92f987470a03fb28ec85934
parent097a0c8971176257d7d565c4d37b754a12b3566b (diff)
downloadplatform_external_pthreadpool-be01e8cf59f680e14bf5f1fc575a7a133a4a5d7d.tar.gz
platform_external_pthreadpool-be01e8cf59f680e14bf5f1fc575a7a133a4a5d7d.tar.bz2
platform_external_pthreadpool-be01e8cf59f680e14bf5f1fc575a7a133a4a5d7d.zip
CMake configuration
-rw-r--r--CMakeLists.txt68
-rw-r--r--cmake/FindFXdiv.cmake22
-rw-r--r--cmake/FindGBenchmark.cmake32
-rw-r--r--cmake/FindGTest.cmake38
4 files changed, 160 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..cd4b767
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,68 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.2 FATAL_ERROR)
+
+INCLUDE(GNUInstallDirs)
+
+# ---[ Project
+PROJECT(pthreadpool LANGUAGES C CXX)
+
+# ---[ Options.
+OPTION(PTHREADPOOL_BUILD_TESTS "Build pthreadpool unit tests" OFF)
+OPTION(PTHREADPOOL_BUILD_BENCHMARKS "Build pthreadpool micro-benchmarks" OFF)
+
+# ---[ CMake options
+LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
+IF(PTHREADPOOL_BUILD_TESTS)
+ ENABLE_TESTING()
+ENDIF()
+
+# ---[ Build flags
+IF(NOT MSVC)
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+ENDIF()
+
+# ---[ pthreadpool library
+IF(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
+ SET(PTHREADPOOL_SRCS src/threadpool-shim.c)
+ELSE()
+ SET(PTHREADPOOL_SRCS src/threadpool-pthreads.c)
+ENDIF()
+
+ADD_LIBRARY(pthreadpool ${PTHREADPOOL_SRCS})
+SET_TARGET_PROPERTIES(pthreadpool PROPERTIES PUBLIC_HEADER include/pthreadpool.h)
+TARGET_INCLUDE_DIRECTORIES(pthreadpool PUBLIC include)
+IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
+ SET(CMAKE_THREAD_PREFER_PTHREAD TRUE)
+ SET(THREADS_PREFER_PTHREAD_FLAG TRUE)
+ FIND_PACKAGE(Threads REQUIRED)
+ TARGET_LINK_LIBRARIES(pthreadpool PUBLIC Threads::Threads)
+ENDIF()
+
+FIND_PACKAGE(FXdiv REQUIRED)
+TARGET_INCLUDE_DIRECTORIES(pthreadpool PRIVATE ${FXDIV_INCLUDE_DIRS})
+ADD_DEPENDENCIES(pthreadpool ${FXDIV_DEPENDENCY})
+
+INSTALL(TARGETS pthreadpool
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+IF(PTHREADPOOL_BUILD_TESTS)
+ FIND_PACKAGE(GTest REQUIRED)
+
+ ADD_EXECUTABLE(pthreadpool-test test/pthreadpool.cc)
+ TARGET_INCLUDE_DIRECTORIES(pthreadpool-test PRIVATE ${GTEST_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(pthreadpool-test pthreadpool ${GTEST_BOTH_LIBRARIES})
+ENDIF()
+
+IF(PTHREADPOOL_BUILD_BENCHMARKS)
+ FIND_PACKAGE(GBenchmark REQUIRED)
+
+ ADD_EXECUTABLE(latency-bench bench/latency.cc)
+ TARGET_INCLUDE_DIRECTORIES(latency-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(latency-bench pthreadpool ${GBENCHMARK_LIBRARIES})
+
+ ADD_EXECUTABLE(throughput-bench bench/throughput.cc)
+ TARGET_INCLUDE_DIRECTORIES(throughput-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(throughput-bench pthreadpool ${GBENCHMARK_LIBRARIES})
+ENDIF()
diff --git a/cmake/FindFXdiv.cmake b/cmake/FindFXdiv.cmake
new file mode 100644
index 0000000..bdb6403
--- /dev/null
+++ b/cmake/FindFXdiv.cmake
@@ -0,0 +1,22 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.2 FATAL_ERROR)
+
+FUNCTION(BUILD_FXDIV)
+ INCLUDE(ExternalProject)
+ ExternalProject_Add(fxdiv
+ GIT_REPOSITORY https://github.com/Maratyszcza/FXdiv.git
+ GIT_TAG master
+ INSTALL_COMMAND ""
+ BUILD_BYPRODUCTS <SOURCE_DIR>/include/fxdiv.h
+ )
+
+ ExternalProject_Get_Property(fxdiv source_dir)
+ SET(FXDIV_FOUND TRUE PARENT_SCOPE)
+ SET(FXDIV_DEPENDENCY fxdiv PARENT_SCOPE)
+ SET(FXDIV_INCLUDE_DIRS ${source_dir}/include PARENT_SCOPE)
+
+ MARK_AS_ADVANCED(FORCE FXDIV_FOUND)
+ MARK_AS_ADVANCED(FORCE FXDIV_DEPENDENCY)
+ MARK_AS_ADVANCED(FORCE FXDIV_INCLUDE_DIRS)
+ENDFUNCTION(BUILD_FXDIV)
+
+BUILD_FXDIV()
diff --git a/cmake/FindGBenchmark.cmake b/cmake/FindGBenchmark.cmake
new file mode 100644
index 0000000..bdadd00
--- /dev/null
+++ b/cmake/FindGBenchmark.cmake
@@ -0,0 +1,32 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.2 FATAL_ERROR)
+
+FUNCTION(BUILD_GBENCHMARK)
+ INCLUDE(ExternalProject)
+ SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "" FORCE)
+ ExternalProject_Add(google_benchmark
+ URL https://github.com/google/benchmark/archive/v1.2.0.zip
+ URL_HASH SHA256=cc463b28cb3701a35c0855fbcefb75b29068443f1952b64dd5f4f669272e95ea
+ INSTALL_COMMAND ""
+ BUILD_BYPRODUCTS <BINARY_DIR>/src/libbenchmark.a
+ )
+
+ ExternalProject_Get_Property(google_benchmark install_dir)
+
+ ADD_LIBRARY(gbenchmark STATIC IMPORTED)
+ ADD_DEPENDENCIES(gbenchmark google_benchmark)
+
+ ExternalProject_Get_Property(google_benchmark source_dir)
+ SET(GBENCHMARK_INCLUDE_DIRS ${source_dir}/include PARENT_SCOPE)
+
+ ExternalProject_Get_Property(google_benchmark binary_dir)
+ SET_TARGET_PROPERTIES(gbenchmark PROPERTIES IMPORTED_LOCATION ${binary_dir}/src/libbenchmark.a)
+
+ SET(GBENCHMARK_FOUND TRUE PARENT_SCOPE)
+ SET(GBENCHMARK_LIBRARIES gbenchmark PARENT_SCOPE)
+
+ MARK_AS_ADVANCED(FORCE GBENCHMARK_FOUND)
+ MARK_AS_ADVANCED(FORCE GBENCHMARK_INCLUDE_DIRS)
+ MARK_AS_ADVANCED(FORCE GBENCHMARK_LIBRARIES)
+ENDFUNCTION(BUILD_GBENCHMARK)
+
+BUILD_GBENCHMARK()
diff --git a/cmake/FindGTest.cmake b/cmake/FindGTest.cmake
new file mode 100644
index 0000000..2926103
--- /dev/null
+++ b/cmake/FindGTest.cmake
@@ -0,0 +1,38 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.2 FATAL_ERROR)
+
+FUNCTION(BUILD_GTEST)
+ INCLUDE(ExternalProject)
+ SET(BUILD_GTEST ON CACHE BOOL "" FORCE)
+ SET(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
+ ExternalProject_Add(googletest
+ URL https://github.com/google/googletest/archive/release-1.8.0.zip
+ URL_HASH SHA256=f3ed3b58511efd272eb074a3a6d6fb79d7c2e6a0e374323d1e6bcbcc1ef141bf
+ INSTALL_COMMAND ""
+ BUILD_BYPRODUCTS <BINARY_DIR>/googlemock/gtest/libgtest.a <BINARY_DIR>/googlemock/gtest/libgtest_main.a
+ )
+
+ ADD_LIBRARY(gtest UNKNOWN IMPORTED)
+ ADD_LIBRARY(gtest_main UNKNOWN IMPORTED)
+ ADD_DEPENDENCIES(gtest googletest)
+ ADD_DEPENDENCIES(gtest_main googletest)
+
+ ExternalProject_Get_Property(googletest source_dir)
+ SET(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE)
+
+ ExternalProject_Get_Property(googletest binary_dir)
+ SET_TARGET_PROPERTIES(gtest PROPERTIES IMPORTED_LOCATION ${binary_dir}/googlemock/gtest/libgtest.a)
+ SET_TARGET_PROPERTIES(gtest_main PROPERTIES IMPORTED_LOCATION ${binary_dir}/googlemock/gtest/libgtest_main.a)
+
+ SET(GTEST_FOUND TRUE PARENT_SCOPE)
+ SET(GTEST_BOTH_LIBRARIES gtest gtest_main PARENT_SCOPE)
+ SET(GTEST_LIBRARIES gtest PARENT_SCOPE)
+ SET(GTEST_MAIN_LIBRARIES gtest_main PARENT_SCOPE)
+
+ MARK_AS_ADVANCED(FORCE GTEST_FOUND)
+ MARK_AS_ADVANCED(FORCE GTEST_INCLUDE_DIRS)
+ MARK_AS_ADVANCED(FORCE GTEST_LIBRARIES)
+ MARK_AS_ADVANCED(FORCE GTEST_MAIN_LIBRARIES)
+ MARK_AS_ADVANCED(FORCE GTEST_BOTH_LIBRARIES)
+ENDFUNCTION(BUILD_GTEST)
+
+BUILD_GTEST()