blob: 6f1523f38847aaac0df645a96d6b126107709cf6 [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 # * "MSVC": not supported ATM due to compiler bugs:
33 # - https://connect.microsoft.com/VisualStudio/feedback/details/2197110
34 # - https://connect.microsoft.com/VisualStudio/feedback/details/2197169
35 # * "Intel": not supported ATM due to compiler bugs:
36 # - https://software.intel.com/en-us/forums/intel-c-compiler/topic/606048
37 # - https://software.intel.com/en-us/forums/intel-c-compiler/topic/606049
38endif()
39
40if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|Intel|AppleClang)$")
Marco Polettic6b2e6e2017-03-18 18:04:47 +000041 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 +000042elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(MSVC)$")
Marco Poletti905dc092017-03-12 15:54:31 +000043 # 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 +010044 # 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 +010045 # TODO: the warning C4714 is disabled, MSVC emits it when it decides not to inline a __forceinline function/method.
46 set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} /nologo /FS /W4 /wd4324 /wd4709 /wd4459 /wd4141 /wd4714 /D_SCL_SECURE_NO_WARNINGS")
Marco Poletti66906ac2016-01-30 16:12:40 +000047endif()
48
Marco Poletti56e84d42017-03-19 10:37:12 +000049set(FRUIT_USES_BOOST TRUE CACHE BOOL
50 "Whether to use Boost (specifically, boost::unordered_set and boost::unordered_map).
51 If this is false, Fruit will use std::unordered_set and std::unordered_map instead (however this causes injection to be a bit slower).")
52
53if("${WIN32}" AND "${FRUIT_USES_BOOST}")
Marco Poletti7c742012017-03-04 12:40:27 +000054 set(BOOST_DIR "" CACHE PATH "The directory where the boost library is installed, e.g. C:\\boost\\boost_1_62_0.")
55 if("${BOOST_DIR}" STREQUAL "")
56 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.")
57 endif()
58 include_directories("${BOOST_DIR}")
59endif()
60
Marco Polettidcc51a52017-03-04 13:06:46 +000061if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
Marco Poletti66906ac2016-01-30 16:12:40 +000062 if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|Intel|AppleClang)$")
Marco Polettid873e2f2016-11-12 18:56:58 +000063 set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -g -Werror -DFRUIT_DEBUG -DFRUIT_EXTRA_DEBUG -D_GLIBCXX_DEBUG")
64 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND "${CMAKE_CXX_COMPILER_VERSION}" MATCHES "4.8.*")
65 # Don't set -pedantic with GCC 4.8, it's too restrictive (e.g. it doesn't allow casting a function pointer to void*).
66 else()
67 set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -pedantic")
68 endif()
Marco Poletti66906ac2016-01-30 16:12:40 +000069 elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(MSVC)$")
Marco Poletti31335f82016-05-22 18:36:23 +010070 set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} /DEBUG /WX /DFRUIT_DEBUG /DFRUIT_EXTRA_DEBUG /D_ITERATOR_DEBUG_LEVEL=2")
Marco Polettie769ce02015-12-07 17:02:00 +000071 endif()
Marco Poletti71c36de2014-11-01 10:51:07 +000072endif()
Marco Poletti3bd47252015-12-07 18:57:33 +000073
Marco Polettidcc51a52017-03-04 13:06:46 +000074if("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
Marco Polettid4eda1f2016-05-22 18:49:03 +010075 if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|Intel|AppleClang)$")
76 set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -O2 -DNDEBUG")
77 endif()
78endif()
79
Marco Poletti3bd47252015-12-07 18:57:33 +000080set(RUN_TESTS_UNDER_VALGRIND FALSE CACHE BOOL "Whether to run Fruit tests under valgrind")
Marco Polettidcc51a52017-03-04 13:06:46 +000081if ("${RUN_TESTS_UNDER_VALGRIND}")
Marco Poletti530c4c02016-10-15 11:00:55 +010082 set(RUN_TESTS_UNDER_VALGRIND_FLAG "1")
83endif()
Marco Poletti3bd47252015-12-07 18:57:33 +000084
Marco Poletti42c3b7c2016-05-22 09:32:36 +010085# Unsafe, only for debugging/benchmarking.
86#set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -DFRUIT_NO_LOOP_CHECK")
87
Marco Poletti4132f222016-02-14 10:37:59 +000088add_definitions(${FRUIT_ADDITIONAL_COMPILE_FLAGS})
Marco Polettif129bd22016-02-14 13:47:39 +000089set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
Marco Poletti227bef12016-02-14 18:00:12 +000090set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
91set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${FRUIT_ADDITIONAL_LINKER_FLAGS}")
Marco Poletti905dc092017-03-12 15:54:31 +000092
93if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
94 set(FRUIT_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${FRUIT_ADDITIONAL_COMPILE_FLAGS}")
95else()
96 set(FRUIT_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} ${FRUIT_ADDITIONAL_COMPILE_FLAGS}")
97endif()
Marco Poletticf798fa2014-06-21 15:05:15 +010098
Mark Swaanenburgeb724f32016-10-30 19:41:52 +010099include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
Robert Jakobf5c96b32017-03-23 08:24:59 +0100100include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
Marco Poletti06a1d1e2014-09-20 20:59:51 +0100101
Marco Polettib9aca3f2015-05-31 10:06:45 +0100102# (debug-only) compile switch to get deep template instantiation stacktraces for errors (instead
103# of the user-friendly default that hides Fruit internals).
104#add_definitions(-DFRUIT_DEEP_TEMPLATE_INSTANTIATION_STACKTRACES_FOR_ERRORS)
105
Marco Poletti7c742012017-03-04 12:40:27 +0000106set(INSTALL_INCLUDE_DIR include/fruit CACHE PATH "Installation directory for headers")
107set(INSTALL_LIBRARY_DIR lib CACHE PATH "Installation directory for libraries")
Marco Polettie66e1e72014-06-21 18:07:22 +0100108
Marco Poletti56251ba2016-05-25 19:53:04 +0100109set(FRUIT_VERSION "2.0.4")
Marco Poletticc3a6232014-07-27 16:23:11 +0100110
Marco Polettif2895102016-01-30 13:38:37 +0000111add_subdirectory(configuration)
Marco Poletticf798fa2014-06-21 15:05:15 +0100112add_subdirectory(src)
Marco Poletti1fb101f2014-10-12 16:18:17 +0100113
Marco Poletti905dc092017-03-12 15:54:31 +0000114option(BUILD_TESTS_IN_RELEASE_MODE "Build tests as part of the ALL target even in Release mode" OFF)
115
Marco Polettidcc51a52017-03-04 13:06:46 +0000116if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
Marco Poletti1fb101f2014-10-12 16:18:17 +0100117 # Do not exclude these from "make all" in debug mode, they must build.
Marco Poletti1fb101f2014-10-12 16:18:17 +0100118 add_subdirectory(examples)
119 add_subdirectory(tests)
120else()
Marco Poletti1fb101f2014-10-12 16:18:17 +0100121 add_subdirectory(examples EXCLUDE_FROM_ALL)
Marco Poletti905dc092017-03-12 15:54:31 +0000122 if ("${BUILD_TESTS_IN_RELEASE_MODE}")
123 add_subdirectory(tests)
124 else()
125 add_subdirectory(tests EXCLUDE_FROM_ALL)
126 endif()
Marco Poletti1fb101f2014-10-12 16:18:17 +0100127endif()
128
Marco Polettif0dc0ea2016-04-07 12:18:30 +0200129add_subdirectory(extras EXCLUDE_FROM_ALL)
Marco Poletticf798fa2014-06-21 15:05:15 +0100130
Marco Polettif86df382015-03-15 10:02:34 +0000131install(DIRECTORY include/fruit/
Marco Poletti66906ac2016-01-30 16:12:40 +0000132 DESTINATION "${INSTALL_INCLUDE_DIR}"
Marco Poletticf798fa2014-06-21 15:05:15 +0100133 FILES_MATCHING PATTERN "*.h")
Marco Poletti66906ac2016-01-30 16:12:40 +0000134
135set(CPACK_PACKAGE_NAME "Fruit")
136set(CPACK_PACKAGE_VENDOR "Marco Poletti")
137set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fruit - Dependency Injection Framework For C++")
138string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\1" CPACK_PACKAGE_VERSION_MAJOR "${FRUIT_VERSION}")
139string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\2" CPACK_PACKAGE_VERSION_MINOR "${FRUIT_VERSION}")
140string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\3" CPACK_PACKAGE_VERSION_PATCH "${FRUIT_VERSION}")
141set(CPACK_PACKAGE_VERSION "${FRUIT_VERSION}")
142set(CPACK_PACKAGE_INSTALL_DIRECTORY "Fruit")