1####################################################################################
2#                                                                                  #
3#  Copyright (c) 2014 - 2018 Axel Menzel <info@rttr.org>                           #
4#                                                                                  #
5#  This file is part of RTTR (Run Time Type Reflection)                            #
6#  License: MIT License                                                            #
7#                                                                                  #
8#  Permission is hereby granted, free of charge, to any person obtaining           #
9#  a copy of this software and associated documentation files (the "Software"),    #
10#  to deal in the Software without restriction, including without limitation       #
11#  the rights to use, copy, modify, merge, publish, distribute, sublicense,        #
12#  and/or sell copies of the Software, and to permit persons to whom the           #
13#  Software is furnished to do so, subject to the following conditions:            #
14#                                                                                  #
15#  The above copyright notice and this permission notice shall be included in      #
16#  all copies or substantial portions of the Software.                             #
17#                                                                                  #
18#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR      #
19#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,        #
20#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE     #
21#  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER          #
22#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,   #
23#  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE   #
24#  SOFTWARE.                                                                       #
25#                                                                                  #
26####################################################################################
27
28# setup version numbers
29set(RTTR_VERSION_MAJOR 0)
30set(RTTR_VERSION_MINOR 9)
31set(RTTR_VERSION_PATCH 7)
32set(RTTR_VERSION ${RTTR_VERSION_MAJOR}.${RTTR_VERSION_MINOR}.${RTTR_VERSION_PATCH})
33set(RTTR_VERSION_STR "${RTTR_VERSION_MAJOR}.${RTTR_VERSION_MINOR}.${RTTR_VERSION_PATCH}")
34math(EXPR RTTR_VERSION_CALC "${RTTR_VERSION_MAJOR}*1000 + ${RTTR_VERSION_MINOR}*100 + ${RTTR_VERSION_PATCH}")
35set(RTTR_PRODUCT_NAME "RTTR")
36message("Project version: ${RTTR_VERSION_STR}")
37
38# files
39set(README_FILE "${CMAKE_SOURCE_DIR}/README.md")
40set(LICENSE_FILE "${CMAKE_SOURCE_DIR}/LICENSE.txt")
41
42# dirs where the binaries should be placed, installed
43set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
44set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
45set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
46set(CMAKE_EXECUTABLE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
47
48# here we specify the installation directory
49if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
50  set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/install" CACHE PATH  "RTTR install prefix" FORCE)
51endif()
52
53# in order to group in visual studio the targets into solution filters
54set_property(GLOBAL PROPERTY USE_FOLDERS ON)
55
56#3rd part dependencies dirs
57set(RTTR_3RD_PARTY_DIR "${CMAKE_SOURCE_DIR}/3rd_party")
58
59getNameOfDir(CMAKE_LIBRARY_OUTPUT_DIRECTORY RTTR_TARGET_BIN_DIR)
60is_vs_based_build(VS_BUILD)
61
62# set all install directories for the targets
63if(UNIX)
64  include(GNUInstallDirs)
65  set(RTTR_RUNTIME_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}")
66  set(RTTR_LIBRARY_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}")
67  set(RTTR_ARCHIVE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}")
68  set(RTTR_FRAMEWORK_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}")
69
70  set(RTTR_INSTALL_FULL_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}")
71
72  set(RTTR_CMAKE_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/rttr/cmake")
73  set(RTTR_ADDITIONAL_FILES_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/rttr")
74
75elseif(WIN32)
76  set(RTTR_RUNTIME_INSTALL_DIR   "bin")
77  set(RTTR_LIBRARY_INSTALL_DIR   "bin")
78  set(RTTR_ARCHIVE_INSTALL_DIR   "lib")
79  set(RTTR_FRAMEWORK_INSTALL_DIR "bin")
80
81  set(RTTR_CMAKE_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/cmake")
82  set(RTTR_ADDITIONAL_FILES_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}")
83else()
84  message(FATAL_ERROR "Could not set install folders for this platform!")
85endif()
86
87# to avoid a setting a global debug flag automatically for all targets
88# we use an own variable
89set(RTTR_DEBUG_POSTFIX "_d")
90
91# set the rpath for executables
92set(CMAKE_SKIP_BUILD_RPATH OFF)            # use, i.e. don't skip the full RPATH for the build tree
93set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF)    # when building, don't use the install RPATH already (but later on when installing)
94set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF) # NO automatic rpath for INSTALL
95if(APPLE)
96  set(MACOSX_RPATH ON CACHE STRING "Set this to off if you dont want @rpath in install names") # uses a install name @rpath/... for libraries
97  set(RTTR_EXECUTABLE_INSTALL_RPATH "${RTTR_INSTALL_FULL_LIBDIR};@executable_path")
98  # the executable is relocatable, since the library builds with and install name "@rpath/librttr_core.0.9.6.dylib"
99  # the executable links
100elseif(UNIX)
101  set(RTTR_EXECUTABLE_INSTALL_RPATH "${RTTR_INSTALL_FULL_LIBDIR};$ORIGIN")
102elseif(WIN32)
103  # no such thing as rpath exists
104  set(RTTR_EXECUTABLE_INSTALL_RPATH ${RTTR_INSTALL_BINDIR}) # default, has no effect
105endif()
106
107# detect architecture
108if (CMAKE_SIZEOF_VOID_P EQUAL 8)
109    set(RTTR_NATIVE_ARCH 64)
110    message(STATUS "Architecture: x64")
111else()
112    set(RTTR_NATIVE_ARCH 32)
113    message(STATUS "Architecture: x86")
114endif()
115
116# use standard c++ insteaf of extented (-std=c++17 vs. std=gnu++17)
117set(CMAKE_CXX_EXTENSIONS OFF)
118
119enable_rtti(BUILD_WITH_RTTI)
120
121get_latest_supported_cxx(CXX_STANDARD)
122set(MAX_CXX_STANDARD ${CXX_STANDARD})
123
124message(STATUS "using C++: ${MAX_CXX_STANDARD}")
125
126# RelWithDepInfo should have the same option like the Release build
127# but of course with Debug informations
128if(MSVC)
129  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE}")
130  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zi /DEBUG")
131elseif(CMAKE_COMPILER_IS_GNUCXX )
132  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE}")
133  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g")
134elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
135  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE}")
136  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g")
137else()
138  message(WARNING "Please adjust CMAKE_CXX_FLAGS_RELWITHDEBINFO flags for this compiler!")
139endif()
140
141if(MSVC)
142    # we have to remove the default warning level,
143    # otherwise we get ugly compiler warnings, because of later replacing
144    # option /W3 with /W4 (which will be later added)
145    replace_compiler_option("/W3" " ")
146    if (BUILD_WITH_STATIC_RUNTIME_LIBS)
147        replace_compiler_option("/MD" " ")
148        replace_compiler_option("/MDd" " ")
149    endif()
150
151elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
152    if(MINGW)
153        set(GNU_STATIC_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
154    else()
155        set(GNU_STATIC_LINKER_FLAGS "-static-libgcc -static-libstdc++")
156    endif()
157elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
158    set(CLANG_STATIC_LINKER_FLAGS "-stdlib=libc++ -static-libstdc++")
159endif()
160
161include(CMakePackageConfigHelpers)
162write_basic_package_version_file(
163    "${CMAKE_CURRENT_BINARY_DIR}/CMake/rttr-config-version.cmake"
164    VERSION ${RTTR_VERSION_STR}
165    COMPATIBILITY AnyNewerVersion
166)
167
168if (BUILD_INSTALLER)
169    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/CMake/rttr-config-version.cmake"
170            DESTINATION ${RTTR_CMAKE_CONFIG_INSTALL_DIR}
171            COMPONENT Devel)
172
173    install(FILES "${LICENSE_FILE}" "${README_FILE}"
174            DESTINATION ${RTTR_ADDITIONAL_FILES_INSTALL_DIR})
175endif()
176