aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarat Dukhan <marat@fb.com>2017-10-17 12:02:07 -0700
committerMarat Dukhan <marat@fb.com>2017-10-17 12:02:07 -0700
commit46139ff79e4e90fd52240d798a4c8d6faa424998 (patch)
tree6a2dcaf79b04ed9e0e6627638a289302a1b1c69e
parentf7960924cb1f67e06f6529dba09eeda9baa4cacb (diff)
downloadFXdiv-46139ff79e4e90fd52240d798a4c8d6faa424998.tar.gz
CMake configuration
-rw-r--r--CMakeLists.txt66
-rw-r--r--cmake/FindGBenchmark.cmake32
-rw-r--r--cmake/FindGTest.cmake38
3 files changed, 136 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..3726d5d
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,66 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.0 FATAL_ERROR)
+
+INCLUDE(GNUInstallDirs)
+
+# ---[ Project
+PROJECT(FXdiv LANGUAGES CXX)
+
+# ---[ Options.
+OPTION(FXDIV_BUILD_TESTS "Build C++ unit tests" OFF)
+OPTION(FXDIV_BUILD_BENCHMARKS "Build C++ micro-benchmarks" OFF)
+
+# ---[ CMake options
+LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
+IF(FXDIV_BUILD_TESTS)
+ ENABLE_TESTING()
+ENDIF()
+
+# ---[ Build flags
+IF(NOT MSVC)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+ENDIF()
+
+# ---[ FXdiv library
+ADD_LIBRARY(fxdiv INTERFACE)
+TARGET_INCLUDE_DIRECTORIES(fxdiv INTERFACE include)
+
+INSTALL(TARGETS fxdiv
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+IF(FXDIV_BUILD_TESTS)
+ FIND_PACKAGE(GTest REQUIRED)
+
+ ADD_EXECUTABLE(multiply-high-test test/multiply-high.cc)
+ TARGET_INCLUDE_DIRECTORIES(multiply-high-test PRIVATE ${GTEST_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(multiply-high-test fxdiv ${GTEST_BOTH_LIBRARIES})
+ ADD_TEST(multiply-high multiply-high-test)
+
+ ADD_EXECUTABLE(quotient-test test/quotient.cc)
+ TARGET_INCLUDE_DIRECTORIES(quotient-test PRIVATE ${GTEST_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(quotient-test fxdiv ${GTEST_BOTH_LIBRARIES})
+ ADD_TEST(quotient quotient-test)
+ENDIF()
+
+IF(FXDIV_BUILD_BENCHMARKS)
+ FIND_PACKAGE(GBenchmark REQUIRED)
+
+ ADD_EXECUTABLE(init-bench bench/init.cc)
+ TARGET_INCLUDE_DIRECTORIES(init-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(init-bench fxdiv ${GBENCHMARK_LIBRARIES})
+
+ ADD_EXECUTABLE(multiply-bench bench/multiply.cc)
+ TARGET_INCLUDE_DIRECTORIES(multiply-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(multiply-bench fxdiv ${GBENCHMARK_LIBRARIES})
+
+ ADD_EXECUTABLE(divide-bench bench/divide.cc)
+ TARGET_INCLUDE_DIRECTORIES(divide-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(divide-bench fxdiv ${GBENCHMARK_LIBRARIES})
+
+ ADD_EXECUTABLE(quotient-bench bench/quotient.cc)
+ TARGET_INCLUDE_DIRECTORIES(quotient-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(quotient-bench fxdiv ${GBENCHMARK_LIBRARIES})
+
+ ADD_EXECUTABLE(round-down-bench bench/round-down.cc)
+ TARGET_INCLUDE_DIRECTORIES(round-down-bench PRIVATE ${GBENCHMARK_INCLUDE_DIRS})
+ TARGET_LINK_LIBRARIES(round-down-bench fxdiv ${GBENCHMARK_LIBRARIES})
+ENDIF()
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()