xref: /aosp_15_r20/external/FXdiv/CMakeLists.txt (revision 46dbe23922d2f68acf6638846c68716fcec3e8fa)
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