Subject: [bug#59800] [PATCH 5/5] gnu: Add esmini.

From: Liliana Marie Prikler <[email-masked]>
Date: Sat, 3 Dec 2022 10:04:27 +0100

* gnu/packages/patches/esmini-no-clutter-log.patch: New file.
* gnu/packages/patches/esmini-use-pkgconfig.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add them here.
* gnu/packages/simulation.scm (esmini): New variable.
---
 gnu/local.mk                                  |   2 +
 .../patches/esmini-no-clutter-log.patch       |  30 +
 .../patches/esmini-use-pkgconfig.patch        | 541 ++++++++++++++++++
 gnu/packages/simulation.scm                   |  71 +++
 4 files changed, 644 insertions(+)
 create mode 100644 gnu/packages/patches/esmini-no-clutter-log.patch
 create mode 100644 gnu/packages/patches/esmini-use-pkgconfig.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 1bfbe28bde..8069cedcb6 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1075,6 +1075,8 @@ dist_patch_DATA =						\
   %D%/packages/patches/enjarify-setup-py.patch			\
   %D%/packages/patches/enlightenment-fix-setuid-path.patch	\
   %D%/packages/patches/erlang-man-path.patch			\
+  %D%/packages/patches/esmini-no-clutter-log.patch		\
+  %D%/packages/patches/esmini-use-pkgconfig.patch		\
   %D%/packages/patches/esmtp-add-lesmtp.patch		\
   %D%/packages/patches/eudev-rules-directory.patch		\
   %D%/packages/patches/exercism-disable-self-update.patch	\
diff --git a/gnu/packages/patches/esmini-no-clutter-log.patch b/gnu/packages/patches/esmini-no-clutter-log.patch
new file mode 100644
index 0000000000..0920244f78
--- /dev/null
+++ b/gnu/packages/patches/esmini-no-clutter-log.patch
@@ -0,0 +1,30 @@
+Don't clutter /tmp with logs.
+
+---
+ EnvironmentSimulator/Modules/CommonMini/CommonMini.cpp | 10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
+
+diff --git a/EnvironmentSimulator/Modules/CommonMini/CommonMini.cpp b/EnvironmentSimulator/Modules/CommonMini/CommonMini.cpp
+index 56c655dc..2750f5a6 100644
+--- a/EnvironmentSimulator/Modules/CommonMini/CommonMini.cpp
++++ b/EnvironmentSimulator/Modules/CommonMini/CommonMini.cpp
+@@ -1013,14 +1013,8 @@ void Logger::OpenLogfile(std::string filename)
+ 		file_.open(filename.c_str());
+ 		if (file_.fail())
+ 		{
+-			const char* filename_tmp = std::tmpnam(NULL);
+-			printf("Cannot open log file: %s in working directory. Trying system tmp-file: %s\n",
+-				SE_Env::Inst().GetLogFilePath().c_str(), filename_tmp);
+-			file_.open(filename_tmp);
+-			if (file_.fail())
+-			{
+-				printf("Also failed to open log file: %s. Continue without logfile, still logging to console.\n", filename_tmp);
+-			}
++			printf("Cannot open log file: %s in working directory. Continuing without logfile, still logging to console.\n",
++				filename.c_str());
+ 		}
+ 	}
+ #endif
+-- 
+2.38.1
+
diff --git a/gnu/packages/patches/esmini-use-pkgconfig.patch b/gnu/packages/patches/esmini-use-pkgconfig.patch
new file mode 100644
index 0000000000..73e1b50015
--- /dev/null
+++ b/gnu/packages/patches/esmini-use-pkgconfig.patch
@@ -0,0 +1,541 @@
+Find dependencies via pkg-config.
+
+---
+ CMakeLists.txt                                |  16 +-
+ .../Applications/esmini-dyn/CMakeLists.txt    |   5 +-
+ .../Applications/esmini/CMakeLists.txt        |   1 +
+ EnvironmentSimulator/CMakeLists.txt           | 296 +-----------------
+ .../Modules/Controllers/ControllerSumo.cpp    |   1 -
+ .../Modules/RoadManager/CMakeLists.txt        |   8 +-
+ .../Modules/ScenarioEngine/CMakeLists.txt     |  15 +-
+ 7 files changed, 23 insertions(+), 319 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 156d9448..10ec48f9 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -8,6 +8,7 @@ else()
+   cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
+ endif()
+ 
++include(FindPkgConfig)
+ 
+ project (EnvironmentSimulator)
+ 
+@@ -33,15 +34,10 @@ else ()
+   set (LINUX false)
+ endif ()
+ 
+-if (LINUX OR APPLE OR MINGW OR MSVC)
+-  set(INSTALL_DIRECTORY "${CMAKE_HOME_DIRECTORY}/bin")
+-else ()
+-  message(FATAL_ERROR "Unrecognized platform therefore there isn't an installation directory. Stopping the cmake process.")
+-endif ()
+-
+ set(INSTALL_DIRECTORY_CODE_EXAMPLES "${CMAKE_HOME_DIRECTORY}/code-examples-bin")
+ 
+-set(PUGIXML_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/externals/pugixml")
++find_package(pugixml)
++
+ set(EXPR_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/externals/expr")
+ if(MSVC)
+     set(DIRENT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/externals/dirent/win")
+@@ -61,10 +57,14 @@ set(ENABLE_SANITIZERS False CACHE BOOL "Enable sanitizers (Only valid for Linux
+ 
+ 
+ if (USE_OSG)
++  pkg_check_modules(OSG REQUIRED openscenegraph osgdb_jpeg osgdb_osg
++                                 osgdb_serializers_osg
++                                 osgdb_serializers_osgsim)
+   add_definitions(-D_USE_OSG)
+ endif (USE_OSG)
+ 
+ if (USE_OSI)
++  find_package(open_simulation_interface REQUIRED)
+   add_definitions(-D_USE_OSI)
+ endif (USE_OSI)
+ 
+@@ -73,6 +73,7 @@ if (USE_SUMO)
+ endif (USE_SUMO)
+ 
+ if (USE_GTEST)
++  find_package(GTest REQUIRED)
+   add_definitions(-D_USE_GTEST)
+ endif (USE_GTEST)
+ 
+@@ -90,5 +91,4 @@ if( NOT EXISTS "test/OSC-ALKS-scenarios/.git" )
+ endif()
+ 
+ # Add variables to global scope, e.g. when esmini is used as submodule
+-set(PUGIXML_INCLUDE_DIR ${PUGIXML_INCLUDE_DIR} CACHE INTERNAL "")
+ set(EXPR_INCLUDE_DIR ${EXPR_INCLUDE_DIR} CACHE INTERNAL "")
+diff --git a/EnvironmentSimulator/Applications/esmini-dyn/CMakeLists.txt b/EnvironmentSimulator/Applications/esmini-dyn/CMakeLists.txt
+index 83d89420..e15062d3 100644
+--- a/EnvironmentSimulator/Applications/esmini-dyn/CMakeLists.txt
++++ b/EnvironmentSimulator/Applications/esmini-dyn/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ 
+ include_directories (
+   ${SCENARIOENGINE_DLL_INCLUDE_DIR}
+-  ${COMMON_MINI_INCLUDE_DIR}  
++  ${COMMON_MINI_INCLUDE_DIR}
+   ${OSI_INCLUDE_DIR}
+ )
+ 
+@@ -19,11 +19,12 @@ link_directories( ${OSI_DIR}/lib )
+ add_executable ( ${TARGET} ${SOURCES} ${INCLUDES} )
+ 
+ 
+-target_link_libraries ( 
++target_link_libraries (
+ 	${TARGET}
+ 	esminiLib
+ 	CommonMini
+ 	${TIME_LIB}
++        pugixml::pugixml
+   project_options
+ )
+ 
+diff --git a/EnvironmentSimulator/Applications/esmini/CMakeLists.txt b/EnvironmentSimulator/Applications/esmini/CMakeLists.txt
+index 6890c26a..a088ebdc 100644
+--- a/EnvironmentSimulator/Applications/esmini/CMakeLists.txt
++++ b/EnvironmentSimulator/Applications/esmini/CMakeLists.txt
+@@ -44,6 +44,7 @@ target_link_libraries (
+ 	${sumo_libs}
+ 	${TIME_LIB}
+     ${SOCK_LIB}
++    pugixml::pugixml
+     project_options
+ )
+ 
+diff --git a/EnvironmentSimulator/CMakeLists.txt b/EnvironmentSimulator/CMakeLists.txt
+index 157e8fe0..e771231a 100644
+--- a/EnvironmentSimulator/CMakeLists.txt
++++ b/EnvironmentSimulator/CMakeLists.txt
+@@ -1,7 +1,3 @@
+-
+-set ( FILE_STORAGE "esmini" ) # "dropbox", "google", "esmini"  (limited GB/Day)
+-set ( MODEL_STORAGE "esmini" ) # "dropbox", "google", "esmini"  (limited GB/Day)
+-
+ set ( VIEWER_BASE_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Modules/ViewerBase" )
+ set ( PLAYER_BASE_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Modules/PlayerBase" )
+ set ( ROADMANAGER_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Modules/RoadManager" )
+@@ -17,88 +13,12 @@ set ( CONTROLLERS_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Modules/Controllers")
+ 
+ # OpenSceneGraph package adapted for this project
+ set ( OSG_VERSION "osg161" )
+-set ( OSG_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../externals/OpenSceneGraph" )
+-set ( OSI_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../externals/OSI" )
+-set ( SUMO_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../externals/SUMO" )
+ 
+ # GoogleTest package
+ set ( GTEST_VERSION "1.10.1" )
+-set ( GTEST_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../externals/googletest" )
+ 
+ set( CMAKE_VERBOSE_MAKEFILE true )
+ 
+-if ( ${FILE_STORAGE} STREQUAL "dropbox" )
+-    if (APPLE)
+-        set ( OSG_PACKAGE_URL https://www.dropbox.com/s/d0czj6b89p9jyvv/OpenSceneGraph_mac.7z?dl=1 )
+-        set ( OSI_PACKAGE_URL https://www.dropbox.com/s/m62v19gp0m73dte/osi_mac.7z?dl=1 )
+-        set ( SUMO_PACKAGE_URL https://www.dropbox.com/s/0x8kwztk7nmacs1/sumo_mac.7z?dl=1 )
+-    elseif (LINUX)
+-        set ( OSG_PACKAGE_URL https://www.dropbox.com/s/4ug0gmkgdavzyb4/osg_linux_glibc_2_31_gcc_7_5_0.7z?dl=1 )
+-        set ( OSI_PACKAGE_URL https://dl.dropboxusercontent.com/s/kwtdg0c1c8pawa1/osi_linux.7z?dl=1 )
+-        set ( SUMO_PACKAGE_URL https://dl.dropboxusercontent.com/s/gfwtqd3gf76f86a/sumo_linux.7z?dl=1 )
+-        set ( GTEST_PACKAGE_URL https://dl.dropboxusercontent.com/s/si7jsjjsy5bpoym/googletest_linux.7z?dl=1 )
+-    elseif (MSVC)
+-        set ( OSG_PACKAGE_URL https://dl.dropboxusercontent.com/s/e95hnoo782p40uc/OpenSceneGraph_v10.7z?dl=1 )
+-        set ( OSI_PACKAGE_URL https://dl.dropboxusercontent.com/s/an58ckp2qfx5069/osi_v10.7z?dl=1 )
+-        set ( SUMO_PACKAGE_URL https://dl.dropboxusercontent.com/s/5jtpnnd61wonxuh/sumo_v10.7z?dl=1 )
+-        set ( GTEST_PACKAGE_URL https://dl.dropboxusercontent.com/s/aaiehwzc6woqbc6/googletest_v10.7z?dl=1 )
+-    elseif (MINGW)
+-        message("MinGW, enforcing slimmed esmini")
+-    else ()
+-        message ("Unsupported configuration")
+-    endif ()
+-elseif ( ${FILE_STORAGE} STREQUAL "google" )
+-    if (APPLE)
+-        set ( OSG_PACKAGE_URL https://drive.google.com/u/1/uc?id=1mfn_vrcXBoFBekR_t8RXTWB4sD59JD7p&export=download )
+-        set ( OSI_PACKAGE_URL https://drive.google.com/u/1/uc?id=1UVzO8cPQaDU9KVn9v2v8Suj0uUw1dzYI&export=download )
+-        set ( SUMO_PACKAGE_URL https://drive.google.com/u/1/uc?id=1FAve0-MlJPv6lUZy0HvriZI7xstLAzvX&export=download )
+-    elseif (LINUX)
+-        set ( OSG_PACKAGE_URL https://drive.google.com/u/1/uc?id=1Ya1bLp_0-qqlhs67WAwbGW7l37wqP3o2&export=download )
+-        set ( OSI_PACKAGE_URL https://drive.google.com/u/1/uc?id=1Q8O9YciIC0BPEszIKtQ2UW9KcVRZS4iB&export=download )
+-        set ( SUMO_PACKAGE_URL https://drive.google.com/u/1/uc?id=1m4znxNIXapP0D-l21oIm2l7L5ti-JbZH&export=download )
+-        set ( GTEST_PACKAGE_URL https://drive.google.com/u/1/uc?id=1Hyr9eJX2GmgpYwZhx14xOoXlZ2j-FY_p&export=download )
+-    elseif (MSVC)
+-        set ( OSG_PACKAGE_URL https://drive.google.com/u/1/uc?id=1RTag0aUn_pJPK697j0-E72ABW10wZvOm&export=download )
+-        set ( OSI_PACKAGE_URL https://drive.google.com/u/1/uc?id=1pcQcVHUESOk2Wmi-zUA7uzdxxE6iwRJx&export=download )
+-        set ( SUMO_PACKAGE_URL https://drive.google.com/u/1/uc?id=18PhbSLyvs0IGWTAY3YBoYzpVnMFPbOuR&export=download )
+-        set ( GTEST_PACKAGE_URL https://drive.google.com/u/1/uc?id=1So-3gtrmEdW9RhEvVQisj1QFksHM_otU&export=download )
+-    elseif (MINGW)
+-        message("MinGW, enforcing slimmed esmini")
+-    else ()
+-        message ("Unsupported configuration")
+-    endif ()
+-elseif ( ${FILE_STORAGE} STREQUAL "esmini" )
+-    if (APPLE)
+-        set ( OSG_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/OpenSceneGraph_mac.7z )
+-        set ( OSI_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/osi_mac.7z )
+-        set ( SUMO_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/sumo_mac.7z )
+-    elseif (LINUX)
+-        set ( OSG_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/osg_linux_glibc_2_31_gcc_7_5_0.7z )
+-        set ( OSI_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/osi_linux.7z )
+-        set ( SUMO_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/sumo_linux.7z )
+-        set ( GTEST_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/googletest_linux.7z )
+-    elseif (MSVC)
+-        set ( OSG_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/OpenSceneGraph_v10.7z )
+-        set ( OSI_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/osi_v10.7z )
+-        set ( SUMO_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/sumo_v10.7z )
+-        set ( GTEST_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD766065121/libs/googletest_v10.7z )
+-    elseif (MINGW)
+-        message("MinGW, enforcing slimmed esmini")
+-    else ()
+-        message ("Unsupported configuration")
+-    endif ()
+-else ()
+-    Message("Unknown storage type: " ${FILE_STORAGE})
+-endif()
+-
+-if ( ${MODEL_STORAGE} STREQUAL "dropbox" )
+-    set ( MODELS_PACKAGE_URL https://dl.dropboxusercontent.com/s/5gk8bvgzqiaaoco/models.7z?dl=0 )
+-elseif ( ${MODEL_STORAGE} STREQUAL "google" )
+-    set ( MODELS_PACKAGE_URL https://drive.google.com/u/1/uc?id=1c3cqRzwY41gWXbg0rmugQkL5I_5L6DH_&export=download )
+-elseif ( ${MODEL_STORAGE} STREQUAL "esmini" )
+-    set ( MODELS_PACKAGE_URL https://esmini.asuscomm.com/AICLOUD779364751/models/models.7z )
+-endif()
+-
+ if (APPLE)
+   set ( EXT_DIR_NAME "mac" )
+   set ( TIME_LIB "" )
+@@ -127,21 +47,8 @@ set ( OSI_DIR "${OSI_BASE_DIR}/${EXT_DIR_NAME}" )
+ set ( SUMO_DIR "${SUMO_BASE_DIR}/${EXT_DIR_NAME}" )
+ set ( GTEST_DIR "${GTEST_BASE_DIR}/${EXT_DIR_NAME}" )
+ 
+-set ( OSG_INCLUDE_DIR
+-    "${OSG_DIR}/build/include"
+-    "${OSG_DIR}/include"
+-)
+-set ( OSG_LIBRARIES_PATH
+-    "${OSG_DIR}/lib"
+-    "${OSG_DIR}/lib/osgPlugins-3.6.5"
+-)
+-
+ set ( OSI_INCLUDE_DIR "${OSI_DIR}/include" )
+-if (DYN_PROTOBUF)
+-  set ( OSI_LIBRARIES_PATH "${OSI_DIR}/lib-dyn" )
+-else ()
+-  set ( OSI_LIBRARIES_PATH "${OSI_DIR}/lib" )
+-endif (DYN_PROTOBUF)
++set ( OSI_LIBRARIES_PATH "${OSI_DIR}/lib" )
+ 
+ set ( SUMO_INCLUDE_DIR "${SUMO_DIR}/include" )
+ set ( SUMO_LIBRARIES_PATH "${SUMO_DIR}/lib" )
+@@ -153,74 +60,6 @@ link_directories(${OSG_LIBRARIES_PATH} ${OSI_LIBRARIES_PATH} ${SUMO_LIBRARIES_PA
+ 
+ if(APPLE)
+   SET(CMAKE_CXX_FLAGS "${CXX_STD_FLAG} -std=c++14 -pthread -fPIC -flto -DGL_SILENCE_DEPRECATION -Wl,-dead_strip")
+-  
+-  set ( OSG_LIBRARIES
+-    osg
+-    osgViewer
+-    osgDB
+-    osgdb_serializers_osgsim
+-    osgdb_serializers_osg
+-    osgGA
+-    osgText
+-    osgSim
+-    osgdb_osg
+-    osgdb_jpeg
+-    osgUtil
+-    osgAnimation
+-    osg
+-    OpenThreads
+-    jpeg
+-    "-framework OpenGL"
+-    "-framework Cocoa"
+-    dl
+-    z
+-  )
+-
+-  if (DYN_PROTOBUF)
+-    set ( OSI_LIBRARIES
+-      open_simulation_interface
+-      protobuf
+-    )
+-  else ()
+-    set ( OSI_LIBRARIES
+-      open_simulation_interface_pic
+-      protobuf
+-    )
+-  endif (DYN_PROTOBUF)
+-
+-
+-  set ( SUMO_LIBRARIES
+-    optimized libsumostatic debug libsumostaticd
+-    optimized netload debug netloadd
+-    optimized traciserver debug traciserverd
+-    optimized libsumostatic debug libsumostaticd
+-    optimized utils_vehicle debug utils_vehicled
+-    optimized utils_distribution debug utils_distributiond
+-    optimized utils_shapes debug utils_shapesd
+-    optimized utils_options debug utils_optionsd
+-    optimized utils_xml debug utils_xmld
+-    optimized utils_geom debug utils_geomd
+-    optimized utils_common debug utils_commond
+-    optimized utils_iodevices debug utils_iodevicesd
+-    optimized utils_traction_wire debug utils_traction_wired
+-    optimized utils_emissions debug utils_emissionsd
+-    optimized microsim_engine debug microsim_engined
+-    optimized microsim_lcmodels debug microsim_lcmodelsd
+-    optimized microsim_devices debug microsim_devicesd
+-    optimized microsim_trigger debug microsim_triggerd
+-    optimized microsim_output debug microsim_outputd
+-    optimized microsim_transportables debug microsim_transportablesd
+-    optimized microsim_actions debug microsim_actionsd
+-    optimized microsim_traffic_lights debug microsim_traffic_lightsd
+-    optimized microsim debug microsimd
+-    optimized mesosim debug mesosimd
+-    optimized foreign_phemlight debug foreign_phemlightd
+-    optimized foreign_tcpip debug foreign_tcpipd
+-    optimized microsim_cfmodels debug microsim_cfmodelsd
+-    optimized zlibstatic debug zlibstaticd
+-    optimized xerces-c_3 debug xerces-c_3D
+-    "-framework CoreServices"
+-  )
+ 
+ elseif(LINUX)
+ 
+@@ -251,82 +90,8 @@ elseif(LINUX)
+     SET(CMAKE_CXX_FLAGS "${CXX_STD_FLAG} -pthread -fPIC -Wl,-strip-all")
+   endif()
+ 
+-  set ( OSG_LIBRARIES
+-    optimized osg debug osgd
+-    optimized osgViewer debug osgViewerd
+-    optimized osgDB debug osgDBd
+-    optimized osgdb_serializers_osgsim debug osgdb_serializers_osgsimd
+-    optimized osgdb_serializers_osg debug osgdb_serializers_osgd
+-    optimized osgGA debug osgGAd
+-    optimized osgText debug osgTextd
+-    optimized osgSim debug osgSimd
+-    optimized osgdb_osg debug osgdb_osgd
+-    optimized osgdb_jpeg debug osgdb_jpegd
+-    optimized osgUtil debug osgUtild
+-    optimized osgAnimation debug osgAnimationd
+-    optimized osg debug osgd
+-    optimized OpenThreads debug OpenThreadsd
+-    optimized jpeg debug jpegd
+-
+-    GL
+-    X11
+-    Xrandr
+-    dl
+-    z
+-    Xinerama
+-    fontconfig
+-  )
+-
+-  if (DYN_PROTOBUF)
+-    set ( OSI_LIBRARIES
+-      optimized open_simulation_interface debug open_simulation_interfaced
+-      optimized protobuf debug protobufd
+-    )
+-  else ()
+-    set ( OSI_LIBRARIES
+-      optimized open_simulation_interface_pic debug open_simulation_interface_picd
+-      optimized protobuf debug protobufd
+-    )
+-  endif (DYN_PROTOBUF)
+-
+-  set ( SUMO_LIBRARIES
+-    optimized libsumostatic debug libsumostaticd
+-    optimized netload debug netloadd
+-    optimized traciserver debug traciserverd
+-    optimized libsumostatic debug libsumostaticd
+-    optimized utils_vehicle debug utils_vehicled
+-    optimized utils_distribution debug utils_distributiond
+-    optimized utils_shapes debug utils_shapesd
+-    optimized utils_options debug utils_optionsd
+-    optimized utils_xml debug utils_xmld
+-    optimized utils_geom debug utils_geomd
+-    optimized utils_common debug utils_commond
+-    optimized utils_iodevices debug utils_iodevicesd
+-    optimized utils_traction_wire debug utils_traction_wired
+-    optimized utils_emissions debug utils_emissionsd
+-    optimized microsim_engine debug microsim_engined
+-    optimized microsim_lcmodels debug microsim_lcmodelsd
+-    optimized microsim_devices debug microsim_devicesd
+-    optimized microsim_trigger debug microsim_triggerd
+-    optimized microsim_output debug microsim_outputd
+-    optimized microsim_transportables debug microsim_transportablesd
+-    optimized microsim_actions debug microsim_actionsd
+-    optimized microsim_traffic_lights debug microsim_traffic_lightsd
+-    optimized microsim debug microsimd
+-    optimized mesosim debug mesosimd
+-    optimized foreign_phemlight debug foreign_phemlightd
+-    optimized foreign_tcpip debug foreign_tcpipd
+-    optimized microsim_cfmodels debug microsim_cfmodelsd
+-    optimized zlibstatic debug zlibstaticd
+-    optimized xerces-c_3 debug xerces-c_3D
+-  )
+-
+-  set (GTEST_LIBRARIES
+-    optimized gmock debug gmockd
+-    optimized gmock_main debug gmock_maind
+-    optimized gtest debug gtestd
+-    optimized gtest_main debug gtest_maind
+-  )
++  set ( OSI_LIBRARIES open_simulation_interface::open_simulation_interface )
++  set ( SUMO_LIBRARIES sumocpp tracicpp )
+ 
+ elseif(MSVC)
+ 
+@@ -510,61 +275,6 @@ FOREACH(subdir ${SUBDIRS})
+     endif ()
+ ENDFOREACH()
+ 
+-
+-#
+-# Download library and content binary packets
+-#
+-
+-function (download_and_extract url target_folder target_filename)
+-    message (STATUS "downloading ${target_filename} ...")
+-    file (DOWNLOAD ${url} ${target_folder}/${target_filename} STATUS DOWNLOAD_STATUS)
+-
+-    if(DOWNLOAD_STATUS AND NOT DOWNLOAD_STATUS EQUAL 0)
+-        message(FATAL_ERROR "FAILED to download ${target_filename} (Status: ${DOWNLOAD_STATUS})")
+-    endif()
+-
+-    execute_process (COMMAND sleep 1)  # allow for file to be completely flushed
+-
+-    message (STATUS "extracting ${target_filename} ... ")
+-    execute_process (COMMAND ${CMAKE_COMMAND} -E tar xfz ${target_filename} WORKING_DIRECTORY ${target_folder} RESULT_VARIABLE STATUS)
+-
+-    if(STATUS AND NOT STATUS EQUAL 0)
+-        message(FATAL_ERROR "FAILED to unpack ${target_filename}")
+-    endif()
+-
+-    file (REMOVE ${target_folder}/${target_filename})
+-endfunction (download_and_extract)
+-
+-# download OpenSceneGraph
+-set ( OSG_PACKAGE_FILENAME "osg.7z" )
+-if (DEFINED OSG_DIR AND (FORCE_DOWNLOAD_BINARIES OR NOT EXISTS ${OSG_DIR} ))
+-    download_and_extract( ${OSG_PACKAGE_URL} ${OSG_BASE_DIR} ${OSG_PACKAGE_FILENAME} )
+-endif()
+-
+-# download OSI
+-set ( OSI_PACKAGE_FILENAME "osi.7z" )
+-if (DEFINED OSI_DIR AND (FORCE_DOWNLOAD_BINARIES OR NOT EXISTS ${OSI_DIR} ))
+-    download_and_extract( ${OSI_PACKAGE_URL} ${OSI_BASE_DIR} ${OSI_PACKAGE_FILENAME} )
+-endif()
+-
+-# download SUMO
+-set ( SUMO_PACKAGE_FILENAME "sumo.7z" )
+-if (DEFINED SUMO_DIR AND (FORCE_DOWNLOAD_BINARIES OR NOT EXISTS ${SUMO_DIR} ))
+-  download_and_extract( ${SUMO_PACKAGE_URL} ${SUMO_BASE_DIR} ${SUMO_PACKAGE_FILENAME} )
+-endif()
+-
+-# download googletest
+-if(NOT (APPLE OR MINGW))  # not available for Mac yet
+-  set ( GTEST_PACKAGE_FILENAME "googletest.7z" )
+-  if (DEFINED GTEST_DIR AND (FORCE_DOWNLOAD_BINARIES OR NOT EXISTS ${GTEST_DIR} ))
+-      download_and_extract( ${GTEST_PACKAGE_URL} ${GTEST_BASE_DIR} ${GTEST_PACKAGE_FILENAME} )
+-  endif()
+-endif()
+-
+-if (DEFINED MODELS_DIR AND (FORCE_DOWNLOAD_BINARIES OR NOT EXISTS ${MODELS_DIR} ))
+-    download_and_extract(${MODELS_PACKAGE_URL} ${MODELS_BASE_DIR} ${MODELS_PACKAGE_FILENAME})
+-endif()
+-
+ add_subdirectory(Applications/odrplot)
+ add_subdirectory(Applications/replayer)
+ 
+diff --git a/EnvironmentSimulator/Modules/Controllers/ControllerSumo.cpp b/EnvironmentSimulator/Modules/Controllers/ControllerSumo.cpp
+index 4c701d94..cb5de5bb 100644
+--- a/EnvironmentSimulator/Modules/Controllers/ControllerSumo.cpp
++++ b/EnvironmentSimulator/Modules/Controllers/ControllerSumo.cpp
+@@ -16,7 +16,6 @@
+ #include "ScenarioGateway.hpp"
+ #include "pugixml.hpp"
+ 
+-#include <utils/geom/PositionVector.h>
+ #include <libsumo/Simulation.h>
+ #include <libsumo/Vehicle.h>
+ #include <libsumo/TraCIDefs.h>
+diff --git a/EnvironmentSimulator/Modules/RoadManager/CMakeLists.txt b/EnvironmentSimulator/Modules/RoadManager/CMakeLists.txt
+index e4fad5f1..32d7a79c 100644
+--- a/EnvironmentSimulator/Modules/RoadManager/CMakeLists.txt
++++ b/EnvironmentSimulator/Modules/RoadManager/CMakeLists.txt
+@@ -2,7 +2,7 @@
+ include_directories (
+   ${PUGIXML_INCLUDE_DIR}
+   ${COMMON_MINI_INCLUDE_DIR}
+-  ${ROADMANAGER_INCLUDE_DIR}  
++  ${ROADMANAGER_INCLUDE_DIR}
+ )
+ 
+ set ( SOURCES
+@@ -11,8 +11,6 @@ set ( SOURCES
+   LaneIndependentRouter.cpp
+ )
+ 
+-set ( SRC_ADDITIONAL ../../../externals/pugixml/pugixml.cpp)
+-
+ SOURCE_GROUP("External Libraries" FILES ${SRC_ADDITIONAL})
+ 
+ set ( INCLUDES
+@@ -25,6 +23,6 @@ if(MSVC)
+ 	add_definitions("/wd4482")
+ endif()
+ 
+-add_library ( RoadManager STATIC ${SOURCES} ${SRC_ADDITIONAL} ${INCLUDES} )
++add_library ( RoadManager STATIC ${SOURCES} ${INCLUDES} )
+ 
+-target_link_libraries ( RoadManager CommonMini project_options)
+\ No newline at end of file
++target_link_libraries ( RoadManager CommonMini pugixml::pugixml project_options)
+diff --git a/EnvironmentSimulator/Modules/ScenarioEngine/CMakeLists.txt b/EnvironmentSimulator/Modules/ScenarioEngine/CMakeLists.txt
+index aec86ad6..86da77c1 100644
+--- a/EnvironmentSimulator/Modules/ScenarioEngine/CMakeLists.txt
++++ b/EnvironmentSimulator/Modules/ScenarioEngine/CMakeLists.txt
+@@ -5,7 +5,7 @@ include_directories (
+   ${ROADMANAGER_INCLUDE_DIR}
+   ${COMMON_MINI_INCLUDE_DIR}
+   ${CONTROLLERS_INCLUDE_DIR}
+-  ${REPLAY_INCLUDE_DIR}  
++  ${REPLAY_INCLUDE_DIR}
+   ${RDB_INCLUDE_DIR}
+   ${OSI_INCLUDE_DIR}
+   ${SUMO_INCLUDE_DIR}
+@@ -20,20 +20,15 @@ if (NOT USE_OSI)
+     list(REMOVE_ITEM SRC_SOURCEFILES "${CMAKE_CURRENT_LIST_DIR}/SourceFiles/OSIReporter.cpp")
+ endif (NOT USE_OSI)
+ 
+-set ( SRC_ADDITIONAL ../../../externals/pugixml/pugixml.cpp )
+-
+ SOURCE_GROUP(OSCTypeDefs FILES ${SRC_OSCTYPEDEFS})
+ SOURCE_GROUP("Source Files" FILES ${SRC_SOURCEFILES})
+ SOURCE_GROUP("External Libraries" FILES ${SRC_ADDITIONAL})
+ 
+-add_library ( ScenarioEngine STATIC 
+-  ${SRC_OSCTYPEDEFS} 
+-  ${SRC_SOURCEFILES} 
+-  ${SRC_ADDITIONAL} 
++add_library ( ScenarioEngine STATIC
++  ${SRC_OSCTYPEDEFS}
++  ${SRC_SOURCEFILES}
+ )
+ 
+ add_definitions(-D_CRT_SECURE_NO_WARNINGS)
+ 
+-target_link_libraries(ScenarioEngine PRIVATE project_options)
+-
+-	
++target_link_libraries(ScenarioEngine PRIVATE pugixml::pugixml project_options)
+-- 
+2.38.1
+
diff --git a/gnu/packages/simulation.scm b/gnu/packages/simulation.scm
index 4fdf99d9d4..6179d7a1ea 100644
--- a/gnu/packages/simulation.scm
+++ b/gnu/packages/simulation.scm
@@ -47,6 +47,7 @@ (define-module (gnu packages simulation)
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages protobuf)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-science)
@@ -289,6 +290,76 @@ (define-public python-open-simulation-interface
     (build-system python-build-system)
     (arguments '())))
 
+(define-public esmini
+  (package
+    (name "esmini")
+    (version "2.27.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/esmini/esmini")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (patches (search-patches "esmini-use-pkgconfig.patch"
+                                       "esmini-no-clutter-log.patch"))
+              (modules '((guix build utils) (ice-9 ftw)))
+              (snippet
+               #~(with-directory-excursion "externals"
+                   (for-each
+                    (lambda (dir) (unless (member dir '("." ".." "expr"))
+                               (delete-file-recursively dir)))
+                    (scandir "."))))
+              (sha256
+               (base32
+                "07ccydz7kxy5jc52f8fmxg4nkr1spshfnpzcv0wgd5lqz9ghjahz"))))
+    (build-system cmake-build-system)
+    (arguments
+     (list
+      #:configure-flags #~(list "-DDYN_PROTOBUF=TRUE")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'fix-cmake
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (substitute* "CMakeLists.txt"
+                (("\\$\\{CMAKE_HOME_DIRECTORY\\}/bin")
+                 (string-append (assoc-ref outputs "out") "/bin")))
+              (substitute* "EnvironmentSimulator/CMakeLists.txt"
+                (("\\$\\{OSI_DIR\\}/(include|lib)(-dyn)?" all what)
+                 (search-input-directory
+                  inputs
+                  (string-append what "/osi"
+                                 #$(version-major
+                                    (package-version
+                                     (this-package-input
+                                      "open-simulation-interface"))))))
+                (("\\$\\{SUMO_BASE_DIR\\}/\\$\\{EXT_DIR_NAME\\}")
+                 #$(this-package-input "sumo")))))
+          (replace 'check
+            (lambda* (#:key tests? #:allow-other-keys)
+              (with-directory-excursion "EnvironmentSimulator/Unittest/"
+                (for-each invoke (find-files "_test$")))))
+          (add-after 'install 'move-libraries
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let ((out (assoc-ref outputs "out")))
+                (mkdir-p (string-append out "/lib"))
+                (with-directory-excursion (string-append out "/bin")
+                  (for-each
+                   (lambda (f)
+                     (rename-file f (string-append out "/lib/"
+                                                   (basename f))))
+                   (find-files "." "\\.so$")))))))))
+    (inputs (list mesa
+                  openscenegraph `(,openscenegraph "pluginlib")
+                  open-simulation-interface
+                  protobuf pugixml sumo))
+    (native-inputs (list googletest pkg-config))
+    (home-page "https://github.com/esmini/esmini")
+    (synopsis "Basic OpenSCENARIO player")
+    (description "@command{esmini} is a tool to play OpenSCENARIO files.
+It is provided as both a standalone application and a shared library and has
+some support for generating and analysing traffic scenarios..")
+    (license license:mpl2.0)))
+
 (define-public python-fenics-dijitso
   (package
     (name "python-fenics-dijitso")
-- 
2.38.1