Confu-like deps management in CMake build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f849edb..5c254e0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 3.2 FATAL_ERROR)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
 
 INCLUDE(GNUInstallDirs)
 
@@ -10,11 +10,40 @@
 OPTION(PTHREADPOOL_BUILD_BENCHMARKS "Build pthreadpool micro-benchmarks" ON)
 
 # ---[ CMake options
-LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
 IF(PTHREADPOOL_BUILD_TESTS)
   ENABLE_TESTING()
 ENDIF()
 
+# ---[ Download deps
+SET(CONFU_DEPENDENCIES_SOURCE_DIR ${CMAKE_SOURCE_DIR}/deps
+  CACHE PATH "Confu-style dependencies source directory")
+SET(CONFU_DEPENDENCIES_BINARY_DIR ${CMAKE_BINARY_DIR}/deps
+  CACHE PATH "Confu-style dependencies binary directory")
+
+IF(NOT TARGET fxdiv)
+  CONFIGURE_FILE(cmake/DownloadFXdiv.cmake fxdiv-download/CMakeLists.txt)
+  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
+    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/fxdiv-download")
+  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
+    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/fxdiv-download")
+ENDIF()
+
+IF(NOT TARGET gtest)
+  CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake googletest-download/CMakeLists.txt)
+  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
+    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")
+  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
+    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")
+ENDIF()
+
+IF(NOT TARGET benchmark)
+  CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake googlebenchmark-download/CMakeLists.txt)
+  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
+    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download")
+  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
+    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download")
+ENDIF()
+
 # ---[ Build flags
 IF(NOT MSVC)
   SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
@@ -38,9 +67,15 @@
   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})
+# ---[ Configure FXdiv
+IF(NOT TARGET fxdiv)
+  SET(FXDIV_BUILD_TESTS OFF CACHE BOOL "")
+  SET(FXDIV_BUILD_BENCHMARKS OFF CACHE BOOL "")
+  ADD_SUBDIRECTORY(
+    "${CONFU_DEPENDENCIES_SOURCE_DIR}/fxdiv"
+    "${CONFU_DEPENDENCIES_BINARY_DIR}/fxdiv")
+ENDIF()
+TARGET_LINK_LIBRARIES(pthreadpool PRIVATE fxdiv)
 
 INSTALL(TARGETS pthreadpool
   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
@@ -48,21 +83,31 @@
   PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
 
 IF(PTHREADPOOL_BUILD_TESTS)
-  FIND_PACKAGE(GTest REQUIRED)
+  # ---[ Build google test
+  IF(NOT TARGET gtest)
+    SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
+    ADD_SUBDIRECTORY(
+      "${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest"
+      "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest")
+  ENDIF()
 
   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})
+  TARGET_LINK_LIBRARIES(pthreadpool-test pthreadpool gtest gtest_main)
+  ADD_TEST(pthreadpool pthreadpool-test)
 ENDIF()
 
 IF(PTHREADPOOL_BUILD_BENCHMARKS)
-  FIND_PACKAGE(GBenchmark REQUIRED)
+  # ---[ Build google benchmark
+  IF(NOT TARGET benchmark)
+    SET(BENCHMARK_ENABLE_TESTING ON CACHE BOOL "")
+    ADD_SUBDIRECTORY(
+      "${CONFU_DEPENDENCIES_SOURCE_DIR}/googlebenchmark"
+      "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark")
+  ENDIF()
 
   ADD_EXECUTABLE(latency-bench bench/latency.cc)
