Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/CMakeLists.txt
169627 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")
113
# disable debug build (due a problem with Runtime Libraries)
114
set(CMAKE_CONFIGURATION_TYPES "Release")
115
set(CMAKE_BUILD_TYPE "Release")
116
else ()
117
# flags for clang and gcc in linux
118
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -Wall -pedantic -Wextra")
119
endif ()
120
if (GNU_COMPILER)
121
# see https://stackoverflow.com/questions/23499909/adjust-variable-tracking-assignment-length
122
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --param=max-vartrack-size=200000")
123
endif ()
124
if (PROFILING)
125
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
126
set(ENABLED_FEATURES "${ENABLED_FEATURES} Profiling")
127
set(BINARY_SUFFIX "${BINARY_SUFFIX}P")
128
endif ()
129
if (COVERAGE)
130
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage -O0")
131
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
132
set(ENABLED_FEATURES "${ENABLED_FEATURES} Coverage")
133
endif ()
134
elseif (MSVC)
135
# enabling /WX is not possible due to warnings in external headers
136
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
137
# this is a workaround to disable lots of warnings for replacing /W3 with /W4 in VS 2019
138
# there is a policy for that starting with CMake 3.15
139
if (MSVC_VERSION GREATER 1900)
140
string(REPLACE "/W3" "/Wall" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
141
else ()
142
string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
143
endif ()
144
else ()
145
# /Wall brings MSVC 2013 to complete halt
146
if (MSVC_VERSION GREATER 1900)
147
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Wall")
148
else ()
149
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4")
150
endif ()
151
endif ()
152
if (MULTITHREADED_BUILD)
153
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
154
endif ()
155
# SWIG generates large obj files
156
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
157
# backward compatible mutex API, see https://github.com/actions/runner-images/issues/10004
158
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR")
159
# exporting symbols for shared libraries needs to enabled explicitly
160
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
161
# add option for enabling console in release mode
162
option(CONSOLE_RELEASE "Enable console in SUMO-GUI and NETEDIT in release (use only for debug purposes)" false)
163
endif ()
164
165
# special debug flags
166
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")
167
if (CLANG_COMPILER)
168
if (WIN32)
169
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined,integer -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/build_config/clang_sanitize_blacklist.txt")
170
add_compile_definitions(_ITERATOR_DEBUG_LEVEL=0)
171
else ()
172
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")
173
endif ()
174
endif ()
175
176
# we need to build position independent code when generating a shared library
177
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
178
if (SUMO_UTILS)
179
set(ENABLED_FEATURES "${ENABLED_FEATURES} SumoUtilsLibrary")
180
endif ()
181
if (FMI)
182
set(ENABLED_FEATURES "${ENABLED_FEATURES} FMI")
183
endif ()
184
185
if (NOT ISOLATED_BUILD)
186
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
187
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
188
# force Visual Studio to leave out the Release / Debug dirs
189
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/bin)
190
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin)
191
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/bin)
192
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin)
193
endif()
194
195
# Debug messages
196
message(STATUS "CMAKE_BINARY_DIR: " ${CMAKE_BINARY_DIR})
197
message(STATUS "CMAKE_SOURCE_DIR: " ${CMAKE_SOURCE_DIR})
198
message(STATUS "")
199
message(STATUS "Platform: ")
200
message(STATUS " Host: " ${CMAKE_HOST_SYSTEM} " " ${CMAKE_HOST_SYSTEM_PROCESSOR})
201
message(STATUS " Target: " ${CMAKE_SYSTEM} " " ${CMAKE_SYSTEM_PROCESSOR})
202
message(STATUS " CMake: " ${CMAKE_VERSION})
203
message(STATUS " CMake generator: " ${CMAKE_GENERATOR})
204
message(STATUS " CMake build tool: " ${CMAKE_BUILD_TOOL})
205
message(STATUS " Compiler: " ${CMAKE_CXX_COMPILER_ID} " " ${CMAKE_CXX_COMPILER_VERSION})
206
if (CMAKE_GENERATOR MATCHES Xcode)
207
message(STATUS " Xcode: " ${XCODE_VERSION})
208
endif ()
209
message(STATUS "")
210
211
if ((${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND SKBUILD) OR ${CMAKE_VERSION} VERSION_LESS 3.12.0)
212
find_package(PythonInterp REQUIRED)
213
find_package(PythonLibs)
214
else()
215
find_package(Python REQUIRED COMPONENTS Interpreter Development)
216
# define variables for compatibility. refactor once older cmake unsupported
217
if (Python_FOUND)
218
set(PYTHONLIBS_FOUND ${Python_FOUND})
219
set(PYTHON_EXECUTABLE ${Python_EXECUTABLE} CACHE FILEPATH "Python executable")
220
set(PYTHON_LIBRARIES ${Python_LIBRARIES} CACHE FILEPATH "Python libraries")
221
set(PYTHON_INCLUDE_DIRS ${Python_INCLUDE_DIRS} CACHE PATH "Python include folder")
222
set(PYTHON_LIBRARY_DIRS ${Python_LIBRARY_DIRS})
223
endif()
224
endif()
225
message(STATUS "Found Python: " ${PYTHON_EXECUTABLE})
226
if (MSVC AND ENABLE_PYTHON_BINDINGS)
227
# recheck that the platform of the generator and python matches
228
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import sys; print(sys.maxsize > 2**32)"
229
OUTPUT_VARIABLE IS_PYTHON64 OUTPUT_STRIP_TRAILING_WHITESPACE)
230
if (${CMAKE_MODULE_LINKER_FLAGS} STREQUAL "/machine:x64")
231
if (${IS_PYTHON64} STREQUAL "False")
232
message(WARNING "Did not find Python 64 bit. Please set PYTHON_EXECUTABLE, PYTHON_INCLUDE_DIR and PYTHON_LIBRARY manually.")
233
set(PYTHON_INCLUDE_DIRS "")
234
endif()
235
else()
236
if (${IS_PYTHON64} STREQUAL "True")
237
message(WARNING "Did not find Python 32 bit. Please set PYTHON_EXECUTABLE, PYTHON_INCLUDE_DIR and PYTHON_LIBRARY manually.")
238
set(PYTHON_INCLUDE_DIRS "")
239
endif()
240
endif()
241
if (NOT PYTHON_DEBUG_LIBRARY AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
242
message(WARNING "Did not find Python debug library. Please reinstall your Python and enable the Python debug libraries in the installer.")
243
set(PYTHON_INCLUDE_DIRS "")
244
endif()
245
endif()
246
247
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import setuptools" RESULT_VARIABLE PYTHON_SETUPTOOLS_MISSING ERROR_QUIET)
248
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import build; import pip; build.__version__" RESULT_VARIABLE PYTHON_BUILD_MISSING ERROR_QUIET)
249
250
# exclusive from Apple
251
if (APPLE)
252
# we know that openGL is deprecated for newer MacOS
253
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGL_SILENCE_DEPRECATION")
254
255
# Xcode 15 on macOS sonoma complains about duplicate libraries for the linker, so we disable the warning for xcode >= 15
256
if (CLANG_COMPILER)
257
string(REGEX MATCH "^[0-9]+" ClangMajorVersion "${CMAKE_CXX_COMPILER_VERSION}")
258
if (ClangMajorVersion GREATER_EQUAL 15)
259
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-no_warn_duplicate_libraries")
260
endif()
261
endif()
262
263
# Recommendation, also add a "brew --prefix" custom command to detect a homebrew build environment
264
execute_process(COMMAND brew --prefix RESULT_VARIABLE DETECT_BREW OUTPUT_VARIABLE BREW_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
265
if (${DETECT_BREW} EQUAL 0)
266
link_directories(${BREW_PREFIX}/lib)
267
include_directories(${BREW_PREFIX}/include)
268
message(STATUS "Brew detected: ${BREW_PREFIX}")
269
endif ()
270
271
# Detect if the "port" command is valid on this system; if so, return full path
272
execute_process(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
273
if (${DETECT_MACPORTS} EQUAL 0)
274
# MACPORTS_PREFIX contains now something like "/opt/local/bin/port", so we get the parent directory
275
get_filename_component(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)
276
# "/opt/local" is where MacPorts lives, add `/lib` suffix and link
277
# http://stackoverflow.com/questions/1487752/how-do-i-instruct-cmake-to-look-for-libraries-installed-by-macports
278
link_directories(/opt/X11/lib ${MACPORTS_PREFIX}/../lib)
279
include_directories(SYSTEM /opt/X11/include ${MACPORTS_PREFIX}/../include)
280
message(STATUS "Macports detected: ${MACPORTS_PREFIX}")
281
endif ()
282
endif (APPLE)
283
284
# Specifically define variable WIN32 for compilations under windows (due an error in Shawn)
285
if (GNU_COMPILER AND WIN32)
286
option(USE_MINGW_64BITS "Use 64 bits libraries for the compilation with MinGW" true)
287
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32 -D_WIN32_WINNT=0x0501")
288
set(MINGW32 1)
289
endif ()
290
291
if (NOT JUPEDSIM_CUSTOMDIR)
292
# check if set JuPedSim directory from SUMOLibraries
293
if (SUMO_LIBRARIES AND WIN32)
294
file(GLOB JUPEDSIM_CUSTOMDIR_SUMOLIBRARIES "${SUMO_LIBRARIES}/JuPedSim-*")
295
set(JUPEDSIM_CUSTOMDIR "${JUPEDSIM_CUSTOMDIR_SUMOLIBRARIES}")
296
else ()
297
if (EXISTS "${CMAKE_SOURCE_DIR}/../jupedsim-install")
298
set(JUPEDSIM_CUSTOMDIR "${CMAKE_SOURCE_DIR}/../jupedsim-install")
299
endif ()
300
endif ()
301
if (JUPEDSIM_CUSTOMDIR)
302
message(STATUS "Using JuPedSim from ${JUPEDSIM_CUSTOMDIR}")
303
endif ()
304
endif ()
305
306
# check if SUMOLibraries was found (Only in Windows)
307
if (SUMO_LIBRARIES AND WIN32)
308
# Special option for MinGW32
309
message(STATUS "Using 64 bit libraries from SUMO_LIBRARIES placed in " ${SUMO_LIBRARIES})
310
file(GLOB XERCES_PATH "${SUMO_LIBRARIES}/xerces-c-3.?.?")
311
file(GLOB ZLIB_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/zlib-?.?.*")
312
file(GLOB PROJ_PATH "${SUMO_LIBRARIES}/proj-?.?.?")
313
file(GLOB FOX_PATH "${SUMO_LIBRARIES}/fox-?.?.??")
314
file(GLOB FREETYPE_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/freetype-2.??.?")
315
file(GLOB EIGEN3_PATH "${SUMO_LIBRARIES}/eigen-3.?.?")
316
file(GLOB GETTEXT_PATH "${SUMO_LIBRARIES}/gettext-?.??")
317
file(GLOB ARROW_PATH "${SUMO_LIBRARIES}/apache-arrow-??.?.?")
318
file(GLOB LZ4_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/lz4-?.??.?") # needed for Arrow
319
file(GLOB ZSTD_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/zstd-?.?.?") # needed for Arrow
320
file(GLOB BZIP2_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/bzip2-?.?.?") # needed for Arrow
321
file(GLOB THRIFT_PATH "${SUMO_LIBRARIES}/3rdPartyLibs/thrift-?.??.?") # needed for Arrow
322
# set all paths in prefix
323
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}")
324
# save in variable SUMO_LIBRARIES_DLL all paths to dll files
325
file(GLOB SUMO_LIBRARIES_DLL "${XERCES_PATH}/bin/*.dll"
326
"${PROJ_PATH}/bin/*.dll"
327
"${FOX_PATH}/bin/*.dll"
328
"${ZLIB_PATH}/bin/*.dll"
329
"${FREETYPE_PATH}/bin/*.dll"
330
"${GETTEXT_PATH}/bin/*.dll"
331
"${GDAL_PATH}/bin/*.dll"
332
"${ARROW_PATH}/bin/*.dll"
333
"${SUMO_LIBRARIES}/libspatialite-*/bin/*.dll"
334
"${SUMO_LIBRARIES}/geos-*/bin/*.dll"
335
"${SUMO_LIBRARIES}/3rdPartyLibs/bzip2-*/bin/*.dll"
336
"${SUMO_LIBRARIES}/3rdPartyLibs/curl-*/bin/*.dll"
337
"${SUMO_LIBRARIES}/3rdPartyLibs/libpng-*/bin/*.dll"
338
"${SUMO_LIBRARIES}/3rdPartyLibs/libssh2-*/bin/*.dll"
339
"${SUMO_LIBRARIES}/3rdPartyLibs/openssl-*/*.dll"
340
"${SUMO_LIBRARIES}/3rdPartyLibs/sqlite-*/*.dll"
341
"${SUMO_LIBRARIES}/3rdPartyLibs/tiff-*/bin/*.dll"
342
"${SUMO_LIBRARIES}/3rdPartyLibs/libxml2-*/bin/*.dll"
343
"${SUMO_LIBRARIES}/3rdPartyLibs/libiconv-*/bin/*.dll"
344
"${SUMO_LIBRARIES}/3rdPartyLibs/openssl-*/bin/*.dll"
345
"${SUMO_LIBRARIES}/3rdPartyLibs/sqlite-*/bin/*.dll"
346
"${SUMO_LIBRARIES}/3rdPartyLibs/freexl-*/bin/*.dll"
347
"${SUMO_LIBRARIES}/3rdPartyLibs/libexpat-*/bin/*.dll"
348
"${SUMO_LIBRARIES}/3rdPartyLibs/librttopo-*/bin/*.dll"
349
"${SUMO_LIBRARIES}/3rdPartyLibs/minizip-*/bin/*.dll"
350
"${SUMO_LIBRARIES}/3rdPartyLibs/thrift-*/bin/*.dll"
351
"${SUMO_LIBRARIES}/3rdPartyLibs/zstd-*/bin/*.dll"
352
"${SUMO_LIBRARIES}/3rdPartyLibs/lz4-*/bin/*.dll"
353
)
354
# check if MSVC dll runtimes have to be copied
355
if (INSTALL_DLL_RUNTIMES)
356
file(GLOB MSVC_DLLS "${SUMO_LIBRARIES}/runtimes/*.dll")
357
list(APPEND SUMO_LIBRARIES_DLL ${MSVC_DLLS})
358
endif(INSTALL_DLL_RUNTIMES)
359
if (MSVC_VERSION GREATER 1919)
360
# fmt in SUMOLibraries only works with MSVC 2019 and later
361
file(GLOB fmt_PATH "${SUMO_LIBRARIES}/fmt-??.?.?")
362
endif ()
363
# declare flag for use google test
364
set(USE_GOOGLETEST true)
365
# check if use google test
366
if (WIN32)
367
if (GNU_COMPILER AND NOT USE_MINGW_64BITS)
368
message(STATUS "Disabled Google Test in Mingw32")
369
set(USE_GOOGLETEST false)
370
elseif(CLANG_COMPILER)
371
message(STATUS "Disabled Google Test in Clang (Windows)")
372
set(USE_GOOGLETEST false)
373
endif ()
374
endif()
375
if (USE_GOOGLETEST)
376
file(GLOB GTEST_ROOT "${SUMO_LIBRARIES}/googletest-?.??.?")
377
message(STATUS "Found Google test: " ${GTEST_ROOT})
378
include_directories("${GTEST_ROOT}/include")
379
# set both google test library
380
set(GTEST_BOTH_LIBRARIES "${GTEST_ROOT}/lib/gtest.lib" "${GTEST_ROOT}/lib/gtest_main.lib")
381
# set google test DLLs
382
file(GLOB GTEST_DLL "${GTEST_ROOT}/bin/gtest*.dll")
383
set(GTEST_FOUND true)
384
endif ()
385
file(GLOB SWIG_EXECUTABLE "${SUMO_LIBRARIES}/swigwin-*/swig.exe")
386
file(GLOB MVN_EXECUTABLE "${SUMO_LIBRARIES}/apache-maven-*/bin/mvn.cmd")
387
else ()
388
# for Linux and Mac only
389
find_package(GTest)
390
endif ()
391
392
find_package(XercesC REQUIRED)
393
if (XercesC_FOUND)
394
include_directories(SYSTEM ${XercesC_INCLUDE_DIRS})
395
endif (XercesC_FOUND)
396
397
find_package(Proj)
398
if (PROJ_FOUND)
399
include_directories(SYSTEM ${PROJ_INCLUDE_DIR})
400
set(ENABLED_FEATURES "${ENABLED_FEATURES} Proj")
401
endif (PROJ_FOUND)
402
403
find_package(FOX)
404
if (FOX_FOUND)
405
set(OpenGL_GL_PREFERENCE LEGACY)
406
find_package(OpenGL)
407
if (OPENGL_FOUND AND OPENGL_GLU_FOUND)
408
include_directories(SYSTEM ${FOX_INCLUDE_DIR})
409
add_definitions(${FOX_CXX_FLAGS})
410
add_definitions(-DFLOAT_MATH_FUNCTIONS)
411
set(HAVE_FOX 1)
412
set(ENABLED_FEATURES "${ENABLED_FEATURES} GUI")
413
else ()
414
message(WARNING "Fox is present but OpenGL or GLU cannot be found, GUI will be disabled.")
415
endif ()
416
endif (FOX_FOUND)
417
418
find_package(Freetype)
419
if (FREETYPE_FOUND)
420
include_directories(SYSTEM ${FREETYPE_INCLUDE_DIRS})
421
else (FREETYPE_FOUND)
422
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.")
423
endif (FREETYPE_FOUND)
424
425
if (SUMO_LIBRARIES AND WIN32)
426
find_package(fmt PATHS ${fmt_PATH} NO_DEFAULT_PATH)
427
if (fmt_FOUND)
428
message(STATUS "Found FMT (SUMOLibraries): " ${fmt_DIR})
429
include_directories(SYSTEM "${fmt_PATH}/include")
430
set(FMT_LIBRARY fmt::fmt)
431
set(HAVE_FMT 1)
432
set(ENABLED_FEATURES "${ENABLED_FEATURES} FMT")
433
endif (fmt_FOUND)
434
elseif (NOT MSVC)
435
find_package(fmt QUIET)
436
if (fmt_FOUND)
437
set(HAVE_FMT 1)
438
set(FMT_LIBRARY fmt::fmt)
439
# next 2 lines could fix the include path for mambaforge fmt on DLR machines (maybe outdated cmake?)
440
# get_target_property(fmt_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES)
441
# include_directories(SYSTEM ${fmt_INCLUDE_DIR})
442
set(ENABLED_FEATURES "${ENABLED_FEATURES} FMT")
443
endif (fmt_FOUND)
444
endif ()
445
446
find_package(X11)
447
if (X11_FOUND)
448
link_directories(${X11_LIBRARY_DIR})
449
include_directories(SYSTEM ${X11_INCLUDE_DIR})
450
endif (X11_FOUND)
451
452
find_package(ZLIB)
453
if (ZLIB_FOUND)
454
set(HAVE_ZLIB 1)
455
link_directories(${ZLIB_LIBRARY_DIR})
456
include_directories(SYSTEM ${ZLIB_INCLUDE_DIR})
457
endif ()
458
459
find_package(Intl)
460
if (Intl_FOUND)
461
set(HAVE_INTL 1)
462
link_directories(${Intl_LIBRARY_DIR})
463
include_directories(SYSTEM ${Intl_INCLUDE_DIRS})
464
set(ENABLED_FEATURES "${ENABLED_FEATURES} Intl")
465
endif ()
466
467
find_package(SWIG 3.0)
468
if (SWIG_FOUND)
469
set(ENABLED_FEATURES "${ENABLED_FEATURES} SWIG")
470
endif ()
471
472
if (TCMALLOC)
473
find_library(TCMALLOC_LIBRARY NAMES tcmalloc_minimal)
474
if (TCMALLOC_LIBRARY)
475
set(ENABLED_FEATURES "${ENABLED_FEATURES} tcmalloc")
476
else ()
477
set(TCMALLOC_LIBRARY "")
478
endif ()
479
endif ()
480
481
if (PARQUET)
482
set(lz4Alt_FIND_QUIETLY True)
483
set(re2Alt_FIND_QUIETLY True)
484
set(ThriftAlt_FIND_QUIETLY True)
485
# needed for parquet
486
find_package(Arrow)
487
find_package(Parquet)
488
if (Arrow_FOUND AND Parquet_FOUND)
489
set(HAVE_PARQUET 1)
490
set(ENABLED_FEATURES "${ENABLED_FEATURES} Parquet")
491
set(PARQUET_LIBRARY Parquet::parquet_shared)
492
include_directories(SYSTEM ${ARROW_INCLUDE_DIR})
493
# if (GTEST_FOUND)
494
# add_definitions("GTest_SOURCE=Bundled")
495
# endif()
496
# this is for gtest compatibility
497
else()
498
message(WARNING "Parquet support requested but Arrow or Parquet libraries not found. Disabling Parquet support.")
499
set(PARQUET_LIBRARY "")
500
endif()
501
else()
502
set(PARQUET_LIBRARY "")
503
set(HAVE_PARQUET 0)
504
endif()
505
506
# Eigen (for overhead wire / electric circuit simulation)
507
find_package(Eigen3 3.2)
508
if (EIGEN3_FOUND)
509
include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})
510
set(HAVE_EIGEN 1) # see config.h.cmake for #cmakedefine
511
set(ENABLED_FEATURES "${ENABLED_FEATURES} Eigen")
512
endif (EIGEN3_FOUND)
513
514
if (CHECK_OPTIONAL_LIBS)
515
file(GLOB GDAL_PATH "${SUMO_LIBRARIES}/gdal-?.?.?")
516
file(GLOB FFMPEG_PATH "${SUMO_LIBRARIES}/FFMPEG-?.?.?")
517
file(GLOB OSG_PATH "${SUMO_LIBRARIES}/OSG-?.?.?")
518
file(GLOB GL2PS_PATH "${SUMO_LIBRARIES}/gl2ps-?.?.?")
519
file(GLOB GEOS_PATH "${SUMO_LIBRARIES}/geos-?.??.?")
520
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${GDAL_PATH};${FFMPEG_PATH};${OSG_PATH};${GL2PS_PATH};${GEOS_PATH}")
521
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")
522
523
# GDAL (for geopositioning)
524
find_package(GDAL)
525
if (GDAL_FOUND)
526
include_directories(SYSTEM ${GDAL_INCLUDE_DIR})
527
set(HAVE_GDAL 1)
528
set(ENABLED_FEATURES "${ENABLED_FEATURES} GDAL")
529
else (GDAL_FOUND)
530
set(GDAL_LIBRARY "")
531
endif (GDAL_FOUND)
532
533
if (FOX_FOUND)
534
# FFMPEG (for recording videos)
535
find_package(FFMPEG)
536
if (FFMPEG_FOUND)
537
include_directories(SYSTEM ${FFMPEG_INCLUDE_DIR})
538
set(HAVE_FFMPEG 1)
539
set(ENABLED_FEATURES "${ENABLED_FEATURES} FFmpeg")
540
endif ()
541
542
# OSG (For 3D view)
543
find_package(OpenSceneGraph 3.4.0 COMPONENTS osgGA osgViewer osgUtil osgDB osgText)
544
if (OPENSCENEGRAPH_FOUND)
545
include_directories(SYSTEM ${OPENSCENEGRAPH_INCLUDE_DIRS})
546
set(HAVE_OSG 1)
547
set(ENABLED_FEATURES "${ENABLED_FEATURES} OSG")
548
endif ()
549
550
# GL2PS (deprecated, will be changed by FreeType)
551
find_package(GL2PS)
552
if (GL2PS_FOUND)
553
include_directories(SYSTEM ${GL2PS_INCLUDE_DIR})
554
set(HAVE_GL2PS 1)
555
set(ENABLED_FEATURES "${ENABLED_FEATURES} GL2PS")
556
endif (GL2PS_FOUND)
557
endif ()
558
559
find_package(jupedsim CONFIG HINTS ${JUPEDSIM_CUSTOMDIR} QUIET)
560
if (jupedsim_FOUND)
561
find_package(GEOS)
562
if (GEOS_FOUND)
563
include_directories(SYSTEM ${GEOS_INCLUDE_DIR})
564
set(JPS_VERSION "${jupedsim_VERSION_MAJOR}${jupedsim_VERSION_MINOR}${jupedsim_VERSION_PATCH}")
565
set(ENABLED_FEATURES "${ENABLED_FEATURES} JuPedSim")
566
message(STATUS "Found JuPedSim: ${jupedsim_DIR} ${jupedsim_VERSION}")
567
else (GEOS_FOUND)
568
message(STATUS "Could NOT find GEOS! JuPedSim requires GEOS.")
569
endif (GEOS_FOUND)
570
else (jupedsim_FOUND)
571
message(STATUS "Could NOT find JuPedSim! Skipping JuPedSim integration.")
572
endif (jupedsim_FOUND)
573
574
# add optional libraries
575
list(APPEND SUMO_LIBRARIES_DLL ${SUMO_OPTIONAL_LIBRARIES_DLL})
576
endif (CHECK_OPTIONAL_LIBS)
577
578
include_directories(${CMAKE_CURRENT_BINARY_DIR}/src)
579
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
580
581
set(commonlibs
582
utils_distribution utils_handlers utils_shapes utils_options
583
utils_xml utils_geom utils_common utils_importio utils_iodevices utils_traction_wire foreign_tcpip
584
${XercesC_LIBRARIES} ${ZLIB_LIBRARIES} ${PROJ_LIBRARY} ${Intl_LIBRARIES} ${FMT_LIBRARY} ${PARQUET_LIBRARY})
585
if (WIN32)
586
set(commonlibs ${commonlibs} ws2_32)
587
endif ()
588
if (PPROF)
589
set(commonlibs ${commonlibs} profiler)
590
endif ()
591
set(commonvehiclelibs
592
utils_emissions foreign_phemlight foreign_phemlight_V5 utils_vehicle ${commonlibs} ${FOX_LIBRARY})
593
594
# set custom name and folder for ALL_BUILD and ZERO_CHECK in visual studio solutions
595
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
596
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake")
597
598
# installation
599
if (MSVC)
600
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
601
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/sumo-${PACKAGE_VERSION}")
602
endif()
603
if (ISOLATED_BUILD)
604
set(SUMO_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin/)
605
else()
606
set(SUMO_BIN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/bin/)
607
endif()
608
install(DIRECTORY ${SUMO_BIN_DIR} DESTINATION bin
609
FILES_MATCHING
610
PATTERN "*.bat"
611
PATTERN "*.dll"
612
PATTERN "*d.dll" EXCLUDE
613
PATTERN "*_Debug.dll" EXCLUDE
614
PATTERN "gtest*.dll" EXCLUDE)
615
# files which end with "d" but are not debug
616
install(DIRECTORY ${SUMO_BIN_DIR} DESTINATION bin
617
FILES_MATCHING
618
PATTERN "thriftmd.dll"
619
PATTERN "zstd.dll")
620
else ()
621
include(GNUInstallDirs)
622
endif ()
623
if (SKBUILD OR MSVC)
624
set(DATA_PATH "")
625
else ()
626
set(DATA_PATH "share/sumo/")
627
endif ()
628
if (SKBUILD)
629
set(EXCLUDE_LIBSUMO "libsumo")
630
set(EXCLUDE_LIBTRACI "libtraci")
631
endif ()
632
install(DIRECTORY data/ DESTINATION ${DATA_PATH}data)
633
install(DIRECTORY tools/ DESTINATION ${DATA_PATH}tools
634
USE_SOURCE_PERMISSIONS
635
PATTERN "build_config/sumo" EXCLUDE # needed for the scikit build
636
PATTERN "calibration" EXCLUDE
637
PATTERN "lisum-core" EXCLUDE
638
PATTERN "lisum-gui" EXCLUDE
639
PATTERN "sumolib4matlab/src" EXCLUDE
640
PATTERN "${EXCLUDE_LIBSUMO}" EXCLUDE
641
PATTERN "${EXCLUDE_LIBTRACI}" EXCLUDE
642
PATTERN "traas" EXCLUDE
643
PATTERN "traci4matlab/src" EXCLUDE
644
PATTERN "__pycache__" EXCLUDE
645
PATTERN "*.pyc" EXCLUDE
646
PATTERN "*.egg-info" EXCLUDE
647
PATTERN ".git" EXCLUDE)
648
if (DATA_PATH)
649
install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../../bin \$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${DATA_PATH}bin)")
650
endif ()
651
652
install(EXPORT SUMOConfig DESTINATION ${DATA_PATH}cmake NAMESPACE SUMO::)
653
654
set(SUMO_TOOLS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tools")
655
if (NOT ${PYTHON_SETUPTOOLS_MISSING})
656
if (${PYTHON_BUILD_MISSING})
657
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} build_config/setup-sumolib.py clean --all install --root=\$ENV{DESTDIR}/ --prefix=${CMAKE_INSTALL_PREFIX} --optimize=1 WORKING_DIRECTORY ${SUMO_TOOLS_DIR})"
658
COMPONENT pysumolib)
659
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} build_config/setup-traci.py clean --all install --root=\$ENV{DESTDIR}/ --prefix=${CMAKE_INSTALL_PREFIX} --optimize=1 WORKING_DIRECTORY ${SUMO_TOOLS_DIR})"
660
COMPONENT pytraci)
661
else ()
662
if (NOT VERBOSE_SUB)
663
set(PYTHON_BUILD_OPTS "-C--quiet")
664
endif ()
665
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ./build_config/version.py ./build_config/setup-sumolib.py ./setup.py WORKING_DIRECTORY ${SUMO_TOOLS_DIR} COMMAND ${PYTHON_EXECUTABLE} -m build ${PYTHON_BUILD_OPTS} --wheel . -o ${CMAKE_BINARY_DIR})"
666
COMPONENT pysumolib)
667
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ./build_config/version.py ./build_config/setup-traci.py ./setup.py WORKING_DIRECTORY ${SUMO_TOOLS_DIR} COMMAND ${PYTHON_EXECUTABLE} -m build ${PYTHON_BUILD_OPTS} --wheel . -o ${CMAKE_BINARY_DIR})"
668
COMPONENT pytraci)
669
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} -m pip install --root=\$ENV{DESTDIR}/ --prefix=${CMAKE_INSTALL_PREFIX} -f ${CMAKE_BINARY_DIR} --no-index traci)"
670
COMPONENT pytraci)
671
endif ()
672
endif ()
673
674
if (SUMO_LIBRARIES AND WIN32)
675
# filter release DLLs
676
execute_process(COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/build_config/filterDebugDLL.py ${SUMO_LIBRARIES_DLL}
677
OUTPUT_VARIABLE SUMO_LIBRARIES_RELEASE_DLL)
678
if (ISOLATED_BUILD)
679
set(TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR})
680
else()
681
set(TARGET_DIR ${CMAKE_CURRENT_SOURCE_DIR})
682
endif()
683
# copy debug dlls
684
foreach(DLL_PATH ${SUMO_LIBRARIES_DLL} ${GTEST_DLL})
685
get_filename_component(DLL_BASENAME ${DLL_PATH} NAME)
686
set(TARGET_DLL ${TARGET_DIR}/bin/${DLL_BASENAME})
687
list(FIND TARGET_ALL_DLLS ${TARGET_DLL} DLL_KNOWN)
688
list(FIND SUMO_LIBRARIES_RELEASE_DLL ${DLL_PATH} IS_RELEASE_DLL)
689
list(FIND GTEST_DLL ${DLL_PATH} IS_TEST_DLL)
690
if (DLL_KNOWN EQUAL -1)
691
add_custom_command(OUTPUT ${TARGET_DLL}
692
COMMAND ${CMAKE_COMMAND} -E copy ${DLL_PATH} ${TARGET_DLL}
693
DEPENDS ${DLL_PATH})
694
if (IS_TEST_DLL GREATER -1)
695
list(APPEND TARGET_TEST_DLLS ${TARGET_DLL})
696
elseif (IS_RELEASE_DLL GREATER -1)
697
list(APPEND TARGET_ALL_DLLS ${TARGET_DLL})
698
else ()
699
list(APPEND TARGET_ALL_DLLS $<$<CONFIG:Debug>:${TARGET_DLL}>)
700
endif ()
701
endif()
702
endforeach(DLL_PATH)
703
# copy OSG dlls
704
if (HAVE_OSG)
705
file(GLOB OSG_PLUGIN_DLL "${OSG_PATH}/bin/osgPlugins*/osgdb_osg.dll")
706
get_filename_component(OSG_PLUGIN_DLL_BASENAME ${OSG_PLUGIN_DLL} NAME)
707
get_filename_component(OSG_PLUGIN_DIR ${OSG_PLUGIN_DLL} DIRECTORY)
708
get_filename_component(OSG_PLUGIN_DIR ${OSG_PLUGIN_DIR} NAME)
709
set(OSG_TARGET ${TARGET_DIR}/bin/${OSG_PLUGIN_DIR}/${OSG_PLUGIN_DLL_BASENAME})
710
add_custom_command(OUTPUT ${OSG_TARGET}
711
COMMAND ${CMAKE_COMMAND} -E copy_directory ${OSG_PATH}/bin/${OSG_PLUGIN_DIR} ${TARGET_DIR}/bin/${OSG_PLUGIN_DIR}
712
DEPENDS ${OSG_PLUGIN_DLL})
713
endif (HAVE_OSG)
714
if (PROJ_FOUND)
715
# proj 7 needs to copy "share/proj" folder in SUMO_HOME/share
716
set(PROJ_DATA ${TARGET_DIR}/share/proj/proj.db)
717
add_custom_command(OUTPUT ${PROJ_DATA}
718
COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJ_INCLUDE_DIR}/../share/proj ${TARGET_DIR}/share/proj
719
DEPENDS ${PROJ_INCLUDE_DIR}/../share/proj/proj.db)
720
install(DIRECTORY ${TARGET_DIR}/share/ DESTINATION ${DATA_PATH}share)
721
endif ()
722
endif()
723
# set install dll targets, for non-Windows they depend on nothing
724
add_custom_target(install_dll DEPENDS ${TARGET_ALL_DLLS} ${OSG_TARGET} ${PROJ_DATA})
725
add_custom_target(install_test_dll DEPENDS ${TARGET_TEST_DLLS})
726
set_property(TARGET install_dll PROPERTY FOLDER "CMake")
727
set_property(TARGET install_test_dll PROPERTY FOLDER "CMake")
728
729
# i18n target
730
find_package(Gettext)
731
if (Gettext_FOUND)
732
if (ISOLATED_BUILD)
733
set(LOCALE_DIR ${CMAKE_BINARY_DIR}/data)
734
install(DIRECTORY ${LOCALE_DIR}/locale/ DESTINATION ${DATA_PATH}data/locale)
735
else()
736
set(LOCALE_DIR ${CMAKE_SOURCE_DIR}/data)
737
endif()
738
set(I18N_DATA ${LOCALE_DIR}/locale/tr/LC_MESSAGES/sumo.mo)
739
add_custom_command(OUTPUT ${I18N_DATA}
740
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/build_config/i18n.py -m -o ${LOCALE_DIR}
741
DEPENDS ${CMAKE_SOURCE_DIR}/data/po/tr_gui.po)
742
else ()
743
message(WARNING "Gettext tools not found, translation files will not be generated.")
744
endif()
745
add_custom_target(install_mo DEPENDS ${I18N_DATA})
746
747
# java targets
748
find_program(MVN_EXECUTABLE mvn)
749
if (NOT VERBOSE_SUB)
750
set(MVN_OPTS "-q")
751
endif ()
752
find_package(Java COMPONENTS Development)
753
if (MVN_EXECUTABLE AND Java_FOUND)
754
if (NOT DEFINED ENV{JAVA_HOME})
755
get_filename_component(JAVA_BIN ${Java_JAVAC_EXECUTABLE} DIRECTORY)
756
get_filename_component(JAVA_HOME ${JAVA_BIN} DIRECTORY)
757
set(MVN_COMMAND_PREFIX ${CMAKE_COMMAND} -E env JAVA_HOME=${JAVA_HOME})
758
set(MVN_REPO "-Dmaven.repo.local=${CMAKE_BINARY_DIR}/m2")
759
endif ()
760
add_custom_target(traas
761
COMMAND ${MVN_COMMAND_PREFIX} ${MVN_EXECUTABLE} ${MVN_REPO} ${MVN_OPTS} --batch-mode -f tools/contributed/traas/pom.xml clean install
762
COMMAND ${CMAKE_COMMAND} -E copy tools/contributed/traas/target/traas-1.1.jar bin/TraaS.jar
763
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
764
add_custom_target(lisum
765
COMMAND ${MVN_COMMAND_PREFIX} ${MVN_EXECUTABLE} ${MVN_REPO} ${MVN_OPTS} --batch-mode -f tools/contributed/lisum/pom.xml clean install
766
COMMAND ${CMAKE_COMMAND} -E copy tools/contributed/lisum/lisum-core/target/lisum-core-1.0.2.jar bin/lisum-core.jar
767
COMMAND ${CMAKE_COMMAND} -E copy tools/contributed/lisum/lisum-gui/target/lisum-gui-1.1.jar bin/lisum-gui.jar
768
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
769
add_dependencies(lisum traas)
770
set(JAVA_TARGETS traas lisum)
771
foreach (JAVAT ${JAVA_TARGETS})
772
set_property(TARGET ${JAVAT} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
773
set_property(TARGET ${JAVAT} PROPERTY FOLDER "java")
774
endforeach ()
775
endif ()
776
777
# doc targets
778
add_custom_target(doxygen
779
COMMAND rm -rf docs/doxygen
780
COMMAND mkdir docs/doxygen
781
COMMAND doxygen sumo.doxyconf > doxygen.log 2>&1
782
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
783
set_property(TARGET doxygen PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
784
set_property(TARGET doxygen PROPERTY FOLDER "doc")
785
786
add_custom_target(userdoc
787
COMMAND ../../tools/build_config/buildPyDoc.py -p ../pydoc -c
788
COMMAND mkdocs build -d ../userdoc
789
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/web)
790
set_property(TARGET userdoc PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
791
set_property(TARGET userdoc PROPERTY FOLDER "doc")
792
793
if (MVN_EXECUTABLE)
794
add_custom_target(javadoc
795
COMMAND rm -rf docs/javadoc
796
COMMAND mkdir docs/javadoc
797
COMMAND ${MVN_EXECUTABLE} ${MVN_OPTS} --batch-mode -f tools/contributed/traas/pom.xml javadoc:javadoc
798
COMMAND mv tools/contributed/traas/target/site/apidocs docs/javadoc/traas
799
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
800
set_property(TARGET javadoc PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
801
set_property(TARGET javadoc PROPERTY FOLDER "doc")
802
set(JAVADOC_TARGET javadoc)
803
endif ()
804
805
find_program(HELPMAN_EXECUTABLE help2man)
806
if (HELPMAN_EXECUTABLE)
807
add_custom_target(man
808
COMMAND rm -rf docs/man
809
COMMAND mkdir docs/man
810
COMMAND ${HELPMAN_EXECUTABLE} -N -n "A microscopic, multi-modal traffic simulation" bin/sumo > docs/man/sumo.1
811
COMMAND ${HELPMAN_EXECUTABLE} -N -n "GUI version of the simulation SUMO" bin/sumo-gui > docs/man/sumo-gui.1
812
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Builds vehicle routes for SUMO using detector values" bin/dfrouter > docs/man/dfrouter.1
813
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Shortest path router and DUE computer for the microscopic traffic simulation SUMO" bin/duarouter > docs/man/duarouter.1
814
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Router for the microscopic traffic simulation SUMO based on junction turning ratios" bin/jtrrouter > docs/man/jtrrouter.1
815
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Import O/D-matrices and trips using macroscopic traffic assignment for SUMO" bin/marouter > docs/man/marouter.1
816
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Generates routes of persons throughout a day for the microscopic traffic simulation SUMO" bin/activitygen > docs/man/activitygen.1
817
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Importer of O/D-matrices for the traffic simulation SUMO" bin/od2trips > docs/man/od2trips.1
818
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Road network importer / builder for the traffic simulation SUMO" bin/netconvert > docs/man/netconvert.1
819
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Road network editor for the traffic simulation SUMO" bin/netedit > docs/man/netedit.1
820
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Road network generator for the microscopic traffic simulation SUMO" bin/netgenerate > docs/man/netgenerate.1
821
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Importer of polygons and POIs for the traffic simulation SUMO" bin/polyconvert > docs/man/polyconvert.1
822
COMMAND ${HELPMAN_EXECUTABLE} -N -n "TraCITestClient for the traffic simulation SUMO" bin/TraCITestClient > docs/man/TraCITestClient.1
823
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Builds and writes an emissions map for SUMO\\\'s emission models" bin/emissionsMap > docs/man/emissionsMap.1
824
COMMAND ${HELPMAN_EXECUTABLE} -N -n "Computes emissions by driving a time line using SUMO\\\'s emission models" bin/emissionsDrivingCycle > docs/man/emissionsDrivingCycle.1
825
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
826
set_property(TARGET man PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
827
set_property(TARGET man PROPERTY FOLDER "doc")
828
set(MAN_TARGET man)
829
endif ()
830
831
add_custom_target(doc)
832
add_dependencies(doc doxygen userdoc ${JAVADOC_TARGET} ${MAN_TARGET})
833
set_property(TARGET doc PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
834
set_property(TARGET doc PROPERTY FOLDER "doc")
835
836
# coverage targets
837
if (COVERAGE)
838
find_program(LCOV_EXECUTABLE lcov)
839
if (LCOV_EXECUTABLE)
840
add_custom_target(lcov
841
COMMAND rm -rf docs/lcov
842
COMMAND mkdir docs/lcov
843
COMMAND ${LCOV_EXECUTABLE} -d . --capture --output-file docs/lcov/lcov.info
844
COMMAND ${LCOV_EXECUTABLE} --remove docs/lcov/lcov.info '/usr/*' --output-file docs/lcov/lcov.info
845
COMMAND genhtml -o docs/lcov/html docs/lcov/lcov.info
846
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
847
add_custom_target(lcov-reset
848
COMMAND ${LCOV_EXECUTABLE} -d . -z
849
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
850
else ()
851
message(WARNING "COVERAGE is enabled but lcov was not found.")
852
endif ()
853
endif ()
854
855
# testing
856
enable_testing()
857
add_subdirectory(src)
858
if (GTEST_FOUND)
859
add_subdirectory(unittest)
860
endif ()
861
862
# example and dist targets
863
add_custom_target(examples
864
COMMAND ${PYTHON_EXECUTABLE} tools/extractTest.py -x -f tests/examples.txt -p docs/examples/runAll.py
865
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
866
add_dependencies(examples sumo netconvert dfrouter duarouter jtrrouter)
867
set_property(TARGET examples PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
868
set_property(TARGET examples PROPERTY FOLDER "doc")
869
870
find_program(PYINSTALLER_FOUND "pyinstaller")
871
if (PYINSTALLER_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/tools/game/runner.spec)
872
add_custom_target(game
873
COMMAND pyinstaller --noconfirm ${CMAKE_SOURCE_DIR}/tools/game/runner.spec
874
)
875
endif()
876
877
add_test(exampletest ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/docs/examples/runAll.py)
878
find_package(Git)
879
if (GIT_FOUND)
880
add_custom_target(dist
881
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
882
COMMAND ${GIT_EXECUTABLE} archive --prefix sumo-${PACKAGE_VERSION}/ -o sumo-${PACKAGE_VERSION}.zip HEAD
883
COMMAND unzip -q sumo-${PACKAGE_VERSION}.zip
884
COMMAND rm -r sumo-${PACKAGE_VERSION}/tests
885
COMMAND cp -a docs/tutorial docs/examples sumo-${PACKAGE_VERSION}/docs
886
COMMAND find tools/contributed/saga/ tools/contributed/traci4matlab -type f | grep -v .git | xargs cp --parents --target-dir sumo-${PACKAGE_VERSION}
887
COMMAND mkdir sumo-${PACKAGE_VERSION}/include
888
COMMAND cp ${CMAKE_BINARY_DIR}/src/version.h sumo-${PACKAGE_VERSION}/include
889
COMMAND zip -rq sumo-src-${PACKAGE_VERSION}.zip sumo-${PACKAGE_VERSION}
890
COMMAND tar -czf sumo-src-${PACKAGE_VERSION}.tar.gz sumo-${PACKAGE_VERSION}
891
COMMAND cp -a docs/userdoc docs/pydoc docs/javadoc docs/man sumo-${PACKAGE_VERSION}/docs
892
COMMAND rm -r sumo-${PACKAGE_VERSION}/docs/web/docs/images
893
COMMAND ln -s ../../userdoc/images sumo-${PACKAGE_VERSION}/docs/web/docs/images
894
COMMAND tar -czf sumo_${PACKAGE_VERSION}.orig.tar.gz --exclude "*.jar" sumo-${PACKAGE_VERSION}
895
COMMAND rm -rf sumo-${PACKAGE_VERSION} sumo-${PACKAGE_VERSION}.zip
896
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
897
add_dependencies(dist examples doc ${JAVA_TARGETS})
898
set_property(TARGET dist PROPERTY FOLDER "CMake")
899
set_property(TARGET dist PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
900
901
add_custom_target(distcheck
902
COMMAND rm -rf sumo-${PACKAGE_VERSION}
903
COMMAND unzip -q sumo-src-${PACKAGE_VERSION}.zip
904
COMMAND cd sumo-${PACKAGE_VERSION} && mkdir _cmake_build _cmake_install && cd _cmake_build
905
&& cmake -DCMAKE_INSTALL_PREFIX=../_cmake_install -DCHECK_OPTIONAL_LIBS=${CHECK_OPTIONAL_LIBS} .. || (echo "ERROR: the cmake configuration failed." && false)
906
&& make -j8 || (echo "ERROR: the compilation failed." && false)
907
&& make test || (echo "ERROR: the test suite failed." && false)
908
&& make install || (echo "ERROR: the install target failed." && false)
909
COMMAND rm -rf sumo-${PACKAGE_VERSION}
910
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
911
add_dependencies(distcheck dist)
912
set_property(TARGET distcheck PROPERTY FOLDER "CMake")
913
set_property(TARGET distcheck PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
914
endif ()
915
message(STATUS "Enabled features: ${ENABLED_FEATURES}")
916
917