aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 54b8676b62f8692c85f6d298439f53b71a7625aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
project(Fruit)
cmake_minimum_required(VERSION 2.8)

# CMake on OSX likes to see this set explicitly, otherwise it outputs a warning.
set(CMAKE_MACOSX_RPATH 1)

# Build shared libraries by default
option(BUILD_SHARED_LIBS "Build shared library" ON)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release")
endif()

if(NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang)$")
  message(WARNING "Compiler not officially supported: ${CMAKE_CXX_COMPILER_ID}")
  # Full list of possible values at https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html .
  # Major compilers not currently supported:
  # * "AppleClang": support WIP
  # * "MSVC": not supported ATM due to compiler bugs:
  #   - https://connect.microsoft.com/VisualStudio/feedback/details/2197110
  #   - https://connect.microsoft.com/VisualStudio/feedback/details/2197169
  # * "Intel": not supported ATM due to compiler bugs:
  #   - https://software.intel.com/en-us/forums/intel-c-compiler/topic/606048
  #   - https://software.intel.com/en-us/forums/intel-c-compiler/topic/606049
endif()

set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${CMAKE_CXX11_STANDARD_COMPILE_OPTION}")

if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|Intel|AppleClang)$")
  set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -W -Wall")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(MSVC)$")
  set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} /Wall /D_SCL_SECURE_NO_WARNINGS")
endif()

if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|Intel|AppleClang)$")
    set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -g -Werror -DFRUIT_EXTRA_DEBUG -D_GLIBCXX_DEBUG")
  elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(MSVC)$")
    set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} /DEBUG /WX /DFRUIT_EXTRA_DEBUG /D_ITERATOR_DEBUG_LEVEL=2")
  endif()
endif()

set(RUN_TESTS_UNDER_VALGRIND FALSE CACHE BOOL "Whether to run Fruit tests under valgrind")
set(INSTRUMENT_WITH_SANITIZERS FALSE CACHE BOOL "Whether to instrument code with code sanitizers")
if (${RUN_TESTS_UNDER_VALGRIND} AND ${INSTRUMENT_WITH_SANITIZERS})
  message(FATAL_ERROR "At most one of RUN_TESTS_UNDER_VALGRIND and INSTRUMENT_WITH_SANITIZERS can be used, but both were specified.")
endif()
if(${INSTRUMENT_WITH_SANITIZERS})
  if("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|Intel|AppleClang)$")
    set(FRUIT_ADDITIONAL_COMPILE_FLAGS "${FRUIT_ADDITIONAL_COMPILE_FLAGS} -fsanitize=undefined,address")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined,address")
  elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(MSVC)$")
    message(FATAL_ERROR "INSTRUMENT_WITH_SANITIZERS is not supported with MSVC")
  endif()
endif()

add_definitions(${FRUIT_ADDITIONAL_COMPILE_FLAGS})
set(FRUIT_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${FRUIT_ADDITIONAL_COMPILE_FLAGS}")

include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_BINARY_DIR}/include)

# Unsafe, only for debugging/benchmarking.
#add_definitions(-DFRUIT_NO_LOOP_CHECK)

# (debug-only) compile switch to get deep template instantiation stacktraces for errors (instead
# of the user-friendly default that hides Fruit internals).
#add_definitions(-DFRUIT_DEEP_TEMPLATE_INSTANTIATION_STACKTRACES_FOR_ERRORS)

if(${WIN32})
  set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for headers")
else()
  set(INSTALL_INCLUDE_DIR include/fruit CACHE PATH "Installation directory for headers")
  set(INSTALL_LIBRARY_DIR lib CACHE PATH "Installation directory for libraries")
endif()

set(FRUIT_VERSION "1.0.2")

enable_testing()
set(CTEST_TEST_TIMEOUT 20 CACHE STRING "Maximum test time, before CTest will kill the test." FORCE)

add_subdirectory(configuration)
add_subdirectory(src)

if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  # Do not exclude these from "make all" in debug mode, they must build.
  add_subdirectory(extras)
  add_subdirectory(examples)
  add_subdirectory(tests)
else()
  add_subdirectory(extras EXCLUDE_FROM_ALL)
  add_subdirectory(examples EXCLUDE_FROM_ALL)
  add_subdirectory(tests EXCLUDE_FROM_ALL)
endif()

add_subdirectory(doc EXCLUDE_FROM_ALL)

install(DIRECTORY include/fruit/
  DESTINATION "${INSTALL_INCLUDE_DIR}"
  FILES_MATCHING PATTERN "*.h")

set(CPACK_PACKAGE_NAME "Fruit")
set(CPACK_PACKAGE_VENDOR "Marco Poletti")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fruit - Dependency Injection Framework For C++")
string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\1" CPACK_PACKAGE_VERSION_MAJOR "${FRUIT_VERSION}")
string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\2" CPACK_PACKAGE_VERSION_MINOR "${FRUIT_VERSION}")
string(REGEX REPLACE "([^.]*)\\.([^.]*)\\.([^.]*)" "\\3" CPACK_PACKAGE_VERSION_PATCH "${FRUIT_VERSION}")
set(CPACK_PACKAGE_VERSION "${FRUIT_VERSION}")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Fruit")