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