Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/CMakeLists.txt
193677 views
1
# find python by path
2
set(Python_FIND_REGISTRY LAST)
3
# Options
4
option(CHECK_OPTIONAL_LIBS "Try to download / enable all optional libraries (use only EPL clean libraries, if set to false)" ON)
5
option(MULTITHREADED_BUILD "Use all available cores for building (applies to Visual Studio only)")
6
option(ISOLATED_BUILD "Do not pollute the source directory on building")
7
option(INSTALL_DLL_RUNTIMES "Copy debug and release runtimes for MSVC" ON)
8
option(PROFILING "Enable output of profiling data (applies to gcc/clang builds only)")
9
option(PPROF "Link the pprof profiler library (applies to gcc/clang builds only)")
10
option(COVERAGE "Enable output of coverage data (applies to gcc/clang builds only)")
11
option(SUMO_UTILS "Enable generation of a shared library for the utility functions for option handling, XML parsing etc.")
12
option(FMI "Enable generation of an FMI library for SUMO" ON)
13
option(NETEDIT "Enable build of netedit" ON)
14
option(ENABLE_PYTHON_BINDINGS "Build Python Bindings" ON)
15
option(ENABLE_JAVA_BINDINGS "Build Java Bindings" ON)
16
option(ENABLE_CS_BINDINGS "Build C# Bindings" ON)
17
option(CCACHE_SUPPORT "Enable ccache support if installed" ON)
18
option(TCMALLOC "Use tcmalloc if installed" ON)
19
option(PARQUET "Compile with Parquet support" ON)
20
option(VERBOSE_SUB "Let sub-commands be more verbose")
21
set(BINARY_SUFFIX "" CACHE STRING "Append the suffix to every generated binary")
22
set(COMPILE_DEFINITIONS "" CACHE STRING "Macros or defines to add when compiling")
23
set(JUPEDSIM_CUSTOMDIR "" CACHE PATH "Custom install location of jupedsim")
24
set(PROJECT_NAME "SUMO" CACHE STRING "Project/Solution name")
25
26
# Set a default build type if none was specified
27
# you may use -DCMAKE_BUILD_TYPE:STRING=Debug from the command line
28
set(default_build_type "Release")
29
30
set(CMAKE_ORIGINAL_BUILD_TYPE "${CMAKE_BUILD_TYPE}")
31
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
32
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
33
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
34
STRING "Choose the type of build." FORCE)
35
# Set the possible values of build type for cmake-gui
36
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo")
37
endif ()
38
39
# the part after ... sets all cmake policies to "new" which have been introduced up to that cmake version
40
cmake_minimum_required(VERSION 3.5...3.21 FATAL_ERROR)
41
project("${PROJECT_NAME}" CXX C)
42
set(PACKAGE_VERSION "git")
43
44
# Check if libraries have to be found, depending on SUMO_LIBRARIES
45
set(SUMO_LIBRARIES "$ENV{SUMO_LIBRARIES}" CACHE PATH "Location of SUMOLibraries dependencies")
46
47
# some user place SUMOLibraries in the same SUMO folder
48
if (NOT SUMO_LIBRARIES AND EXISTS "${CMAKE_SOURCE_DIR}/../SUMOLibraries")
49
set(SUMO_LIBRARIES "${CMAKE_SOURCE_DIR}/../SUMOLibraries")
50
endif ()
51
52
if (CCACHE_SUPPORT)
53
if (MSVC)
54
file(GLOB SCCACHE_ROOT "${SUMO_LIBRARIES}/sccache-*")
55
find_program(SCCACHE_PROGRAM sccache ${SCCACHE_ROOT})
56
if (SCCACHE_PROGRAM)
57
message(STATUS "Found sccache: ${SCCACHE_PROGRAM}")
58
set(CMAKE_C_COMPILER_LAUNCHER "${SCCACHE_PROGRAM}")
59
set(CMAKE_CXX_COMPILER_LAUNCHER "${SCCACHE_PROGRAM}")
60
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
61
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
62
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
63
elseif (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
64
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
65
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
66
endif()
67
endif()
68
else()
69
find_program(CCACHE_PROGRAM ccache)
70
if (CCACHE_PROGRAM)
71
message(STATUS "Found ccache: ${CCACHE_PROGRAM}")
72
set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
73
set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
74
endif()
75
endif()
76
endif()
77
78
set(CMAKE_COLOR_MAKEFILE ON)
79
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/build_config/cmake_modules/")
80
81
set(ENABLED_FEATURES "${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} ${CMAKE_BUILD_TYPE}")
82
83
if (COMPILE_DEFINITIONS)
84
add_compile_definitions(${COMPILE_DEFINITIONS})
85
endif ()
86
87
# declare flags for compilers
88
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
89
set (GNU_COMPILER True)
90
endif ()
91
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
92
set (CLANG_COMPILER True)
93
endif ()
94
95
# C++17 is needed by std::filesystem and parquet.
96
# C++14 is needed by Google Test >= 1.13, for all the other parts C++11 should be enough.
97
# This will silently fall back to C++14 or even C++11, whatever is supported by the compiler.
98
if (${CMAKE_VERSION} VERSION_LESS 3.8.0)
99
set(CMAKE_CXX_STANDARD 14)
100
else()
101
set(CMAKE_CXX_STANDARD 17)
102
endif()
103
if (NOT "cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
104
message(WARNING "Your compiler does not support C++17. Please consider upgrading your compiler toolchain.")
105
endif()
106
107
# compiler specific flags
108
if (GNU_COMPILER OR CLANG_COMPILER)
109
# set flags for clang in windows
110
if (CLANG_COMPILER AND WIN32)
111
# flags for clang in windows
112
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unsafe-buffer-usage")
113
# disable warnings
114
add_compile_options("/clang:-Wno-unsafe-buffer-usage")
115
add_compile_options("/clang:-Wno-reserved-identifier")
116
add_compile_options("/clang:-Wno-c++98-compat")
117
# disable debug build (due a problem with Runtime Libraries)
118
set(CMAKE_CONFIGURATION_TYPES "Release")
119
set(CMAKE_BUILD_TYPE "Release")
120
else ()
121
# flags for clang and gcc in linux
122
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -Wall -pedantic -Wextra")
123
endif ()
124
if (GNU_COMPILER)
125
# see https://stackoverflow.com/questions/23499909/adjust-variable-tracking-assignment-length
126
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --param=max-vartrack-size=5000000")
127
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.9 AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
128
# see the last bulletpoint about ABI at https://gcc.gnu.org/gcc-10/changes.html#cxx
129
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
130
endif()
131
endif ()
132
if (PROFILING)
133
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
134
set(ENABLED_FEATURES "${ENABLED_FEATURES} Profiling")
135
set(BINARY_SUFFIX "${BINARY_SUFFIX}P")
136
endif ()
137
if (COVERAGE)
138
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage -O0")
139
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
140
set(ENABLED_FEATURES "${ENABLED_FEATURES} Coverage")
141
endif ()
142
elseif (MSVC)
143
# enabling /WX is not possible due to warnings in external headers
144
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
145
# this is a workaround to disable lots of warnings for replacing /W3 with /W4 in VS 2019
146
# there is a policy for that starting with CMake 3.15
147
if (MSVC_VERSION GREATER 1900)
148
string(REPLACE "/W3" "/Wall" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
149
else ()
150
string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
151
endif ()
152
else ()
153
# /Wall brings MSVC 2013 to complete halt
154
if (MSVC_VERSION GREATER 1900)
155
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Wall")
156
else ()
157
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4")
158
endif ()
159
endif ()
160
if (MULTITHREADED_BUILD)
161
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
162
endif ()
163
# SWIG generates large obj files
164
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
165
# backward compatible mutex API, see https://github.com/actions/runner-images/issues/10004
166
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR")
167
# exporting symbols for shared libraries needs to enabled explicitly
168
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
169
# add option for enabling console in release mode
170
option(CONSOLE_RELEASE "Enable console in SUMO-GUI and NETEDIT in release (use only for debug purposes)" false)
171
endif ()
172
173
# special debug flags
174
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")
175
if (CLANG_COMPILER)
176
if (WIN32)
177
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined,integer -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/build_config/clang_sanitize_blacklist.txt")
178
add_compile_definitions(_ITERATOR_DEBUG_LEVEL=0)
179
else ()
180
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined,address,integer -fno-omit-frame-pointer -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/build_config/clang_sanitize_blacklist.txt")
181
endif ()
182
endif ()
183
184
# we need to build position independent code when generating a shared library
185
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
186
if (SUMO_UTILS)
187
set(ENABLED_FEATURES "${ENABLED_FEATURES} SumoUtilsLibrary")
188
endif ()
189
if (FMI)
190
set(ENABLED_FEATURES "${ENABLED_FEATURES} FMI")
191
endif ()
192
193
if (NOT ISOLATED_BUILD)
194
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
195
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
196
# force Visual Studio to leave out the Release / Debug dirs
197
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/bin)
198
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin)
199
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/bin)
200
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin)
201
endif()
202
203
# Debug messages
204
message(STATUS "CMAKE_BINARY_DIR: " ${CMAKE_BINARY_DIR})
205
message(STATUS "CMAKE_SOURCE_DIR: " ${CMAKE_SOURCE_DIR})
206
message(STATUS "")
207
message(STATUS "Platform: ")
208
message(STATUS " Host: " ${CMAKE_HOST_SYSTEM} " " ${CMAKE_HOST_SYSTEM_PROCESSOR})
209
message(STATUS " Target: " ${CMAKE_SYSTEM} " " ${CMAKE_SYSTEM_PROCESSOR})
210
message(STATUS " CMake: " ${CMAKE_VERSION})
211
message(STATUS " CMake generator: " ${CMAKE_GENERATOR})
212
message(STATUS " CMake build tool: " ${CMAKE_BUILD_TOOL})
213
message(STATUS " Compiler: " ${CMAKE_CXX_COMPILER_ID} " " ${CMAKE_CXX_COMPILER_VERSION})
214
if (CMAKE_GENERATOR MATCHES Xcode)
215
message(STATUS " Xcode: " ${XCODE_VERSION})
216
endif ()
217
message(STATUS "")
218
219
if (${CMAKE_VERSION} VERSION_LESS 3.12.0)
220
find_package(PythonInterp REQUIRED)
221
# define variable for compatibility
222
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "Python executable")
223
message(WARNING "Found Python in legacy mode, consider upgrading CMake to at least 3.18: " ${Python_EXECUTABLE})
224
else()
225
# we search for Interpreter _and_ Development to make sure the versions match
226
find_package(Python REQUIRED COMPONENTS Interpreter OPTIONAL_COMPONENTS Development.Module)
227
endif()
228
if (${CMAKE_VERSION} VERSION_LESS 3.18.0 AND (ENABLE_PYTHON_BINDINGS OR ENABLE_JAVA_BINDINGS OR ENABLE_CS_BINDINGS))
229
message(WARNING "Language bindings require at least CMake 3.18.")
230
set(ENABLE_PYTHON_BINDINGS OFF)
231
set(ENABLE_JAVA_BINDINGS OFF)
232
set(ENABLE_CS_BINDINGS OFF)
233
endif()
234
if (MSVC AND ENABLE_PYTHON_BINDINGS)
235
# recheck that the platform of the generator and python matches
236
execute_process(COMMAND ${Python_EXECUTABLE} -c "import sys; print(sys.maxsize > 2**32)"
237
OUTPUT_VARIABLE _is_python64 OUTPUT_STRIP_TRAILING_WHITESPACE)
238
if (${_is_python64} STREQUAL "False" OR NOT ${CMAKE_MODULE_LINKER_FLAGS} STREQUAL "/machine:x64")
239
message(WARNING "Python language bindings are only supported for 64 bit.")
240
set(ENABLE_PYTHON_BINDINGS OFF)
241
endif()
242
if (NOT PYTHON_DEBUG_LIBRARY AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
243
message(WARNING "Did not find Python debug library. Please reinstall your Python and enable the Python debug libraries in the installer.")
244
set(ENABLE_PYTHON_BINDINGS OFF)
245
endif()
246
endif()
247
248
# hatchling is required for doing a build without access to pypi.org (offline on open build service, launchpad etc.)
249
execute_process(COMMAND ${Python_EXECUTABLE} -c "import build, hatchling, pip; build.__version__"
250
RESULT_VARIABLE PYTHON_BUILD_MISSING ERROR_QUIET)
251
if (PYTHON_BUILD_MISSING)
252
message(STATUS "Python build, hatchling or pip are missing (sumo packages will not be installable via cmake).")
253
endif()
254
255
# exclusive from Apple
256
if (APPLE)
257
# we know that openGL is deprecated for newer MacOS
258
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGL_SILENCE_DEPRECATION")
259
260
# Xcode 15 on macOS sonoma complains about duplicate libraries for the linker, so we disable the warning for xcode >= 15
261
if (CLANG_COMPILER)
262
string(REGEX MATCH "^[0-9]+" ClangMajorVersion "${CMAKE_CXX_COMPILER_VERSION}")
263
if (ClangMajorVersion GREATER_EQUAL 15)
264
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-no_warn_duplicate_libraries")
265
endif()
266
endif()
267
268
# Recommendation, also add a "brew --prefix" custom command to detect a homebrew build environment
269
execute_process(COMMAND brew --prefix RESULT_VARIABLE DETECT_BREW OUTPUT_VARIABLE BREW_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
270
if (${DETECT_BREW} EQUAL 0)
271
link_directories(${BREW_PREFIX}/lib)
272
include_directories(${BREW_PREFIX}/include)
273
message(STATUS "Brew detected: ${BREW_PREFIX}")
274
endif ()
275
276
# Detect if the "port" command is valid on this system; if so, return full path
277
execute_process(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
278
if (${DETECT_MACPORTS} EQUAL 0)
279
# MACPORTS_PREFIX contains now something like "/opt/local/bin/port", so we get the parent directory
280
get_filename_component(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)
281
# "/opt/local" is where MacPorts lives, add `/lib` suffix and link
282
# http://stackoverflow.com/questions/1487752/how-do-i-instruct-cmake-to-look-for-libraries-installed-by-macports
283
link_directories(/opt/X11/lib ${MACPORTS_PREFIX}/../lib)
284
include_directories(SYSTEM /opt/X11/include ${MACPORTS_PREFIX}/../include)
285
message(STATUS "Macports detected: ${MACPORTS_PREFIX}")
286
endif ()
287
endif (APPLE)
288
289
# Specifically define variable WIN32 for compilations under windows (due an error in Shawn)
290
if (GNU_COMPILER AND WIN32)
291
option(USE_MINGW_64BITS "Use 64 bits libraries for the compilation with MinGW" true)
292
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32 -D_WIN32_WINNT=0x0501")
293
set(MINGW32 1)
294
endif ()
295
296
if (NOT JUPEDSIM_CUSTOMDIR)
297
# check if set JuPedSim directory from SUMOLibraries
298
if (SUMO_LIBRARIES AND WIN32)
299
file(GLOB JUPEDSIM_CUSTOMDIR_SUMOLIBRARIES "${SUMO_LIBRARIES}/JuPedSim-*")
300
set(JUPEDSIM_CUSTOMDIR "${JUPEDSIM_CUSTOMDIR_SUMOLIBRARIES}")
301
else ()
302
if (EXISTS "${CMAKE_SOURCE_DIR}/../jupedsim-install")
303
set(JUPEDSIM_CUSTOMDIR "${CMAKE_SOURCE_DIR}/../jupedsim-install")
304
endif ()
305
endif ()
306
if (JUPEDSIM_CUSTOMDIR)
307
message(STATUS "Using JuPedSim from ${JUPEDSIM_CUSTOMDIR}")
308
endif ()
309
endif ()
310
311
# check if SUMOLibraries was found (Only in Windows)
312
if (SUMO_LIBRARIES AND WIN32)
313
# Special option for MinGW32
314
message(STATUS "Using 64 bit libraries from SUMO_LIBRARIES placed in " ${SUMO_LIBRARIES})
315
file(GLOB XERCES_PATH "${SUMO_LIBRARIES}/xerces-c-3.?.?")
316
file(GLOB ZLIB_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/zlib-?.?.*")
317
file(GLOB PROJ_PATH "${SUMO_LIBRARIES}/proj-?.?.?")
318
file(GLOB FOX_PATH "${SUMO_LIBRARIES}/fox-?.?.??")
319
file(GLOB FREETYPE_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/freetype-2.??.?")
320
file(GLOB EIGEN3_PATH "${SUMO_LIBRARIES}/eigen-3.?.?")
321
file(GLOB GETTEXT_PATH "${SUMO_LIBRARIES}/gettext-?.??")
322
file(GLOB ARROW_PATH "${SUMO_LIBRARIES}/apache-arrow-??.?.?")
323
file(GLOB LZ4_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/lz4-?.??.?") # needed for Arrow
324
file(GLOB ZSTD_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/zstd-?.?.?") # needed for Arrow
325
file(GLOB BZIP2_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/bzip2-?.?.?") # needed for Arrow
326
file(GLOB THRIFT_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/thrift-?.??.?") # needed for Arrow
327
328
# set all paths in prefix
329
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${EIGEN3_PATH};${XERCES_PATH};${ZLIB_PATH};${PROJ_PATH};${FOX_PATH};${FREETYPE_PATH};${GETTEXT_PATH};${GETTEXT_PATH}/tools/gettext;${ARROW_PATH};${LZ4_PATH};${ZSTD_PATH};${BZIP2_PATH};${THRIFT_PATH}")
330
# save in variable SUMO_LIBRARIES_DLL all paths to dll files
331
file(GLOB SUMO_LIBRARIES_DLL "${XERCES_PATH}/bin/*.dll"
332
"${PROJ_PATH}/bin/*.dll"
333
"${FOX_PATH}/bin/*.dll"
334
"${ZLIB_PATH}/bin/*.dll"
335
"${FREETYPE_PATH}/bin/*.dll"
336
"${GETTEXT_PATH}/bin/*.dll"
337
"${GDAL_PATH}/bin/*.dll"
338
"${ARROW_PATH}/bin/*.dll"
339
"${SUMO_LIBRARIES}/libspatialite-*/bin/*.dll"
340
"${SUMO_LIBRARIES}/geos-*/bin/*.dll"
341
"${SUMO_LIBRARIES}/3rdPartyLibs/bzip2-*/bin/*.dll"
342
"${SUMO_LIBRARIES}/3rdPartyLibs/curl-*/bin/*.dll"
343
"${SUMO_LIBRARIES}/3rdPartyLibs/libpng-*/bin/*.dll"
344
"${SUMO_LIBRARIES}/3rdPartyLibs/libssh2-*/bin/*.dll"
345
"${SUMO_LIBRARIES}/3rdPartyLibs/openssl-*/*.dll"
346
"${SUMO_LIBRARIES}/3rdPartyLibs/sqlite-*/*.dll"
347
"${SUMO_LIBRARIES}/3rdPartyLibs/tiff-*/bin/*.dll"
348
"${SUMO_LIBRARIES}/3rdPartyLibs/libxml2-*/bin/*.dll"
349
"${SUMO_LIBRARIES}/3rdPartyLibs/libiconv-*/bin/*.dll"
350
"${SUMO_LIBRARIES}/3rdPartyLibs/openssl-*/bin/*.dll"
351
"${SUMO_LIBRARIES}/3rdPartyLibs/sqlite-*/bin/*.dll"
352
"${SUMO_LIBRARIES}/3rdPartyLibs/freexl-*/bin/*.dll"
353
"${SUMO_LIBRARIES}/3rdPartyLibs/libexpat-*/bin/*.dll"
354
"${SUMO_LIBRARIES}/3rdPartyLibs/librttopo-*/bin/*.dll"
355
"${SUMO_LIBRARIES}/3rdPartyLibs/minizip-*/bin/*.dll"
356
"${SUMO_LIBRARIES}/3rdPartyLibs/thrift-*/bin/*.dll"
357
"${SUMO_LIBRARIES}/3rdPartyLibs/zstd-*/bin/*.dll"
358
"${SUMO_LIBRARIES}/3rdPartyLibs/lz4-*/bin/*.dll"
359
)
360
# check if MSVC dll runtimes have to be copied
361
if (INSTALL_DLL_RUNTIMES)
362
file(GLOB MSVC_DLLS "${SUMO_LIBRARIES}/runtimes/*.dll")
363
list(APPEND SUMO_LIBRARIES_DLL ${MSVC_DLLS})
364
endif(INSTALL_DLL_RUNTIMES)
365
if (MSVC_VERSION GREATER 1919)
366
# fmt in SUMOLibraries only works with MSVC 2019 and later
367
file(GLOB fmt_PATH "${SUMO_LIBRARIES}/fmt-??.?.?")
368
endif ()
369
# declare flag for use google test
370
set(USE_GOOGLETEST true)
371
# check if use google test
372
if (WIN32)
373
if (GNU_COMPILER AND NOT USE_MINGW_64BITS)
374
message(STATUS "Disabled Google Test in Mingw32")
375
set(USE_GOOGLETEST false)
376
elseif(CLANG_COMPILER)
377
message(STATUS "Disabled Google Test in Clang (Windows)")
378
set(USE_GOOGLETEST false)
379
endif ()
380
endif()
381
if (USE_GOOGLETEST)
382
file(GLOB GTEST_ROOT "${SUMO_LIBRARIES}/googletest-?.??.?")
383
message(STATUS "Found Google test: " ${GTEST_ROOT})
384
include_directories("${GTEST_ROOT}/include")
385
# set both google test library
386
set(GTEST_BOTH_LIBRARIES "${GTEST_ROOT}/lib/gtest.lib" "${GTEST_ROOT}/lib/gtest_main.lib")
387
# set google test DLLs
388
file(GLOB GTEST_DLL "${GTEST_ROOT}/bin/gtest*.dll")
389
set(GTEST_FOUND true)
390
endif ()
391
file(GLOB SWIG_EXECUTABLE "${SUMO_LIBRARIES}/swigwin-*/swig.exe")
392
file(GLOB MVN_EXECUTABLE "${SUMO_LIBRARIES}/apache-maven-*/bin/mvn.cmd")
393
else ()
394
# for Linux and Mac only
395
find_package(GTest)
396
endif ()
397
398
find_package(XercesC REQUIRED)
399
if (XercesC_FOUND)
400
include_directories(SYSTEM ${XercesC_INCLUDE_DIRS})
401
endif (XercesC_FOUND)
402
403
find_package(Proj)
404
if (PROJ_FOUND)
405
include_directories(SYSTEM ${PROJ_INCLUDE_DIR})
406
set(ENABLED_FEATURES "${ENABLED_FEATURES} Proj")
407
endif (PROJ_FOUND)
408
409
find_package(FOX)
410
if (FOX_FOUND)
411
set(OpenGL_GL_PREFERENCE LEGACY)
412
find_package(OpenGL)
413
if (OPENGL_FOUND AND OPENGL_GLU_FOUND)
414
include_directories(SYSTEM ${FOX_INCLUDE_DIR})
415
add_definitions(${FOX_CXX_FLAGS})
416
add_definitions(-DFLOAT_MATH_FUNCTIONS)
417
set(HAVE_FOX 1)
418
set(ENABLED_FEATURES "${ENABLED_FEATURES} GUI")
419
else ()
420
message(WARNING "Fox is present but OpenGL or GLU cannot be found, GUI will be disabled.")
421
endif ()
422
endif (FOX_FOUND)
423
424
find_package(Freetype)
425
if (FREETYPE_FOUND)
426
include_directories(SYSTEM ${FREETYPE_INCLUDE_DIRS})
427
else (FREETYPE_FOUND)
428
message(WARNING "FreeType cannot be found. If you are using SUMO libraries, update SUMO_LIBRARIES folder with git pull. Otherwise, specify manually FreeType include folder and libs.")
429
endif (FREETYPE_FOUND)
430
431
if (SUMO_LIBRARIES AND WIN32)
432
find_package(fmt PATHS ${fmt_PATH} NO_DEFAULT_PATH)
433
if (fmt_FOUND)
434
message(STATUS "Found FMT (SUMOLibraries): " ${fmt_DIR})
435
include_directories(SYSTEM "${fmt_PATH}/include")
436
set(FMT_LIBRARY fmt::fmt)
437
set(HAVE_FMT 1)
438
set(ENABLED_FEATURES "${ENABLED_FEATURES} FMT")
439
endif (fmt_FOUND)
440
elseif (NOT MSVC)
441
find_package(fmt QUIET)
442
if (fmt_FOUND)
443
set(HAVE_FMT 1)
444
set(FMT_LIBRARY fmt::fmt)
445
# next 2 lines could fix the include path for mambaforge fmt on DLR machines (maybe outdated cmake?)
446
# get_target_property(fmt_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES)
447
# include_directories(SYSTEM ${fmt_INCLUDE_DIR})
448
set(ENABLED_FEATURES "${ENABLED_FEATURES} FMT")
449
endif (fmt_FOUND)
450
endif ()
451
452
find_package(X11)
453
if (X11_FOUND)
454
link_directories(${X11_LIBRARY_DIR})
455
include_directories(SYSTEM ${X11_INCLUDE_DIR})
456
endif (X11_FOUND)
457
458
find_package(ZLIB)
459
if (ZLIB_FOUND)
460
set(HAVE_ZLIB 1)
461
link_directories(${ZLIB_LIBRARY_DIR})
462
include_directories(SYSTEM ${ZLIB_INCLUDE_DIR})
463
else ()
464
set(ZLIB_LIBRARIES "")
465
endif ()
466
467
find_package(Intl)
468
if (Intl_FOUND)
469
set(HAVE_INTL 1)
470
link_directories(${Intl_LIBRARY_DIR})
471
include_directories(SYSTEM ${Intl_INCLUDE_DIRS})
472
set(ENABLED_FEATURES "${ENABLED_FEATURES} Intl")
473
endif ()
474
475
find_package(SWIG 3.0.12)
476
if (SWIG_FOUND)
477
set(ENABLED_FEATURES "${ENABLED_FEATURES} SWIG")
478
endif ()
479
480
if (TCMALLOC)
481
find_library(TCMALLOC_LIBRARY NAMES tcmalloc_minimal)
482
if (TCMALLOC_LIBRARY)
483
set(ENABLED_FEATURES "${ENABLED_FEATURES} tcmalloc")
484
else ()
485
set(TCMALLOC_LIBRARY "")
486
endif ()
487
endif ()
488
489
if (PARQUET)
490
set(lz4Alt_FIND_QUIETLY True)
491
set(re2Alt_FIND_QUIETLY True)
492
set(ThriftAlt_FIND_QUIETLY True)
493
# needed for parquet
494
find_package(Arrow)
495
find_package(Parquet)
496
if (Arrow_FOUND AND Parquet_FOUND)
497
set(HAVE_PARQUET 1)
498
set(ENABLED_FEATURES "${ENABLED_FEATURES} Parquet")
499
set(PARQUET_LIBRARY Parquet::parquet_shared)
500
include_directories(SYSTEM ${ARROW_INCLUDE_DIR})
501
# if (GTEST_FOUND)
502
# add_definitions("GTest_SOURCE=Bundled")
503
# endif()
504
# this is for gtest compatibility
505
else()
506
message(WARNING "Parquet support requested but Arrow or Parquet libraries not found. Disabling Parquet support.")
507
set(PARQUET_LIBRARY "")
508
endif()
509
else()
510
set(PARQUET_LIBRARY "")
511
set(HAVE_PARQUET 0)
512
endif()
513
514
# Eigen (for overhead wire / electric circuit simulation)
515
find_package(Eigen3 3.2)
516
if (EIGEN3_FOUND)
517
include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})
518
set(HAVE_EIGEN 1) # see config.h.cmake for #cmakedefine
519
set(ENABLED_FEATURES "${ENABLED_FEATURES} Eigen")
520
endif (EIGEN3_FOUND)
521
522
if (CHECK_OPTIONAL_LIBS)
523
file(GLOB GDAL_PATH "${SUMO_LIBRARIES}/gdal-?.?.?")
524
file(GLOB FFMPEG_PATH "${SUMO_LIBRARIES}/FFMPEG-?.?.?")
525
file(GLOB OSG_PATH "${SUMO_LIBRARIES}/OSG-?.?.?")
526
file(GLOB GL2PS_PATH "${SUMO_LIBRARIES}/gl2ps-?.?.?")
527
file(GLOB GEOS_PATH "${SUMO_LIBRARIES}/geos-?.??.?")
528
file(GLOB BOOST_PATH "${SUMO_LIBRARIES}/boost-?.??.?")
529
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${GDAL_PATH};${FFMPEG_PATH};${OSG_PATH};${GL2PS_PATH};${GEOS_PATH};${BOOST_PATH}")
530
file(GLOB SUMO_OPTIONAL_LIBRARIES_DLL "${GDAL_PATH}/bin/*.dll" "${FFMPEG_PATH}/bin/*.dll" "${OSG_PATH}/bin/*.dll" "${GL2PS_PATH}/bin/*.dll" "${JUPEDSIM_CUSTOMDIR}/bin/*.dll")
531
532
# GDAL (for geopositioning)
533
find_package(GDAL)
534
if (GDAL_FOUND)
535
include_directories(SYSTEM ${GDAL_INCLUDE_DIR})
536
set(HAVE_GDAL 1)
537
set(ENABLED_FEATURES "${ENABLED_FEATURES} GDAL")
538
else (GDAL_FOUND)
539
set(GDAL_LIBRARY "")
540
endif (GDAL_FOUND)
541
542
if (FOX_FOUND)
543
# FFMPEG (for recording videos)
544
find_package(FFMPEG)
545
if (FFMPEG_FOUND)
546
include_directories(SYSTEM ${FFMPEG_INCLUDE_DIR})
547
set(HAVE_FFMPEG 1)
548
set(ENABLED_FEATURES "${ENABLED_FEATURES} FFmpeg")
549
endif ()
550
551
# OSG (For 3D view)
552
find_package(OpenSceneGraph 3.4.0 COMPONENTS osgGA osgViewer osgUtil osgDB osgText)
553
if (OPENSCENEGRAPH_FOUND)
554
include_directories(SYSTEM ${OPENSCENEGRAPH_INCLUDE_DIRS})
555
set(HAVE_OSG 1)
556
set(ENABLED_FEATURES "${ENABLED_FEATURES} OSG")
557
endif ()
558
559
# GL2PS (deprecated, will be changed by FreeType)
560
find_package(GL2PS)
561
if (GL2PS_FOUND)
562
include_directories(SYSTEM ${GL2PS_INCLUDE_DIR})
563
set(HAVE_GL2PS 1)
564
set(ENABLED_FEATURES "${ENABLED_FEATURES} GL2PS")
565
endif (GL2PS_FOUND)
566
endif ()
567
568
find_package(jupedsim CONFIG HINTS ${JUPEDSIM_CUSTOMDIR} QUIET)
569
if (jupedsim_FOUND)
570
find_package(GEOS 3.3.0)
571
if (GEOS_FOUND)
572
include_directories(SYSTEM ${GEOS_INCLUDE_DIR})
573
set(JPS_VERSION "${jupedsim_VERSION_MAJOR}${jupedsim_VERSION_MINOR}${jupedsim_VERSION_PATCH}")
574
set(ENABLED_FEATURES "${ENABLED_FEATURES} JuPedSim")
575
message(STATUS "Found JuPedSim: ${jupedsim_DIR} ${jupedsim_VERSION}")
576
else (GEOS_FOUND)
577
message(STATUS "Could NOT find GEOS! JuPedSim requires GEOS.")
578
endif (GEOS_FOUND)
579
else (jupedsim_FOUND)
580
message(STATUS "Could NOT find JuPedSim! Skipping JuPedSim integration.")
581
endif (jupedsim_FOUND)
582
583
# add optional libraries
584
list(APPEND SUMO_LIBRARIES_DLL ${SUMO_OPTIONAL_LIBRARIES_DLL})
585
586
# BOOST (needed for stacktrace, minimum version 1.80.0)
587
find_package(boost_filesystem CONFIG QUIET)
588
find_package(boost_process CONFIG QUIET)
589
find_package(boost_headers CONFIG QUIET)
590
591
# init boost library
592
set(BOOST_LIBRARIES "")
593
594
# continue if boost was found
595
if(boost_filesystem_FOUND AND boost_process_FOUND AND boost_headers_FOUND)
596
message(STATUS "Boost headers, filesystem and process " ${boost_headers_VERSION} " found, enabling stacktrace support")
597
set(HAVE_BOOST 1)
598
# set includes
599
get_target_property(Boost_include Boost::headers INTERFACE_INCLUDE_DIRECTORIES)
600
include_directories(${Boost_include})
601
# add boost libraries
602
list(APPEND BOOST_LIBRARIES Boost::filesystem Boost::process Boost::headers)
603
else()
604
message(STATUS "Boost not found, building without stacktrace support")
605
endif()
606
607
endif (CHECK_OPTIONAL_LIBS)
608
609
include_directories(${CMAKE_CURRENT_BINARY_DIR}/src)
610
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
611
612
set(commonlibs
613
utils_distribution utils_handlers utils_shapes utils_options
614
utils_xml utils_geom utils_common utils_importio utils_iodevices utils_traction_wire foreign_tcpip
615
${XercesC_LIBRARIES} ${ZLIB_LIBRARIES} ${PROJ_LIBRARY} ${Intl_LIBRARIES} ${FMT_LIBRARY} ${PARQUET_LIBRARY} ${CMAKE_DL_LIBS})
616
if (WIN32)
617
set(commonlibs ${commonlibs} ws2_32)
618
endif ()
619
if (PPROF)
620
set(commonlibs ${commonlibs} profiler)
621
endif ()
622
set(commonvehiclelibs
623
utils_emissions foreign_phemlight foreign_phemlight_V5 utils_vehicle ${commonlibs} ${FOX_LIBRARY})
624
625
# set custom name and folder for ALL_BUILD and ZERO_CHECK in visual studio solutions
626
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
627
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake")
628
629
# installation
630
if (MSVC)
631
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
632
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/sumo-${PACKAGE_VERSION}")
633
endif()
634
if (ISOLATED_BUILD)
635
set(SUMO_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin/)
636
else()
637
set(SUMO_BIN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/bin/)
638
endif()
639
install(DIRECTORY ${SUMO_BIN_DIR} DESTINATION bin COMPONENT dll
640
FILES_MATCHING
641
PATTERN "*.bat"
642
PATTERN "*.dll"
643
PATTERN "*d.dll" EXCLUDE
644
PATTERN "*_Debug.dll" EXCLUDE
645
PATTERN "gtest*.dll" EXCLUDE)
646
# files which end with "d" but are not debug
647
install(DIRECTORY ${SUMO_BIN_DIR} DESTINATION bin COMPONENT dll
648
FILES_MATCHING
649
PATTERN "thriftmd.dll"
650
PATTERN "zstd.dll")
651
else ()
652
include(GNUInstallDirs)
653
endif ()
654
if (SKBUILD OR MSVC)
655
set(DATA_PATH "")
656
else ()
657
set(DATA_PATH "share/sumo/")
658
endif ()
659
if (SKBUILD)
660
set(EXCLUDE_LIBSUMO "libsumo")
661
set(EXCLUDE_LIBTRACI "libtraci")
662
endif ()
663
install(DIRECTORY data/ DESTINATION ${DATA_PATH}data COMPONENT data)
664
install(DIRECTORY tools/ DESTINATION ${DATA_PATH}tools
665
USE_SOURCE_PERMISSIONS COMPONENT runtime
666
PATTERN "build_config/sumo" EXCLUDE # needed for the scikit build
667
PATTERN "calibration" EXCLUDE
668
PATTERN "lisum-core" EXCLUDE
669
PATTERN "lisum-gui" EXCLUDE
670
PATTERN "sumolib4matlab/src" EXCLUDE
671
PATTERN "${EXCLUDE_LIBSUMO}" EXCLUDE
672
PATTERN "${EXCLUDE_LIBTRACI}" EXCLUDE
673
PATTERN "traas" EXCLUDE
674
PATTERN "traci4matlab/src" EXCLUDE
675
PATTERN "__pycache__" EXCLUDE
676
PATTERN "*.pyc" EXCLUDE
677
PATTERN "*.egg-info" EXCLUDE
678
PATTERN ".git" EXCLUDE)
679
if (${CMAKE_VERSION} VERSION_GREATER 3.6.0)
680
# this is a hack which works only with a non-isolated build
681
install(DIRECTORY tools/libsumo/ DESTINATION libsumo COMPONENT tools_libsumo EXCLUDE_FROM_ALL
682
PATTERN "__pycache__" EXCLUDE
683
PATTERN "*.pyc" EXCLUDE)
684
if (PROJ_DATA_DIR)
685
install(DIRECTORY ${PROJ_DATA_DIR}/ DESTINATION ${DATA_PATH}data/proj COMPONENT proj_data EXCLUDE_FROM_ALL
686
PATTERN "*.tif" EXCLUDE
687
PATTERN "*.txt" EXCLUDE)
688
endif ()
689
endif ()
690
install(CODE "
691
execute_process(COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/build_config/version.py --pep440 \$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${DATA_PATH}tools/sumolib/version.py)
692
" COMPONENT runtime)
693
if (DATA_PATH)
694
install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../../bin \$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${DATA_PATH}bin)" COMPONENT runtime)
695
endif ()
696
697
install(EXPORT SUMOConfig DESTINATION ${DATA_PATH}cmake NAMESPACE SUMO:: COMPONENT runtime)
698
699
set(SUMO_TOOLS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tools")
700
if (${CMAKE_VERSION} VERSION_GREATER 3.6.0 AND NOT ${PYTHON_BUILD_MISSING})
701
# no isolated build here because we need to be able to do it offline (on open build service, launchpad etc.)
702
# furthermore several commands in the same execute_process are not guaranteed to be executed sequentially
703
install(CODE "
704
execute_process(COMMAND ${Python_EXECUTABLE} tools/build_config/version.py --pep440 build_config/pyproject/sumolib.toml pyproject.toml
705
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
706
execute_process(COMMAND ${Python_EXECUTABLE} -m build --no-isolation --wheel . -o ${CMAKE_BINARY_DIR}
707
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
708
execute_process(COMMAND ${Python_EXECUTABLE} tools/build_config/version.py --pep440 build_config/pyproject/traci.toml pyproject.toml
709
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
710
execute_process(COMMAND ${Python_EXECUTABLE} -m build --no-isolation --wheel . -o ${CMAKE_BINARY_DIR}
711
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
712
execute_process(COMMAND ${Python_EXECUTABLE} -m pip install --prefix=\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX} -f ${CMAKE_BINARY_DIR} --no-index traci
713
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
714
" COMPONENT python_package EXCLUDE_FROM_ALL)
715
endif ()
716
717
if (SUMO_LIBRARIES AND WIN32)
718
# filter release DLLs
719
execute_process(COMMAND ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/build_config/filterDebugDLL.py ${SUMO_LIBRARIES_DLL}
720
OUTPUT_VARIABLE SUMO_LIBRARIES_RELEASE_DLL)
721
if (ISOLATED_BUILD)
722
set(TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR})
723
else()
724
set(TARGET_DIR ${CMAKE_CURRENT_SOURCE_DIR})
725
endif()
726
# copy debug dlls
727
foreach(DLL_PATH ${SUMO_LIBRARIES_DLL} ${GTEST_DLL})
728
get_filename_component(DLL_BASENAME ${DLL_PATH} NAME)
729
set(TARGET_DLL ${TARGET_DIR}/bin/${DLL_BASENAME})
730
list(FIND TARGET_ALL_DLLS ${TARGET_DLL} DLL_KNOWN)
731
list(FIND SUMO_LIBRARIES_RELEASE_DLL ${DLL_PATH} IS_RELEASE_DLL)
732
list(FIND GTEST_DLL ${DLL_PATH} IS_TEST_DLL)
733
if (DLL_KNOWN EQUAL -1)
734
add_custom_command(OUTPUT ${TARGET_DLL}
735
COMMAND ${CMAKE_COMMAND} -E copy ${DLL_PATH} ${TARGET_DLL}
736
DEPENDS ${DLL_PATH})
737
if (IS_TEST_DLL GREATER -1)
738
list(APPEND TARGET_TEST_DLLS ${TARGET_DLL})
739
elseif (IS_RELEASE_DLL GREATER -1)
740
list(APPEND TARGET_ALL_DLLS ${TARGET_DLL})
741
else ()
742
list(APPEND TARGET_ALL_DLLS $<$<CONFIG:Debug>:${TARGET_DLL}>)
743
endif ()
744
endif()
745
endforeach(DLL_PATH)
746
# copy OSG dlls
747
if (HAVE_OSG)
748
file(GLOB OSG_PLUGIN_DLL "${OSG_PATH}/bin/osgPlugins*/osgdb_osg.dll")
749
get_filename_component(OSG_PLUGIN_DLL_BASENAME ${OSG_PLUGIN_DLL} NAME)
750
get_filename_component(OSG_PLUGIN_DIR ${OSG_PLUGIN_DLL} DIRECTORY)
751
get_filename_component(OSG_PLUGIN_DIR ${OSG_PLUGIN_DIR} NAME)
752
set(OSG_TARGET ${TARGET_DIR}/bin/${OSG_PLUGIN_DIR}/${OSG_PLUGIN_DLL_BASENAME})
753
add_custom_command(OUTPUT ${OSG_TARGET}
754
COMMAND ${CMAKE_COMMAND} -E copy_directory ${OSG_PATH}/bin/${OSG_PLUGIN_DIR} ${TARGET_DIR}/bin/${OSG_PLUGIN_DIR}
755
DEPENDS ${OSG_PLUGIN_DLL})
756
endif (HAVE_OSG)
757
if (PROJ_DATA_DIR)
758
# proj 7 needs to copy "share/proj" folder in SUMO_HOME/share
759
set(PROJ_DATA ${TARGET_DIR}/share/proj/proj.db)
760
add_custom_command(OUTPUT ${PROJ_DATA}
761
COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJ_DATA_DIR} ${TARGET_DIR}/share/proj
762
DEPENDS ${PROJ_DATA_DIR}/proj.db)
763
install(DIRECTORY ${TARGET_DIR}/share/ DESTINATION ${DATA_PATH}share COMPONENT data)
764
endif ()
765
endif()
766
# set install dll targets, for non-Windows they depend on nothing
767
add_custom_target(install_dll DEPENDS ${TARGET_ALL_DLLS} ${OSG_TARGET} ${PROJ_DATA})
768
add_custom_target(install_test_dll DEPENDS ${TARGET_TEST_DLLS})
769
set_property(TARGET install_dll PROPERTY FOLDER "CMake")
770
set_property(TARGET install_test_dll PROPERTY FOLDER "CMake")
771
772
# installing desktop files and other Linux specific stuff
773
if (CMAKE_VERSION VERSION_GREATER 3.6.0 AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
774
install(DIRECTORY build_config/package/ DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/profile.d
775
COMPONENT linux_integration EXCLUDE_FROM_ALL
776
FILES_MATCHING PATTERN "*sh" PATTERN "jupedsim" EXCLUDE)
777
install(DIRECTORY build_config/package/ DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
778
COMPONENT linux_integration EXCLUDE_FROM_ALL
779
FILES_MATCHING PATTERN "*.desktop" PATTERN "jupedsim" EXCLUDE)
780
install(DIRECTORY build_config/package/ DESTINATION ${CMAKE_INSTALL_DATADIR}/pixmaps
781
COMPONENT linux_integration EXCLUDE_FROM_ALL
782
FILES_MATCHING PATTERN "*.png" PATTERN "jupedsim" EXCLUDE)
783
install(DIRECTORY build_config/package/ DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/application
784
COMPONENT linux_integration EXCLUDE_FROM_ALL
785
FILES_MATCHING PATTERN "org.eclipse.sumo.xml" PATTERN "jupedsim" EXCLUDE)
786
endif()
787
788
# i18n target
789
find_package(Gettext)
790
if (Gettext_FOUND)
791
if (ISOLATED_BUILD)
792
set(LOCALE_DIR ${CMAKE_BINARY_DIR}/data)
793
install(DIRECTORY ${LOCALE_DIR}/locale/ DESTINATION ${DATA_PATH}data/locale COMPONENT data)
794
else()
795
set(LOCALE_DIR ${CMAKE_SOURCE_DIR}/data)
796
endif()
797
set(I18N_DATA ${LOCALE_DIR}/locale/tr/LC_MESSAGES/sumo.mo)
798
add_custom_command(OUTPUT ${I18N_DATA}
799
COMMAND ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/build_config/i18n.py -m -o ${LOCALE_DIR}
800
DEPENDS ${CMAKE_SOURCE_DIR}/data/po/tr_gui.po)
801
else ()
802
message(WARNING "Gettext tools not found, translation files will not be generated.")
803
endif()
804
add_custom_target(install_mo DEPENDS ${I18N_DATA})
805
806
# java targets
807
find_program(MVN_EXECUTABLE mvn)
808
if (NOT VERBOSE_SUB)
809
set(MVN_OPTS "-q")
810
endif ()
811
find_package(Java COMPONENTS Development)
812
if (MVN_EXECUTABLE AND Java_FOUND)
813
if (NOT DEFINED ENV{JAVA_HOME})
814
get_filename_component(JAVA_BIN ${Java_JAVAC_EXECUTABLE} DIRECTORY)
815
get_filename_component(JAVA_HOME ${JAVA_BIN} DIRECTORY)
816
set(MVN_COMMAND_PREFIX ${CMAKE_COMMAND} -E env JAVA_HOME=${JAVA_HOME})
817
set(MVN_REPO "-Dmaven.repo.local=${CMAKE_BINARY_DIR}/m2")
818
endif ()
819
add_custom_target(traas
820
COMMAND ${MVN_COMMAND_PREFIX} ${MVN_EXECUTABLE} ${MVN_REPO} ${MVN_OPTS} --batch-mode -f tools/contributed/traas/pom.xml clean install
821
COMMAND ${CMAKE_COMMAND} -E copy tools/contributed/traas/target/traas-1.1.jar bin/TraaS.jar
822
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
823
add_custom_target(lisum
824
COMMAND ${MVN_COMMAND_PREFIX} ${MVN_EXECUTABLE} ${MVN_REPO} ${MVN_OPTS} --batch-mode -f tools/contributed/lisum/pom.xml clean install
825
COMMAND ${CMAKE_COMMAND} -E copy tools/contributed/lisum/lisum-core/target/lisum-core-1.0.2.jar bin/lisum-core.jar
826
COMMAND ${CMAKE_COMMAND} -E copy tools/contributed/lisum/lisum-gui/target/lisum-gui-1.1.jar bin/lisum-gui.jar
827
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
828
add_dependencies(lisum traas)
829
set(JAVA_TARGETS traas lisum)
830
foreach (JAVAT ${JAVA_TARGETS})
831
set_property(TARGET ${JAVAT} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
832
set_property(TARGET ${JAVAT} PROPERTY FOLDER "java")
833
endforeach ()
834
endif ()
835
836
# doc targets
837
add_custom_target(doxygen
838
COMMAND rm -rf docs/doxygen
839
COMMAND mkdir docs/doxygen
840
COMMAND doxygen sumo.doxyconf > doxygen.log 2>&1
841
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
842
set_property(TARGET doxygen PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
843
set_property(TARGET doxygen PROPERTY FOLDER "doc")
844
845
add_custom_target(userdoc
846
COMMAND ../../tools/build_config/buildPyDoc.py -p ../pydoc -c
847
COMMAND mkdocs build -d ../userdoc
848
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/web)
849
set_property(TARGET userdoc PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
850
set_property(TARGET userdoc PROPERTY FOLDER "doc")
851
852
if (MVN_EXECUTABLE)
853
add_custom_target(javadoc
854
COMMAND rm -rf docs/javadoc
855
COMMAND mkdir docs/javadoc
856
COMMAND ${MVN_EXECUTABLE} ${MVN_OPTS} --batch-mode -f tools/contributed/traas/pom.xml javadoc:javadoc
857
COMMAND mv tools/contributed/traas/target/site/apidocs docs/javadoc/traas
858
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
859
set_property(TARGET javadoc PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
860
set_property(TARGET javadoc PROPERTY FOLDER "doc")
861
set(JAVADOC_TARGET javadoc)
862
endif ()
863
864
find_program(HELPMAN_EXECUTABLE help2man)
865
if (HELPMAN_EXECUTABLE)
866
add_custom_target(man
867
COMMAND rm -rf docs/man
868
COMMAND mkdir docs/man
869
COMMAND ${HELPMAN_EXECUTABLE} -N -n "A microscopic, multi-modal traffic simulation" bin/sumo > docs/man/sumo.1
870
COMMAND ${HELPMAN_EXECUTABLE} -N -n "GUI version of the simulation SUMO" bin/sumo-gui > docs/man/sumo-gui.1
871
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Builds vehicle routes for SUMO using detector values" bin/dfrouter > docs/man/dfrouter.1
872
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Shortest path router and DUE computer for the microscopic traffic simulation SUMO" bin/duarouter > docs/man/duarouter.1
873
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Router for the microscopic traffic simulation SUMO based on junction turning ratios" bin/jtrrouter > docs/man/jtrrouter.1
874
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Import O/D-matrices and trips using macroscopic traffic assignment for SUMO" bin/marouter > docs/man/marouter.1
875
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Generates routes of persons throughout a day for the microscopic traffic simulation SUMO" bin/activitygen > docs/man/activitygen.1
876
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Importer of O/D-matrices for the traffic simulation SUMO" bin/od2trips > docs/man/od2trips.1
877
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Road network importer / builder for the traffic simulation SUMO" bin/netconvert > docs/man/netconvert.1
878
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Road network editor for the traffic simulation SUMO" bin/netedit > docs/man/netedit.1
879
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Road network generator for the microscopic traffic simulation SUMO" bin/netgenerate > docs/man/netgenerate.1
880
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Importer of polygons and POIs for the traffic simulation SUMO" bin/polyconvert > docs/man/polyconvert.1
881
COMMAND ${HELPMAN_EXECUTABLE} -N -n "TraCITestClient for the traffic simulation SUMO" bin/TraCITestClient > docs/man/TraCITestClient.1
882
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Builds and writes an emissions map for SUMO\\\'s emission models" bin/emissionsMap > docs/man/emissionsMap.1
883
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Computes emissions by driving a time line using SUMO\\\'s emission models" bin/emissionsDrivingCycle > docs/man/emissionsDrivingCycle.1
884
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
885
set_property(TARGET man PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
886
set_property(TARGET man PROPERTY FOLDER "doc")
887
set(MAN_TARGET man)
888
if (CMAKE_VERSION VERSION_GREATER 3.6.0 AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
889
install(DIRECTORY docs/man/ DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
890
COMPONENT linux_integration EXCLUDE_FROM_ALL)
891
endif()
892
endif ()
893
894
add_custom_target(doc)
895
add_dependencies(doc doxygen userdoc ${JAVADOC_TARGET} ${MAN_TARGET})
896
set_property(TARGET doc PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
897
set_property(TARGET doc PROPERTY FOLDER "doc")
898
899
# coverage targets
900
if (COVERAGE)
901
find_program(LCOV_EXECUTABLE lcov)
902
if (LCOV_EXECUTABLE)
903
add_custom_target(lcov
904
COMMAND rm -rf docs/lcov
905
COMMAND mkdir docs/lcov
906
COMMAND ${LCOV_EXECUTABLE} -d . --capture --output-file docs/lcov/lcov.info
907
COMMAND ${LCOV_EXECUTABLE} --remove docs/lcov/lcov.info '/usr/*' --output-file docs/lcov/lcov.info
908
COMMAND genhtml -o docs/lcov/html docs/lcov/lcov.info
909
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
910
add_custom_target(lcov-reset
911
COMMAND ${LCOV_EXECUTABLE} -d . -z
912
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
913
else ()
914
message(WARNING "COVERAGE is enabled but lcov was not found.")
915
endif ()
916
endif ()
917
918
# testing
919
enable_testing()
920
add_subdirectory(src)
921
if (GTEST_FOUND)
922
add_subdirectory(unittest)
923
endif ()
924
925
# example and dist targets
926
add_custom_target(examples
927
COMMAND ${Python_EXECUTABLE} tools/extractTest.py -x -f tests/examples.txt -p docs/examples/runAll.py
928
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
929
add_dependencies(examples sumo netconvert dfrouter duarouter jtrrouter)
930
set_property(TARGET examples PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
931
set_property(TARGET examples PROPERTY FOLDER "doc")
932
933
find_program(PYINSTALLER_FOUND "pyinstaller")
934
if (PYINSTALLER_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/tools/game/runner.spec)
935
if (OPENSCENEGRAPH_FOUND)
936
set(PYINSTALLER_ARGS -- osg)
937
endif()
938
add_custom_target(game
939
COMMAND pyinstaller --noconfirm ${CMAKE_SOURCE_DIR}/tools/game/runner.spec ${PYINSTALLER_ARGS}
940
)
941
endif()
942
943
add_test(exampletest ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/docs/examples/runAll.py)
944
find_package(Git)
945
if (GIT_FOUND)
946
add_custom_target(dist
947
COMMAND rm -rf sumo-${PACKAGE_VERSION} sumo-${PACKAGE_VERSION}.zip sumo-src-${PACKAGE_VERSION}.tar.gz sumo-src-${PACKAGE_VERSION}.zip sumo-gui-macos-${PACKAGE_VERSION}.zip
948
COMMAND ${GIT_EXECUTABLE} archive --prefix sumo-${PACKAGE_VERSION}/ -o sumo-${PACKAGE_VERSION}.zip HEAD
949
COMMAND unzip -q sumo-${PACKAGE_VERSION}.zip
950
COMMAND rm -r sumo-${PACKAGE_VERSION}/tests
951
COMMAND cp -a docs/tutorial docs/examples sumo-${PACKAGE_VERSION}/docs
952
COMMAND find tools/contributed/saga/ tools/contributed/traci4matlab -type f | grep -v .git | xargs cp --parents --target-dir sumo-${PACKAGE_VERSION}
953
COMMAND ${Python_EXECUTABLE} tools/build_config/version.py --pep440 sumo-${PACKAGE_VERSION}/tools/sumolib/version.py
954
COMMAND ${Python_EXECUTABLE} tools/build_config/version.py --pep440 sumo-${PACKAGE_VERSION}/tools/traci/__init__.py
955
COMMAND ${Python_EXECUTABLE} tools/build_config/version.py --pep440 sumo-${PACKAGE_VERSION}/tools/libsumo/__init__.py
956
COMMAND mkdir sumo-${PACKAGE_VERSION}/include
957
COMMAND cp ${CMAKE_BINARY_DIR}/src/version.h sumo-${PACKAGE_VERSION}/include
958
COMMAND zip -rq sumo-src-${PACKAGE_VERSION}.zip sumo-${PACKAGE_VERSION}
959
COMMAND tar -czf sumo-src-${PACKAGE_VERSION}.tar.gz sumo-${PACKAGE_VERSION}
960
COMMAND cp -a docs/userdoc docs/pydoc docs/javadoc docs/man sumo-${PACKAGE_VERSION}/docs
961
COMMAND rm -r sumo-${PACKAGE_VERSION}/docs/web/docs/images
962
COMMAND ln -s ../../userdoc/images sumo-${PACKAGE_VERSION}/docs/web/docs/images
963
COMMAND tar -czf sumo_${PACKAGE_VERSION}.orig.tar.gz --exclude "*.jar" sumo-${PACKAGE_VERSION}
964
COMMAND rm -rf sumo-${PACKAGE_VERSION} sumo-${PACKAGE_VERSION}.zip
965
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
966
add_dependencies(dist examples doc ${JAVA_TARGETS})
967
set_property(TARGET dist PROPERTY FOLDER "CMake")
968
set_property(TARGET dist PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
969
970
add_custom_target(distcheck
971
COMMAND rm -rf sumo-${PACKAGE_VERSION}
972
COMMAND unzip -q sumo-src-${PACKAGE_VERSION}.zip
973
COMMAND cd sumo-${PACKAGE_VERSION} && mkdir _cmake_build _cmake_install && cd _cmake_build
974
&& cmake -DCMAKE_INSTALL_PREFIX=../_cmake_install -DCHECK_OPTIONAL_LIBS=${CHECK_OPTIONAL_LIBS} .. || (echo "ERROR: the cmake configuration failed." && false)
975
&& make -j8 || (echo "ERROR: the compilation failed." && false)
976
&& make test || (echo "ERROR: the test suite failed." && false)
977
&& make install || (echo "ERROR: the install target failed." && false)
978
COMMAND rm -rf sumo-${PACKAGE_VERSION}
979
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
980
add_dependencies(distcheck dist)
981
set_property(TARGET distcheck PROPERTY FOLDER "CMake")
982
set_property(TARGET distcheck PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
983
endif ()
984
message(STATUS "Enabled features: ${ENABLED_FEATURES}")
985
986