xref: /aosp_15_r20/external/google-fruit/CMakeLists.txt (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
1*a65addddSAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.2)
2*a65addddSAndroid Build Coastguard Worker
3*a65addddSAndroid Build Coastguard Workerproject(Fruit VERSION 3.7.1 LANGUAGES CXX)
4*a65addddSAndroid Build Coastguard Worker
5*a65addddSAndroid Build Coastguard Workerset(FRUIT_IS_BEING_BUILT_BY_CONAN FALSE CACHE BOOL "This is set in Conan builds.")
6*a65addddSAndroid Build Coastguard Workerif("${FRUIT_IS_BEING_BUILT_BY_CONAN}")
7*a65addddSAndroid Build Coastguard Worker  include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
8*a65addddSAndroid Build Coastguard Worker  conan_basic_setup()
9*a65addddSAndroid Build Coastguard Workerendif()
10*a65addddSAndroid Build Coastguard Worker
11*a65addddSAndroid Build Coastguard Workerif (POLICY CMP0054)
12*a65addddSAndroid Build Coastguard Worker    cmake_policy(SET CMP0054 NEW)
13*a65addddSAndroid Build Coastguard Workerendif()
14*a65addddSAndroid Build Coastguard Worker
15*a65addddSAndroid Build Coastguard Workerif ("${CMAKE_CXX_STANDARD}" STREQUAL "")
16*a65addddSAndroid Build Coastguard Worker    set(CMAKE_CXX_STANDARD 11)
17*a65addddSAndroid Build Coastguard Workerendif()
18*a65addddSAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD_REQUIRED ON)
19*a65addddSAndroid Build Coastguard Worker
20*a65addddSAndroid Build Coastguard Worker# CMake on OSX likes to see this set explicitly, otherwise it outputs a warning.
21*a65addddSAndroid Build Coastguard Workerset(CMAKE_MACOSX_RPATH 1)
22*a65addddSAndroid Build Coastguard Worker
23*a65addddSAndroid Build Coastguard Workerif(NOT "${CMAKE_BUILD_TYPE}" MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)$")
24*a65addddSAndroid Build Coastguard Worker  message(FATAL_ERROR "Please re-run CMake, specifying -DCMAKE_BUILD_TYPE=Debug , -DCMAKE_BUILD_TYPE=Release , -DCMAKE_BUILD_TYPE=RelWithDebInfo or -DCMAKE_BUILD_TYPE=MinSizeRel .")
25*a65addddSAndroid Build Coastguard Workerendif()
26*a65addddSAndroid Build Coastguard Worker
27*a65addddSAndroid Build Coastguard Workerget_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
28*a65addddSAndroid Build Coastguard Workeroption(FRUIT_ALLOW_MULTI_CONFIG "Allow multi-configuration generator. If this option is OFF, enforces that a single configuration is used." OFF)
29*a65addddSAndroid Build Coastguard Workerif(FRUIT_ALLOW_MULTI_CONFIG)
30*a65addddSAndroid Build Coastguard Worker  if(isMultiConfig)
31*a65addddSAndroid Build Coastguard Worker    message(STATUS "${CMAKE_PROJECT_NAME} supports the CMake multi-configuration generator,"
32*a65addddSAndroid Build Coastguard Worker                   " but is optimized for the `CMAKE_BUILD_TYPE` specified in the CMake configuration step,"
33*a65addddSAndroid Build Coastguard Worker                   " and tests will only work in this configuration.")
34*a65addddSAndroid Build Coastguard Worker  endif()
35*a65addddSAndroid Build Coastguard Workerelse()
36*a65addddSAndroid Build Coastguard Worker  # For backward compatibility, only `CMAKE_BUILD_TYPE` configurations can be
37*a65addddSAndroid Build Coastguard Worker  # used with the multi-configuration generator. This makes it look like
38*a65addddSAndroid Build Coastguard Worker  # single-configuration generator.
39*a65addddSAndroid Build Coastguard Worker  set(CMAKE_CONFIGURATION_TYPES "${CMAKE_BUILD_TYPE}")
40*a65addddSAndroid Build Coastguard Workerendif()
41*a65addddSAndroid Build Coastguard Worker
42*a65addddSAndroid Build Coastguard Workeroption(BUILD_SHARED_LIBS "Build shared library" ON)
43*a65addddSAndroid Build Coastguard Worker
44*a65addddSAndroid Build Coastguard Workerset(FRUIT_ADDITIONAL_CXX_FLAGS "" CACHE STRING "Additional CXX compiler flags." FORCE)
45*a65addddSAndroid Build Coastguard Worker
46*a65addddSAndroid Build Coastguard Workerset(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_CXX_FLAGS}")
47*a65addddSAndroid Build Coastguard Worker
48*a65addddSAndroid Build Coastguard Workerif(NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|AppleClang|MSVC)$")
49*a65addddSAndroid Build Coastguard Worker  message(WARNING "Compiler not officially supported: ${CMAKE_CXX_COMPILER_ID}")
50*a65addddSAndroid Build Coastguard Worker  # Full list of possible values at https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html .
51*a65addddSAndroid Build Coastguard Worker  # Major compilers not currently supported:
52*a65addddSAndroid Build Coastguard Worker  # * "Intel": not supported ATM due to compiler bugs:
53*a65addddSAndroid Build Coastguard Worker  #   - https://software.intel.com/en-us/forums/intel-c-compiler/topic/606048
54*a65addddSAndroid Build Coastguard Worker  #   - https://software.intel.com/en-us/forums/intel-c-compiler/topic/606049
55*a65addddSAndroid Build Coastguard Workerendif()
56*a65addddSAndroid Build Coastguard Worker
57*a65addddSAndroid Build Coastguard Workeroption(FRUIT_ADD_WNO_UNKNOWN_WARNING_OPTION "Add -Wno-unknown-warning-option to the compiler options for GCC, Clang, ICC and AppleClang" ON)
58*a65addddSAndroid Build Coastguard Workerif (${FRUIT_ADD_WNO_UNKNOWN_WARNING_OPTION})
59*a65addddSAndroid Build Coastguard Worker  set(FRUIT_NO_UNKNOWN_WARNING_FLAGS -Wno-unknown-warning-option)
60*a65addddSAndroid Build Coastguard Workerendif()
61*a65addddSAndroid Build Coastguard Worker
62*a65addddSAndroid Build Coastguard Worker# Get C++ standard flags.
63*a65addddSAndroid Build Coastguard Workerset(FRUIT_CXX_STANDARD_FLAGS ${CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION})
64*a65addddSAndroid Build Coastguard Worker
65*a65addddSAndroid Build Coastguard Workerset(FRUIT_ADDITIONAL_COMPILE_FLAGS_GNU -W -Wall -Wno-missing-braces ${FRUIT_NO_UNKNOWN_WARNING_FLAGS})
66*a65addddSAndroid Build Coastguard Workerset(FRUIT_ADDITIONAL_COMPILE_FLAGS_Clang -W -Wall -Wno-missing-braces ${FRUIT_NO_UNKNOWN_WARNING_FLAGS})
67*a65addddSAndroid Build Coastguard Workerset(FRUIT_ADDITIONAL_COMPILE_FLAGS_Intel -W -Wall -Wno-missing-braces ${FRUIT_NO_UNKNOWN_WARNING_FLAGS})
68*a65addddSAndroid Build Coastguard Workerset(FRUIT_ADDITIONAL_COMPILE_FLAGS_AppleClang -W -Wall -Wno-missing-braces ${FRUIT_NO_UNKNOWN_WARNING_FLAGS})
69*a65addddSAndroid Build Coastguard Worker
70*a65addddSAndroid Build Coastguard Worker# TODO: we currently disable the warning C4709 because MSVC emits it even when there is no reason to. Re-enable it when possible.
71*a65addddSAndroid Build Coastguard Worker# TODO: the warning C4141 is disabled, because MSVC emits it ("'inline': used more than once") when a function/method is marked with both __forceinline and inline.
72*a65addddSAndroid Build Coastguard Worker# TODO: the warning C4714 is disabled, MSVC emits it when it decides not to inline a __forceinline function/method.
73*a65addddSAndroid Build Coastguard Worker# The warning C4577 is disabled because we don't need a termination guarantee on exceptions for functions marked with
74*a65addddSAndroid Build Coastguard Worker# 'noexcept'.
75*a65addddSAndroid Build Coastguard Worker# The warning C4530 is disabled because it's triggered by MSVC's STL.
76*a65addddSAndroid Build Coastguard Worker# The warning C5205 is disabled, MSVC emits it for abstract classes in example code with non-virtual destructors, but we never call delete on those (even though std::default_delete<Scaler> is instantiated for those types).
77*a65addddSAndroid Build Coastguard Workerset(FRUIT_ADDITIONAL_COMPILE_FLAGS_MSVC /nologo /FS /W4 /wd4324 /wd4709 /wd4459 /wd4141 /wd4714 /wd4577 /wd4530 /wd5205 /D_SCL_SECURE_NO_WARNINGS)
78*a65addddSAndroid Build Coastguard Worker
79*a65addddSAndroid Build Coastguard Workerlist(APPEND FRUIT_ADDITIONAL_COMPILE_FLAGS
80*a65addddSAndroid Build Coastguard Worker  $<$<CXX_COMPILER_ID:GNU>:${FRUIT_ADDITIONAL_COMPILE_FLAGS_GNU}>
81*a65addddSAndroid Build Coastguard Worker  $<$<CXX_COMPILER_ID:Clang>:${FRUIT_ADDITIONAL_COMPILE_FLAGS_Clang}>
82*a65addddSAndroid Build Coastguard Worker  $<$<CXX_COMPILER_ID:Intel>:${FRUIT_ADDITIONAL_COMPILE_FLAGS_Intel}>
83*a65addddSAndroid Build Coastguard Worker  $<$<CXX_COMPILER_ID:AppleClang>:${FRUIT_ADDITIONAL_COMPILE_FLAGS_AppleClang}>
84*a65addddSAndroid Build Coastguard Worker  $<$<CXX_COMPILER_ID:MSVC>:${FRUIT_ADDITIONAL_COMPILE_FLAGS_MSVC}>)
85*a65addddSAndroid Build Coastguard Worker
86*a65addddSAndroid Build Coastguard Workeroption(FRUIT_ENABLE_COVERAGE "Enable collection of test coverage. This is meant to be used by Fruit developers. It's only supported when using GCC on Linux." OFF)
87*a65addddSAndroid Build Coastguard Workerif("${FRUIT_ENABLE_COVERAGE}")
88*a65addddSAndroid Build Coastguard Worker  # We also disable exceptions because otherwise GCC considers every function/method call that could throw as an
89*a65addddSAndroid Build Coastguard Worker  # additional branch.
90*a65addddSAndroid Build Coastguard Worker  set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -fprofile-arcs -ftest-coverage -fno-exceptions -fno-inline -O0")
91*a65addddSAndroid Build Coastguard Worker  set(FRUIT_ADDITIONAL_LINKER_FLAGS "${FRUIT_ADDITIONAL_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -fno-exceptions -fno-inline -O0")
92*a65addddSAndroid Build Coastguard Workerendif()
93*a65addddSAndroid Build Coastguard Worker
94*a65addddSAndroid Build Coastguard Workerset(FRUIT_USES_BOOST TRUE CACHE BOOL
95*a65addddSAndroid Build Coastguard Worker        "Whether to use Boost (specifically, boost::unordered_set and boost::unordered_map).
96*a65addddSAndroid Build Coastguard Worker        If this is false, Fruit will use std::unordered_set and std::unordered_map instead (however this causes injection to be a bit slower).")
97*a65addddSAndroid Build Coastguard Worker
98*a65addddSAndroid Build Coastguard Workerif(${FRUIT_USES_BOOST})
99*a65addddSAndroid Build Coastguard Worker
100*a65addddSAndroid Build Coastguard Worker  if(DEFINED BOOST_DIR)
101*a65addddSAndroid Build Coastguard Worker    message(DEPRECATION "BOOST_DIR is deprecated. Use Boost_INCLUDE_DIR instead.")
102*a65addddSAndroid Build Coastguard Worker    set(Boost_INCLUDE_DIR "${BOOST_DIR}" CACHE PATH "")
103*a65addddSAndroid Build Coastguard Worker  endif()
104*a65addddSAndroid Build Coastguard Worker
105*a65addddSAndroid Build Coastguard Worker  find_package(Boost)
106*a65addddSAndroid Build Coastguard Worker  if(NOT Boost_FOUND)
107*a65addddSAndroid Build Coastguard Worker    message(FATAL_ERROR "Please re-run CMake, specifying the boost library path as Boost_INCLUDE_DIR, e.g. -DBoost_INCLUDE_DIR=C:\\boost\\boost_1_62_0, or specify -DFRUIT_USES_BOOST=False to not use boost.")
108*a65addddSAndroid Build Coastguard Worker  endif()
109*a65addddSAndroid Build Coastguard Workerendif()
110*a65addddSAndroid Build Coastguard Worker
111*a65addddSAndroid Build Coastguard Workerset(RUN_TESTS_UNDER_VALGRIND FALSE CACHE BOOL "Whether to run Fruit tests under valgrind")
112*a65addddSAndroid Build Coastguard Workerif ("${RUN_TESTS_UNDER_VALGRIND}")
113*a65addddSAndroid Build Coastguard Worker  set(RUN_TESTS_UNDER_VALGRIND_FLAG "1")
114*a65addddSAndroid Build Coastguard Workerendif()
115*a65addddSAndroid Build Coastguard Worker
116*a65addddSAndroid Build Coastguard Worker# Unsafe, only for debugging/benchmarking.
117*a65addddSAndroid Build Coastguard Worker#set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -DFRUIT_NO_LOOP_CHECK=1")
118*a65addddSAndroid Build Coastguard Worker
119*a65addddSAndroid Build Coastguard Workerset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
120*a65addddSAndroid Build Coastguard Workerset(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
121*a65addddSAndroid Build Coastguard Workerset(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
122*a65addddSAndroid Build Coastguard Worker
123*a65addddSAndroid Build Coastguard Workerset(FRUIT_CLANG_TIDY_CHECKS
124*a65addddSAndroid Build Coastguard Worker    bugprone*,-bugprone-reserved-identifier,-bugprone-exception-escape,clang-analyzer*,performance*,google*,-google-readability*,-google-runtime-references,clang-diagnostic-unused-command-line-argument,misc-macro-parentheses,-clang-diagnostic-dtor-name,-performance-avoid-endl,-performance-enum-size)
125*a65addddSAndroid Build Coastguard Worker
126*a65addddSAndroid Build Coastguard Workerset(FRUIT_ENABLE_CLANG_TIDY FALSE CACHE BOOL "Whether to run clang-tidy on the Fruit codebase during the build")
127*a65addddSAndroid Build Coastguard Workerif(${FRUIT_ENABLE_CLANG_TIDY})
128*a65addddSAndroid Build Coastguard Worker  set(CMAKE_CXX_CLANG_TIDY
129*a65addddSAndroid Build Coastguard Worker    clang-tidy;
130*a65addddSAndroid Build Coastguard Worker    -header-filter=fruit;
131*a65addddSAndroid Build Coastguard Worker    -checks=${FRUIT_CLANG_TIDY_CHECKS};
132*a65addddSAndroid Build Coastguard Worker    -warnings-as-errors=*;)
133*a65addddSAndroid Build Coastguard Workerendif()
134*a65addddSAndroid Build Coastguard Worker
135*a65addddSAndroid Build Coastguard Workerset(FRUIT_INCLUDE_DIRS
136*a65addddSAndroid Build Coastguard Worker  "${CMAKE_CURRENT_SOURCE_DIR}/include"
137*a65addddSAndroid Build Coastguard Worker  "${CMAKE_CURRENT_BINARY_DIR}/include")
138*a65addddSAndroid Build Coastguard Worker
139*a65addddSAndroid Build Coastguard Worker# (debug-only) compile switch to get deep template instantiation stacktraces for errors (instead
140*a65addddSAndroid Build Coastguard Worker# of the user-friendly default that hides Fruit internals).
141*a65addddSAndroid Build Coastguard Worker#add_definitions(-DFRUIT_DEEP_TEMPLATE_INSTANTIATION_STACKTRACES_FOR_ERRORS=1)
142*a65addddSAndroid Build Coastguard Worker
143*a65addddSAndroid Build Coastguard Workerinclude(GNUInstallDirs)
144*a65addddSAndroid Build Coastguard Worker
145*a65addddSAndroid Build Coastguard Workeradd_subdirectory(configuration)
146*a65addddSAndroid Build Coastguard Workeradd_subdirectory(src)
147*a65addddSAndroid Build Coastguard Worker
148*a65addddSAndroid Build Coastguard Workerif(NOT "${FRUIT_IS_BEING_BUILT_BY_CONAN}")
149*a65addddSAndroid Build Coastguard Worker  if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
150*a65addddSAndroid Build Coastguard Worker    # Do not exclude these from "make all" in debug mode, they must build.
151*a65addddSAndroid Build Coastguard Worker    add_subdirectory(examples)
152*a65addddSAndroid Build Coastguard Worker    add_subdirectory(tests)
153*a65addddSAndroid Build Coastguard Worker  else()
154*a65addddSAndroid Build Coastguard Worker    add_subdirectory(examples EXCLUDE_FROM_ALL)
155*a65addddSAndroid Build Coastguard Worker    add_subdirectory(tests)
156*a65addddSAndroid Build Coastguard Worker  endif()
157*a65addddSAndroid Build Coastguard Worker
158*a65addddSAndroid Build Coastguard Worker  add_subdirectory(extras EXCLUDE_FROM_ALL)
159*a65addddSAndroid Build Coastguard Workerendif()
160*a65addddSAndroid Build Coastguard Worker
161*a65addddSAndroid Build Coastguard Workerinstall(DIRECTORY include/fruit/
162*a65addddSAndroid Build Coastguard Worker  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fruit
163*a65addddSAndroid Build Coastguard Worker  FILES_MATCHING PATTERN "*.h")
164*a65addddSAndroid Build Coastguard Worker
165*a65addddSAndroid Build Coastguard Workerset(CPACK_PACKAGE_NAME "Fruit")
166*a65addddSAndroid Build Coastguard Workerset(CPACK_PACKAGE_VENDOR "Marco Poletti")
167*a65addddSAndroid Build Coastguard Workerset(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fruit - Dependency Injection Framework For C++")
168*a65addddSAndroid Build Coastguard Workerset(CPACK_PACKAGE_INSTALL_DIRECTORY "Fruit")
169