CMAKE_MINIMUM_REQUIRED(VERSION 3.5 FATAL_ERROR) # ---[ Project PROJECT(FXdiv C CXX) # ---[ Options. OPTION(FXDIV_USE_INLINE_ASSEMBLY "Allow use of inline assembly in FXdiv" OFF) IF("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}") OPTION(FXDIV_BUILD_TESTS "Build FXdiv unit tests" ON) OPTION(FXDIV_BUILD_BENCHMARKS "Build FXdiv micro-benchmarks" ON) ELSE() SET(FXDIV_BUILD_TESTS OFF CACHE BOOL "Build FXdiv unit tests") SET(FXDIV_BUILD_BENCHMARKS OFF CACHE BOOL "Build FXdiv micro-benchmarks") ENDIF() # ---[ CMake options INCLUDE(GNUInstallDirs) IF(FXDIV_BUILD_TESTS) ENABLE_TESTING() ENDIF() # ---[ Download deps IF(FXDIV_BUILD_TESTS AND NOT DEFINED GOOGLETEST_SOURCE_DIR) MESSAGE(STATUS "Downloading Google Test to ${CMAKE_BINARY_DIR}/googletest-source (define GOOGLETEST_SOURCE_DIR to avoid it)") CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CMAKE_BINARY_DIR}/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") SET(GOOGLETEST_SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-source" CACHE STRING "Google Test source directory") ENDIF() IF(FXDIV_BUILD_BENCHMARKS AND NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR) MESSAGE(STATUS "Downloading Google Benchmark to ${CMAKE_BINARY_DIR}/googlebenchmark-source (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)") CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CMAKE_BINARY_DIR}/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") SET(GOOGLEBENCHMARK_SOURCE_DIR "${CMAKE_BINARY_DIR}/googlebenchmark-source" CACHE STRING "Google Benchmark source directory") ENDIF() # ---[ FXdiv library ADD_LIBRARY(fxdiv INTERFACE) TARGET_INCLUDE_DIRECTORIES(fxdiv INTERFACE include) IF(FXDIV_USE_INLINE_ASSEMBLY) TARGET_COMPILE_DEFINITIONS(fxdiv INTERFACE FXDIV_USE_INLINE_ASSEMBLY=1) ELSE() TARGET_COMPILE_DEFINITIONS(fxdiv INTERFACE FXDIV_USE_INLINE_ASSEMBLY=0) ENDIF() INSTALL(FILES include/fxdiv.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) IF(FXDIV_BUILD_TESTS) # ---[ Build google test IF(NOT TARGET gtest) SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE) ADD_SUBDIRECTORY( "${GOOGLETEST_SOURCE_DIR}" "${CMAKE_BINARY_DIR}/googletest") ENDIF() ADD_EXECUTABLE(multiply-high-test test/multiply-high.cc) SET_TARGET_PROPERTIES(multiply-high-test PROPERTIES CXX_STANDARD 11 CXX_EXTENSIONS YES) TARGET_LINK_LIBRARIES(multiply-high-test fxdiv gtest gtest_main) ADD_TEST(multiply-high multiply-high-test) ADD_EXECUTABLE(quotient-test test/quotient.cc) SET_TARGET_PROPERTIES(quotient-test PROPERTIES CXX_STANDARD 11 CXX_EXTENSIONS YES) TARGET_LINK_LIBRARIES(quotient-test fxdiv gtest gtest_main) ADD_TEST(quotient quotient-test) ENDIF() IF(FXDIV_BUILD_BENCHMARKS) # ---[ Build google benchmark IF(NOT TARGET benchmark) SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "" FORCE) ADD_SUBDIRECTORY( "${GOOGLEBENCHMARK_SOURCE_DIR}" "${CMAKE_BINARY_DIR}/googlebenchmark") ENDIF() ADD_EXECUTABLE(init-bench bench/init.cc) SET_TARGET_PROPERTIES(init-bench PROPERTIES CXX_STANDARD 11 CXX_EXTENSIONS YES) TARGET_LINK_LIBRARIES(init-bench fxdiv benchmark) ADD_EXECUTABLE(multiply-bench bench/multiply.cc) SET_TARGET_PROPERTIES(multiply-bench PROPERTIES CXX_STANDARD 11 CXX_EXTENSIONS YES) TARGET_LINK_LIBRARIES(multiply-bench fxdiv benchmark) ADD_EXECUTABLE(divide-bench bench/divide.cc) SET_TARGET_PROPERTIES(divide-bench PROPERTIES CXX_STANDARD 11 CXX_EXTENSIONS YES) TARGET_LINK_LIBRARIES(divide-bench fxdiv benchmark) ADD_EXECUTABLE(quotient-bench bench/quotient.cc) SET_TARGET_PROPERTIES(quotient-bench PROPERTIES CXX_STANDARD 11 CXX_EXTENSIONS YES) TARGET_LINK_LIBRARIES(quotient-bench fxdiv benchmark) ADD_EXECUTABLE(round-down-bench bench/round-down.cc) SET_TARGET_PROPERTIES(round-down-bench PROPERTIES CXX_STANDARD 11 CXX_EXTENSIONS YES) TARGET_LINK_LIBRARIES(round-down-bench fxdiv benchmark) ENDIF()