-
Notifications
You must be signed in to change notification settings - Fork 58
/
CMakeLists.txt
315 lines (259 loc) · 15 KB
/
CMakeLists.txt
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
# -------------------------------------------------------------------------
# Copyright (C) 2023 BMW AG
# -------------------------------------------------------------------------
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
# -------------------------------------------------------------------------
CMAKE_MINIMUM_REQUIRED(VERSION 3.13)
set(RAMSES_VERSION_MAJOR 28)
set(RAMSES_VERSION_MINOR 2)
set(RAMSES_VERSION_PATCH 0)
set(RAMSES_VERSION_POSTFIX "")
set(RAMSES_VERSION "${RAMSES_VERSION_MAJOR}.${RAMSES_VERSION_MINOR}.${RAMSES_VERSION_PATCH}${RAMSES_VERSION_POSTFIX}")
project(ramses-sdk
VERSION ${RAMSES_VERSION_MAJOR}.${RAMSES_VERSION_MINOR}.${RAMSES_VERSION_PATCH}
DESCRIPTION "RAMSES - Rendering Architecture for Multi-Screen EnvironmentS"
HOMEPAGE_URL "https://ramses3d.org/"
LANGUAGES C CXX
)
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
set(RAMSES_TOPLEVEL ON)
else()
set(RAMSES_TOPLEVEL OFF)
endif()
# build options
set(ramses-sdk_CPP_VERSION "17" CACHE STRING "Set used c++ version, must be 17 or 20")
option(ramses-sdk_WARNINGS_AS_ERRORS "If on, warnings are treated as errors during build." ON)
# TODO let all ramses components which are getting installed to respect this option
option(ramses-sdk_ENABLE_INSTALL "Enable/disable installation of Ramses" ON)
option(ramses-sdk_BUILD_WITH_LTO "Build all targets with link time optimization enabled (supported only on some platforms)." OFF)
# window type configuration. Several window types can be enabled in same build
option(ramses-sdk_ENABLE_DEFAULT_WINDOW_TYPE "Enable a default window type if none explicitly enabled" ON)
option(ramses-sdk_ENABLE_WINDOW_TYPE_WINDOWS "Enable building for Windows window" OFF)
option(ramses-sdk_ENABLE_WINDOW_TYPE_X11 "Enable building for X11 window" OFF)
option(ramses-sdk_ENABLE_WINDOW_TYPE_ANDROID "Enable building for Android window" OFF)
option(ramses-sdk_ENABLE_WINDOW_TYPE_IOS "Enable building for iOS window" OFF)
option(ramses-sdk_ENABLE_WINDOW_TYPE_WAYLAND_IVI "Enable building for Wayland ivi window" OFF)
option(ramses-sdk_ENABLE_WINDOW_TYPE_WAYLAND_WL_SHELL "Enable building for Wayland wl_shell window" OFF)
option(ramses-sdk_ENABLE_DEVICE_TYPE_VULKAN "Enable building for an EXPERIMENTAL vulkan device" OFF)
# shared lib options
option(ramses-sdk_BUILD_FULL_SHARED_LIB "Build full shared libraries (with renderer)." ON)
# optional components
option(ramses-sdk_TEXT_SUPPORT "Enable/disable the ramses text API." ON)
option(ramses-sdk_ENABLE_TCP_SUPPORT "Enable use of TCP communication." ON)
option(ramses-sdk_ENABLE_DLT "Enable DLT logging support." ON)
option(ramses-sdk_BUILD_EXAMPLES "Build examples." ${RAMSES_TOPLEVEL})
option(ramses-sdk_BUILD_DEMOS "Build demos." ${RAMSES_TOPLEVEL})
option(ramses-sdk_BUILD_TOOLS "Build tool binaries." ${RAMSES_TOPLEVEL})
option(ramses-sdk_BUILD_TESTS "Build ramses tests." ${RAMSES_TOPLEVEL})
option(ramses-sdk_FORCE_BUILD_DOCS "Build documentation, report error and abort if Doxygen and Dot are found on the system." OFF)
option(ramses-sdk_USE_LINUX_DEV_PTP "Enable support for synchronized PTP time on Linux." OFF)
option(ramses-sdk_ENABLE_COVERAGE "Build with code coverage enabled (gcc: gcov, clang: source based coverage)." OFF)
option(ramses-sdk_USE_CCACHE "Enable ccache when configured and available" OFF)
option(ramses-sdk_ENABLE_FLATBUFFERS_GENERATION "Enable generation of flatbuffers code" ${RAMSES_TOPLEVEL})
option(ramses-sdk_USE_IMAGEMAGICK "Enable tests depending on image magick compare" OFF)
# find options
option(ramses-sdk_ALLOW_PLATFORM_GLM "Enable to search for platform-provided OpenGL Math library (glm)." ON)
option(ramses-sdk_ALLOW_PLATFORM_LZ4 "Enable to search for platform-provided lz4" ON)
option(ramses-sdk_USE_PLATFORM_FREETYPE "Use platform-provided freetype and harfbuzz package instead of bundled package." OFF)
option(ramses-sdk_USE_PLATFORM_LUAJIT "Use platform-provided luajit instead of internal lua" OFF)
# other options
set(ramses-sdk_FOLDER_PREFIX "" CACHE STRING "Optional folder prefix for targets in visual studio.")
set(ramses-sdk_ENABLE_SANITIZER "" CACHE STRING "Enable build with a clang sanitizer.")
set_property(CACHE ramses-sdk_ENABLE_SANITIZER PROPERTY STRINGS "" "ubsan" "tsan" "asan" "asan+ubsan")
set(ramses-sdk_FOLDER_PREFIX "" CACHE STRING "Set a custom prefix for target folders in Visual Studio. If not set, will be set based on project's relative path.")
set(ramses-sdk_USE_LINKER_OVERWRITE "" CACHE STRING "Specify used linker (gcc/clang only).")
set(ramses-sdk_CPACK_GENERATOR "TGZ" CACHE STRING "CPack package type (default: TGZ).")
set(ramses-sdk_VERSION "${RAMSES_VERSION_MAJOR}.${RAMSES_VERSION_MINOR}.${RAMSES_VERSION_PATCH}" CACHE STRING "Ramses version" FORCE)
message(STATUS "RAMSES_VERSION=${RAMSES_VERSION}")
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
include(cmake/ramses/setCmakePolicies.cmake NO_POLICY_SCOPE) # we want to propagate policy settings out!
include(cmake/ramses/platformDetection.cmake)
include(cmake/ramses/platformConfig.cmake)
include(cmake/ramses/getGitInformation.cmake)
include(cmake/ramses/externaltools.cmake)
include(cmake/ramses/folderize.cmake)
include(cmake/ramses/testConfig.cmake)
include(cmake/ramses/buildConfig.cmake)
include(cmake/ramses/createTarget.cmake)
if(ramses-sdk_ENABLE_FLATBUFFERS_GENERATION)
include(cmake/ramses/flatbuffersGeneration.cmake)
endif()
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH}
${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules
)
# 32-bit builds are not supported
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
message(FATAL_ERROR "32-bit architectures not supported.")
endif()
if(CMAKE_BUILD_TYPE)
# Case-insensitive comparison required, build type is not case-sensitive
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER_CASE)
if(NOT("${CMAKE_BUILD_TYPE_LOWER_CASE}" STREQUAL "debug" OR "${CMAKE_BUILD_TYPE_LOWER_CASE}" STREQUAL "release" OR
"${CMAKE_BUILD_TYPE_LOWER_CASE}" STREQUAL "relwithdebinfo" OR "${CMAKE_BUILD_TYPE_LOWER_CASE}" STREQUAL "minsizerel"))
message(FATAL_ERROR "Build type set to unsupported type ${CMAKE_BUILD_TYPE}.")
endif()
endif()
message(STATUS "Ramses Build Config: SystemName ${CMAKE_SYSTEM_NAME}, SystemVersion ${CMAKE_SYSTEM_VERSION}, CompilerID ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, BuildType ${CMAKE_BUILD_TYPE}, TargetBitness ${TARGET_BITNESS} c++${ramses-sdk_CPP_VERSION}")
if((${CMAKE_SYSTEM_NAME} MATCHES "Darwin") OR (${CMAKE_SYSTEM_NAME} MATCHES "iOS") AND ramses-sdk_TEXT_SUPPORT)
message(WARNING "Text rendering is not supported on iOS and MacOS currently! Disabling it!")
set(ramses-sdk_TEXT_SUPPORT OFF CACHE STRING "Enable/disable the ramses text API." FORCE)
endif()
IF (NOT DEFINED ramses-sdk_ENABLE_HARFBUZZ_LEGACY_SHAPING)
IF ("${TARGET_OS}" STREQUAL "Integrity")
SET(ramses-sdk_ENABLE_HARFBUZZ_LEGACY_SHAPING ON CACHE BOOL "Enable old shaping behavior for text blocks with special characters, e.g. for compatibility reasons")
ENDIF()
ENDIF()
# check if valid configuration of window types in relation with shared libs
set(ANY_WINDOW_TYPE_ENABLED OFF)
if( ramses-sdk_ENABLE_WINDOW_TYPE_WINDOWS
OR ramses-sdk_ENABLE_WINDOW_TYPE_X11
OR ramses-sdk_ENABLE_WINDOW_TYPE_ANDROID
OR ramses-sdk_ENABLE_WINDOW_TYPE_IOS
OR ramses-sdk_ENABLE_WINDOW_TYPE_WAYLAND_IVI
OR ramses-sdk_ENABLE_WINDOW_TYPE_WAYLAND_WL_SHELL)
set(ANY_WINDOW_TYPE_ENABLED ON)
endif()
if(ANY_WINDOW_TYPE_ENABLED AND ramses-sdk_ENABLE_DEFAULT_WINDOW_TYPE)
message(WARNING "Default window type setting will be ignored since a window type is enabled explicitly.")
endif()
#if no window type explicitly enabled, check if default window type is (implicitly) enabled
if(NOT ANY_WINDOW_TYPE_ENABLED)
if(ramses-sdk_ENABLE_DEFAULT_WINDOW_TYPE)
macro(setDefaultWindowType cacheVariable windowTypeName)
message(STATUS "Setting ${windowTypeName} as default window type. Value set to ${cacheVariable} will be overridden")
# This overrides the cache variable with a non-cache cmake variable of the same name to avoid over writing value
# set by the user in gui or ccache if any
set(${cacheVariable} ON)
set(ANY_WINDOW_TYPE_ENABLED ON)
endmacro()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
setDefaultWindowType(ramses-sdk_ENABLE_WINDOW_TYPE_WINDOWS "Windows")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
setDefaultWindowType(ramses-sdk_ENABLE_WINDOW_TYPE_X11 "X11")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
setDefaultWindowType(ramses-sdk_ENABLE_WINDOW_TYPE_ANDROID "Android")
elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS")
setDefaultWindowType(ramses-sdk_ENABLE_WINDOW_TYPE_IOS "iOS")
else()
message(WARNING "No default window type is known for the build operating system '${CMAKE_SYSTEM_NAME}':\n"
"* Either disable default window type by setting ramses-sdk_ENABLE_DEFAULT_WINDOW_TYPE=OFF\n"
"* or enable a window type explicitly by setting any of the options ramses-sdk_ENABLE_WINDOW_TYPE_* to ON")
endif()
endif()
endif()
if(NOT ANY_WINDOW_TYPE_ENABLED AND ramses-sdk_BUILD_FULL_SHARED_LIB)
message(WARNING "Incorrect configuration. Trying to build full shared lib with renderer while no window type is enabled:\n"
"* If trying to build renderer enable at least one window type by setting any of the options ramses-sdk_ENABLE_WINDOW_TYPE_* to ON\n"
"* Otherwise disable building full shared lib (with renderer) by setting ramses-sdk_BUILD_FULL_SHARED_LIB=OFF\n"
"For current configuration ramses-sdk_BUILD_FULL_SHARED_LIB=ON will be ignored!")
# Override cmake option (with normal/non-cached cmake variable)
set(ramses-sdk_BUILD_FULL_SHARED_LIB OFF)
endif()
# TODO this should not be here
add_definitions(-DRAMSES_LINK_STATIC)
if (NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
message(STATUS "Redirect ramses library output to ${CMAKE_CURRENT_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
endif()
if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
message(STATUS "Redirect ramses runtime output to ${CMAKE_CURRENT_BINARY_DIR}/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
endif()
set(CMAKE_DEBUG_POSTFIX "") # no debug suffix in this project
include(cmake/ramses/platformTargets.cmake)
include(cmake/ramses/makeTestFromTarget.cmake)
include(cmake/ramses/resourceCopy.cmake)
if(ramses-sdk_ENABLE_FLATBUFFERS_GENERATION)
if(${CMAKE_SYSTEM_NAME} MATCHES "Android")
message(FATAL_ERROR "The Android build systems don't allow modifying the source tree. Please set ramses-sdk_ENABLE_FLATBUFFERS_GENERATION to OFF.")
endif()
endif()
set(RAMSES_INSTALL_HEADERS_PATH include)
set(RAMSES_INSTALL_RUNTIME_PATH bin)
set(RAMSES_INSTALL_LIBRARY_PATH lib)
set(RAMSES_INSTALL_ARCHIVE_PATH lib)
set(RAMSES_INSTALL_RESOURCES_PATH "bin/res")
if (ramses-sdk_ALLOW_PLATFORM_GLM)
find_package(glm QUIET)
if (glm_FOUND AND NOT TARGET glm::glm)
# older versions of glm may not export the "glm::glm" target, but "glm"
add_library(glm::glm ALIAS glm)
endif()
endif()
if (ramses-sdk_USE_PLATFORM_LUAJIT)
if (TARGET lua::lua)
message(WARNING "ramses-sdk_USE_PLATFORM_LUAJIT is ON, but `lua::lua` target is already defined. Existing `lua::lua` target will be used.")
endif()
find_package(LuaJIT REQUIRED)
endif()
createBuildConfig()
add_subdirectory(external)
add_subdirectory(include)
add_subdirectory(src)
if(ramses-sdk_BUILD_TOOLS)
add_subdirectory(tools)
endif()
if(ramses-sdk_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
if(ramses-sdk_BUILD_FULL_SHARED_LIB)
if(ramses-sdk_BUILD_DEMOS)
add_subdirectory(demo)
endif()
endif()
if(ramses-sdk_BUILD_TESTS)
add_subdirectory(tests)
endif()
include(cmake/ramses/createPackage.cmake)
include(cmake/ramses/addCheckerTargets.cmake)
if(RAMSES_TOPLEVEL OR ramses-sdk_FORCE_BUILD_DOCS)
add_subdirectory(doc)
endif()
if(ramses-sdk_ENABLE_INSTALL)
install(FILES README.md CHANGELOG.md LICENSE.txt CONTRIBUTING.rst
DESTINATION share/doc/ramses-sdk-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}
COMPONENT ramses-sdk-${PROJECT_VERSION}
)
include(CMakePackageConfigHelpers)
list(APPEND configmodules ramses-shared-lib-headless)
if (ramses-sdk_BUILD_FULL_SHARED_LIB)
list(APPEND configmodules ramses-shared-lib)
endif()
foreach(configmodule ${configmodules})
# install paths for find/config script must differ on windows and linux because of different search
# rules used by find_package. See https://cmake.org/cmake/help/git-master/command/find_package.html
# for details
set(configmodule-VERSION_DIR "${configmodule}-${RAMSES_VERSION_MAJOR}.${RAMSES_VERSION_MINOR}")
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
set(ramses-sdk_FIND_SCRIPT_INSTALL_DIR "lib/${configmodule-VERSION_DIR}/cmake")
else()
set(ramses-sdk_FIND_SCRIPT_INSTALL_DIR "lib/cmake/${configmodule-VERSION_DIR}")
endif()
# generate CMake config file (use ${configmodule}Template.cmake.in as base)
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/${configmodule}Template.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${configmodule}Config.cmake"
INSTALL_DESTINATION "${ramses-sdk_FIND_SCRIPT_INSTALL_DIR}"
PATH_VARS RAMSES_INSTALL_HEADERS_PATH RAMSES_INSTALL_LIBRARY_PATH RAMSES_INSTALL_RUNTIME_PATH
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/${configmodule}Config.cmake
DESTINATION ${ramses-sdk_FIND_SCRIPT_INSTALL_DIR}
)
message(STATUS "G ${configmodule}Config.cmake")
# generate CMake version file
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/${configmodule}ConfigVersion.cmake"
VERSION ${RAMSES_VERSION}
COMPATIBILITY SameMajorVersion)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/${configmodule}ConfigVersion.cmake
DESTINATION ${ramses-sdk_FIND_SCRIPT_INSTALL_DIR}
)
message(STATUS "G ${configmodule}ConfigVersion.cmake")
endforeach()
endif()