1CMAKE_MINIMUM_REQUIRED(VERSION 3.5 FATAL_ERROR) 2 3# ---[ Project 4PROJECT(FXdiv C CXX) 5 6# ---[ Options. 7OPTION(FXDIV_USE_INLINE_ASSEMBLY "Allow use of inline assembly in FXdiv" OFF) 8IF("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}") 9 OPTION(FXDIV_BUILD_TESTS "Build FXdiv unit tests" ON) 10 OPTION(FXDIV_BUILD_BENCHMARKS "Build FXdiv micro-benchmarks" ON) 11ELSE() 12 SET(FXDIV_BUILD_TESTS OFF CACHE BOOL "Build FXdiv unit tests") 13 SET(FXDIV_BUILD_BENCHMARKS OFF CACHE BOOL "Build FXdiv micro-benchmarks") 14ENDIF() 15 16# ---[ CMake options 17INCLUDE(GNUInstallDirs) 18 19IF(FXDIV_BUILD_TESTS) 20 ENABLE_TESTING() 21ENDIF() 22 23# ---[ Download deps 24IF(FXDIV_BUILD_TESTS AND NOT DEFINED GOOGLETEST_SOURCE_DIR) 25 MESSAGE(STATUS "Downloading Google Test to ${CMAKE_BINARY_DIR}/googletest-source (define GOOGLETEST_SOURCE_DIR to avoid it)") 26 CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt") 27 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 28 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download") 29 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build . 30 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download") 31 SET(GOOGLETEST_SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-source" CACHE STRING "Google Test source directory") 32ENDIF() 33 34IF(FXDIV_BUILD_BENCHMARKS AND NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR) 35 MESSAGE(STATUS "Downloading Google Benchmark to ${CMAKE_BINARY_DIR}/googlebenchmark-source (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)") 36 CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CMAKE_BINARY_DIR}/googlebenchmark-download/CMakeLists.txt") 37 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 38 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download") 39 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build . 40 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googlebenchmark-download") 41 SET(GOOGLEBENCHMARK_SOURCE_DIR "${CMAKE_BINARY_DIR}/googlebenchmark-source" CACHE STRING "Google Benchmark source directory") 42ENDIF() 43 44# ---[ FXdiv library 45ADD_LIBRARY(fxdiv INTERFACE) 46TARGET_INCLUDE_DIRECTORIES(fxdiv INTERFACE include) 47IF(FXDIV_USE_INLINE_ASSEMBLY) 48 TARGET_COMPILE_DEFINITIONS(fxdiv INTERFACE FXDIV_USE_INLINE_ASSEMBLY=1) 49ELSE() 50 TARGET_COMPILE_DEFINITIONS(fxdiv INTERFACE FXDIV_USE_INLINE_ASSEMBLY=0) 51ENDIF() 52 53INSTALL(FILES include/fxdiv.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 54 55IF(FXDIV_BUILD_TESTS) 56 # ---[ Build google test 57 IF(NOT TARGET gtest) 58 SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE) 59 ADD_SUBDIRECTORY( 60 "${GOOGLETEST_SOURCE_DIR}" 61 "${CMAKE_BINARY_DIR}/googletest") 62 ENDIF() 63 64 ADD_EXECUTABLE(multiply-high-test test/multiply-high.cc) 65 SET_TARGET_PROPERTIES(multiply-high-test PROPERTIES 66 CXX_STANDARD 11 67 CXX_EXTENSIONS YES) 68 TARGET_LINK_LIBRARIES(multiply-high-test fxdiv gtest gtest_main) 69 ADD_TEST(multiply-high multiply-high-test) 70 71 ADD_EXECUTABLE(quotient-test test/quotient.cc) 72 SET_TARGET_PROPERTIES(quotient-test PROPERTIES 73 CXX_STANDARD 11 74 CXX_EXTENSIONS YES) 75 TARGET_LINK_LIBRARIES(quotient-test fxdiv gtest gtest_main) 76 ADD_TEST(quotient quotient-test) 77ENDIF() 78 79IF(FXDIV_BUILD_BENCHMARKS) 80 # ---[ Build google benchmark 81 IF(NOT TARGET benchmark) 82 SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "" FORCE) 83 ADD_SUBDIRECTORY( 84 "${GOOGLEBENCHMARK_SOURCE_DIR}" 85 "${CMAKE_BINARY_DIR}/googlebenchmark") 86 ENDIF() 87 88 ADD_EXECUTABLE(init-bench bench/init.cc) 89 SET_TARGET_PROPERTIES(init-bench PROPERTIES 90 CXX_STANDARD 11 91 CXX_EXTENSIONS YES) 92 TARGET_LINK_LIBRARIES(init-bench fxdiv benchmark) 93 94 ADD_EXECUTABLE(multiply-bench bench/multiply.cc) 95 SET_TARGET_PROPERTIES(multiply-bench PROPERTIES 96 CXX_STANDARD 11 97 CXX_EXTENSIONS YES) 98 TARGET_LINK_LIBRARIES(multiply-bench fxdiv benchmark) 99 100 ADD_EXECUTABLE(divide-bench bench/divide.cc) 101 SET_TARGET_PROPERTIES(divide-bench PROPERTIES 102 CXX_STANDARD 11 103 CXX_EXTENSIONS YES) 104 TARGET_LINK_LIBRARIES(divide-bench fxdiv benchmark) 105 106 ADD_EXECUTABLE(quotient-bench bench/quotient.cc) 107 SET_TARGET_PROPERTIES(quotient-bench PROPERTIES 108 CXX_STANDARD 11 109 CXX_EXTENSIONS YES) 110 TARGET_LINK_LIBRARIES(quotient-bench fxdiv benchmark) 111 112 ADD_EXECUTABLE(round-down-bench bench/round-down.cc) 113 SET_TARGET_PROPERTIES(round-down-bench PROPERTIES 114 CXX_STANDARD 11 115 CXX_EXTENSIONS YES) 116 TARGET_LINK_LIBRARIES(round-down-bench fxdiv benchmark) 117ENDIF() 118