blob: 20e5ba00922b8b3560cdc8688688cee95f0be0d3 [file] [log] [blame]
Marco Poletti66906ac2016-01-30 16:12:40 +00001project(Fruit)
Marco Poletticf798fa2014-06-21 15:05:15 +01002cmake_minimum_required(VERSION 2.8)
Marco Poletti50e5afc2017-03-12 16:27:47 +00003
4if (POLICY CMP0054)
5 cmake_policy(SET CMP0054 NEW)
6endif()
Marco Poletticf798fa2014-06-21 15:05:15 +01007
Marco Polettieb92f9a2015-12-01 19:23:08 +01008# CMake on OSX likes to see this set explicitly, otherwise it outputs a warning.
9set(CMAKE_MACOSX_RPATH 1)
10
poletti-marcoc7cfd022017-03-27 19:03:42 +010011if(NOT "${CMAKE_BUILD_TYPE}" MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)$")
12 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 .")
Marco Poletticf798fa2014-06-21 15:05:15 +010013endif()
14
Marco Polettidc9a1912017-03-19 15:26:04 +000015option(BUILD_SHARED_LIBS "Build shared library" ON)
Marco Poletti905dc092017-03-12 15:54:31 +000016
17# The Visual Studio CMake generators default to multiple configurations, but Fruit doesn't support multi-configuration build directories.
18set(CMAKE_CONFIGURATION_TYPES "${CMAKE_BUILD_TYPE}")
19
Marco Polettidcc51a52017-03-04 13:06:46 +000020if(NOT "${RUNTIME_OUTPUT_DIRECTORY}")
Marco Poletti905dc092017-03-12 15:54:31 +000021 set(RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
Marco Poletti7c742012017-03-04 12:40:27 +000022endif()
23
Marco Poletti050763e2017-06-11 18:38:16 +010024set(FRUIT_ADDITIONAL_CXX_FLAGS "" CACHE STRING "Additional CXX compiler flags." FORCE)
25
26set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_CXX_FLAGS}")
27
Marco Poletti905dc092017-03-12 15:54:31 +000028if(NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|AppleClang|MSVC)$")
Marco Poletti66906ac2016-01-30 16:12:40 +000029 message(WARNING "Compiler not officially supported: ${CMAKE_CXX_COMPILER_ID}")
30 # Full list of possible values at https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html .
31 # Major compilers not currently supported:
Marco Poletti66906ac2016-01-30 16:12:40 +000032 # * "Intel": not supported ATM due to compiler bugs:
33 # - https://software.intel.com/en-us/forums/intel-c-compiler/topic/606048
34 # - https://software.intel.com/en-us/forums/intel-c-compiler/topic/606049
35endif()
36
37if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|Intel|AppleClang)$")
Marco Polettic6b2e6e2017-03-18 18:04:47 +000038 set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -std=c++11 -W -Wall -Wno-unknown-warning-option -Wno-missing-braces")
Marco Poletti66906ac2016-01-30 16:12:40 +000039elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(MSVC)$")
Marco Poletti905dc092017-03-12 15:54:31 +000040 # TODO: we currently disable the warning C4709 because MSVC emits it even when there is no reason to. Re-enable it when possible.
Marco Poletti98a444c2017-05-20 15:52:17 +010041 # 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.
Marco Poletti35805fa2017-05-20 16:17:48 +010042 # TODO: the warning C4714 is disabled, MSVC emits it when it decides not to inline a __forceinline function/method.
Marco Poletti8fdeba72017-07-08 19:55:32 +010043 # The warning C4577 is disabled because we don't need a termination guarantee on exceptions for functions marked with
44 # 'noexcept'.
Marco Poletti3ef03012017-07-08 20:30:32 +010045 # The warning C4530 is disabled because it's triggered by MSVC's STL.
46 set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} /nologo /FS /W4 /wd4324 /wd4709 /wd4459 /wd4141 /wd4714 /wd4577 /wd4530 /D_SCL_SECURE_NO_WARNINGS")
Marco Poletti66906ac2016-01-30 16:12:40 +000047endif()
48
Marco Poletti07cdd352017-07-13 19:42:13 +010049option(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)
50if("${FRUIT_ENABLE_COVERAGE}")
51 # We also disable exceptions because otherwise GCC considers every function/method call that could throw as an
52 # additional branch.
53 set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -fprofile-arcs -ftest-coverage -fno-exceptions -fno-inline -O0")
54 set(FRUIT_ADDITIONAL_LINKER_FLAGS "${FRUIT_ADDITIONAL_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -fno-exceptions -fno-inline -O0")
55endif()
56
Marco Poletti56e84d42017-03-19 10:37:12 +000057set(FRUIT_USES_BOOST TRUE CACHE BOOL
58 "Whether to use Boost (specifically, boost::unordered_set and boost::unordered_map).
59 If this is false, Fruit will use std::unordered_set and std::unordered_map instead (however this causes injection to be a bit slower).")
60
Marco Poletti7d6f0512018-09-15 11:37:23 +010061set(FRUIT_IS_BEING_BUILT_BY_CONAN FALSE CACHE BOOL "This is set in Conan builds.")
62
63if("${WIN32}" AND "${FRUIT_USES_BOOST}" AND NOT "${FRUIT_IS_BEING_BUILT_BY_CONAN}")
Marco Poletti7c742012017-03-04 12:40:27 +000064 set(BOOST_DIR "" CACHE PATH "The directory where the boost library is installed, e.g. C:\\boost\\boost_1_62_0.")
65 if("${BOOST_DIR}" STREQUAL "")
Marco Poletti9fff4072018-09-01 09:27:00 +010066 message(FATAL_ERROR "Please re-run CMake, specifying the boost library path as BOOST_DIR, e.g. -DBOOST_DIR=C:\\boost\\boost_1_62_0, or specify -DFRUIT_USES_BOOST=False to not use boost.")
Marco Poletti7c742012017-03-04 12:40:27 +000067 endif()
68 include_directories("${BOOST_DIR}")
69endif()
70
Marco Poletti3bd47252015-12-07 18:57:33 +000071set(RUN_TESTS_UNDER_VALGRIND FALSE CACHE BOOL "Whether to run Fruit tests under valgrind")
Marco Polettidcc51a52017-03-04 13:06:46 +000072if ("${RUN_TESTS_UNDER_VALGRIND}")
Marco Poletti530c4c02016-10-15 11:00:55 +010073 set(RUN_TESTS_UNDER_VALGRIND_FLAG "1")
74endif()
Marco Poletti3bd47252015-12-07 18:57:33 +000075
Marco Poletti42c3b7c2016-05-22 09:32:36 +010076# Unsafe, only for debugging/benchmarking.
Marco Poletti066d6892018-08-27 10:46:27 +010077#set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -DFRUIT_NO_LOOP_CHECK=1")
Marco Poletti42c3b7c2016-05-22 09:32:36 +010078
Marco Poletti4132f222016-02-14 10:37:59 +000079add_definitions(${FRUIT_ADDITIONAL_COMPILE_FLAGS})
Marco Polettif129bd22016-02-14 13:47:39 +000080set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
Marco Poletti227bef12016-02-14 18:00:12 +000081set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
82set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
Marco Poletti905dc092017-03-12 15:54:31 +000083
84if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
85 set(FRUIT_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${FRUIT_ADDITIONAL_COMPILE_FLAGS}")
86else()
87 set(FRUIT_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} ${FRUIT_ADDITIONAL_COMPILE_FLAGS}")
88endif()
Marco Poletticf798fa2014-06-21 15:05:15 +010089
Mark Swaanenburgeb724f32016-10-30 19:41:52 +010090include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
Robert Jakobf5c96b32017-03-23 08:24:59 +010091include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
Marco Poletti06a1d1e2014-09-20 20:59:51 +010092
Marco Polettib9aca3f2015-05-31 10:06:45 +010093# (debug-only) compile switch to get deep template instantiation stacktraces for errors (instead
94# of the user-friendly default that hides Fruit internals).
Marco Poletti066d6892018-08-27 10:46:27 +010095#add_definitions(-DFRUIT_DEEP_TEMPLATE_INSTANTIATION_STACKTRACES_FOR_ERRORS=1)
Marco Polettib9aca3f2015-05-31 10:06:45 +010096
Marco Poletti7c742012017-03-04 12:40:27 +000097set(INSTALL_INCLUDE_DIR include/fruit CACHE PATH "Installation directory for headers")
98set(INSTALL_LIBRARY_DIR lib CACHE PATH "Installation directory for libraries")
Marco Polettie66e1e72014-06-21 18:07:22 +010099
Marco Polettiece0f722018-09-12 20:50:28 +0100100set(FRUIT_VERSION "3.4.0")
Marco Poletticc3a6232014-07-27 16:23:11 +0100101
Marco Polettif2895102016-01-30 13:38:37 +0000102add_subdirectory(configuration)
Marco Poletticf798fa2014-06-21 15:05:15 +0100103add_subdirectory(src)
Marco Poletti1fb101f2014-10-12 16:18:17 +0100104
Marco Polettidcc51a52017-03-04 13:06:46 +0000105if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
Marco Poletti1fb101f2014-10-12 16:18:17 +0100106 # Do not exclude these from "make all" in debug mode, they must build.
Marco Poletti1fb101f2014-10-12 16:18:17 +0100107 add_subdirectory(examples)
108 add_subdirectory(tests)
109else()
Marco Poletti1fb101f2014-10-12 16:18:17 +0100110 add_subdirectory(examples EXCLUDE_FROM_ALL)
Marco Poletti9c7dc582017-06-17 18:34:28 +0100111 add_subdirectory(tests)
Marco Poletti1fb101f2014-10-12 16:18:17 +0100112endif()
113
Marco Polettif0dc0ea2016-04-07 12:18:30 +0200114add_subdirectory(extras EXCLUDE_FROM_ALL)
Marco Poletticf798fa2014-06-21 15:05:15 +0100115
Marco Polettif86df382015-03-15 10:02:34 +0000116install(DIRECTORY include/fruit/
Marco Poletti66906ac2016-01-30 16:12:40 +0000117 DESTINATION "${INSTALL_INCLUDE_DIR}"
Marco Poletticf798fa2014-06-21 15:05:15 +0100118 FILES_MATCHING PATTERN "*.h")
Marco Poletti66906ac2016-01-30 16:12:40 +0000119
120set(CPACK_PACKAGE_NAME "Fruit")
121set(CPACK_PACKAGE_VENDOR "Marco Poletti")
122set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fruit - Dependency Injection Framework For C++")
123string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\1" CPACK_PACKAGE_VERSION_MAJOR "${FRUIT_VERSION}")
124string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\2" CPACK_PACKAGE_VERSION_MINOR "${FRUIT_VERSION}")
125string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\3" CPACK_PACKAGE_VERSION_PATCH "${FRUIT_VERSION}")
126set(CPACK_PACKAGE_VERSION "${FRUIT_VERSION}")
127set(CPACK_PACKAGE_INSTALL_DIRECTORY "Fruit")