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