-  TARGET_INCLUDE_DIRECTORIES(latency-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
-  TARGET_LINK_LIBRARIES(latency-bench pthreadpool ${GBENCHMARK_LIBRARIES})
+  TARGET_LINK_LIBRARIES(latency-bench pthreadpool benchmark)
 
   ADD_EXECUTABLE(throughput-bench bench/throughput.cc)
-  TARGET_INCLUDE_DIRECTORIES(throughput-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
-  TARGET_LINK_LIBRARIES(throughput-bench pthreadpool ${GBENCHMARK_LIBRARIES})
+  TARGET_LINK_LIBRARIES(throughput-bench pthreadpool benchmark)
 ENDIF()
diff --git a/cmake/DownloadFXdiv.cmake b/cmake/DownloadFXdiv.cmake
new file mode 100644
index 0000000..569334c
--- /dev/null
+++ b/cmake/DownloadFXdiv.cmake
@@ -0,0 +1,15 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
+
+PROJECT(fxdiv-download NONE)
+
+INCLUDE(ExternalProject)
+ExternalProject_Add(fxdiv
+	GIT_REPOSITORY https://github.com/Maratyszcza/FXdiv.git
+	GIT_TAG master
+	SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/fxdiv"
+	BINARY_DIR "${CONFU_DEPENDENCIES_BINARY_DIR}/fxdiv"
+	CONFIGURE_COMMAND ""
+	BUILD_COMMAND ""
+	INSTALL_COMMAND ""
+	TEST_COMMAND ""
+)
diff --git a/cmake/DownloadGoogleBenchmark.cmake b/cmake/DownloadGoogleBenchmark.cmake
new file mode 100644
index 0000000..59da7a6
--- /dev/null
+++ b/cmake/DownloadGoogleBenchmark.cmake
@@ -0,0 +1,15 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
+
+PROJECT(googlebenchmark-download NONE)
+
+INCLUDE(ExternalProject)
+ExternalProject_Add(googlebenchmark
+	URL https://github.com/google/benchmark/archive/v1.2.0.zip
+	URL_HASH SHA256=cc463b28cb3701a35c0855fbcefb75b29068443f1952b64dd5f4f669272e95ea
+	SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googlebenchmark"
+	BINARY_DIR "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark"
+	CONFIGURE_COMMAND ""
+	BUILD_COMMAND ""
+	INSTALL_COMMAND ""
+	TEST_COMMAND ""
+)
diff --git a/cmake/DownloadGoogleTest.cmake b/cmake/DownloadGoogleTest.cmake
new file mode 100644
index 0000000..d69d19a
--- /dev/null
+++ b/cmake/DownloadGoogleTest.cmake
@@ -0,0 +1,15 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
+
+PROJECT(googletest-download NONE)
+
+INCLUDE(ExternalProject)
+ExternalProject_Add(googletest
+	URL https://github.com/google/googletest/archive/release-1.8.0.zip
+	URL_HASH SHA256=f3ed3b58511efd272eb074a3a6d6fb79d7c2e6a0e374323d1e6bcbcc1ef141bf
+	SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest"
+	BINARY_DIR "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest"
+	CONFIGURE_COMMAND ""
+	BUILD_COMMAND ""
+	INSTALL_COMMAND ""
+	TEST_COMMAND ""
+)
diff --git a/cmake/FindFXdiv.cmake b/cmake/FindFXdiv.cmake
deleted file mode 100644
index 2dbac4f..0000000
--- a/cmake/FindFXdiv.cmake
+++ /dev/null
@@ -1,24 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 3.2 FATAL_ERROR)
-
-FUNCTION(BUILD_FXDIV)
-  INCLUDE(ExternalProject)
-  SET(FXDIV_BUILD_TESTS OFF CACHE BOOL "")
-  SET(FXDIV_BUILD_BENCHMARKS OFF CACHE BOOL "")
-  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
deleted file mode 100644
index 2c034b6..0000000
--- a/cmake/FindGBenchmark.cmake
+++ /dev/null
@@ -1,32 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 3.2 FATAL_ERROR)
-
-FUNCTION(BUILD_GBENCHMARK)
-  INCLUDE(ExternalProject)
-  SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "")
-  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
deleted file mode 100644
index 2926103..0000000
--- a/cmake/FindGTest.cmake
+++ /dev/null
@@ -1,38 +0,0 @@
-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()