Linux 构建

本文档描述了如何从源代码在 Linux 上安装 SUMO。如果您不想扩展 SUMO,而仅仅是使用它,您可能更希望下载我们预先构建的二进制包

要在 Linux 上运行 SUMO,只需按照以下步骤操作:

  1. 安装所有必需的工具和库
  2. 获取源代码
  3. 构建 SUMO 二进制文件

对于 Ubuntu,这可以简化为:

sudo apt-get install git
git clone --recursive https://github.com/eclipse-sumo/sumo
cd sumo
export SUMO_HOME="$PWD"
sudo apt-get install $(cat build_config/build_req_deb.txt build_config/tools_req_deb.txt)
cmake -B build .
cmake --build build -j$(nproc)

Note

不要在活动的 Anaconda 环境中构建!这些库有时与 Anaconda 的版本不同,这会导致构建或可执行文件损坏。

下面将更详细地描述每个步骤,并提供可能的替代方案。

安装必需的工具和库#

  • 对于构建基础设施,您需要 cmake 以及较新的 g++(7 即可)或 clang++(或任何其他支持 C++17 的编译器)。
  • 也可以使用较旧的编译器构建 SUMO(至少 gcc 4.8),但不推荐,因为某些功能将被禁用。
  • 始终需要 Xerces-C 库。要使用 sumo-gui,您还需要 1.6.x 版本的 Fox Toolkit。强烈建议同时安装 Proj 以支持地理转换和引用。另一个常见的需求是从 shapefile (arcgis) 导入网络。这需要 GDAL 库。编译时,您需要所有软件包的 devel 版本。对于 openSUSE,这意味着安装 libxerces-c-devel、libproj-devel、libgdal-devel 和 fox16-devel。对于 Ubuntu,调用方式如上所示。安装 swig、python3-dev 和 jdk 还可以启用 libsumo 的构建,而 eigen3 是 overheadwire 模型所必需的。有一些过时的针对特定平台和手动构建库的说明
  • 可选地,您可能需要添加:
    • ccache(以加快构建速度)
    • ffmpeg-devel(用于视频输出)
    • libOpenSceneGraph-devel(用于实验性的 3D GUI)
    • gtest(用于单元测试,不要使用 1.13 或更高版本)
    • gettext(用于国际化)
    • texttest、xvfb 和 tkdiff(用于验收测试,texttest GUI 需要包含 python3-gobject)
    • flake、astyle 和 autopep 用于样式检查
    • 另请参见 GUI 测试的进一步依赖项

上面的软件包名称适用于 openSUSE,对于 Ubuntu,获取最重要可选库和工具的调用是:

sudo apt-get install ccache libavformat-dev libswscale-dev libopenscenegraph-dev python3-pip python3-build
sudo apt-get install libgtest-dev gettext tkdiff xvfb flake8 astyle python3-autopep8 python3-gi-cairo gir1.2-gtk-3.0
sudo apt-get install python3-pyproj python3-rtree python3-pandas python3-pulp python3-ezdxf
python3 -m pip install texttest

对于 Python 工具,根据您要使用的工具,还有一些额外的要求。如果您想使用 pip 安装所有内容,请执行 python3 -m pip install -r tools/requirements.txt -r tools/req_dev.txt

Parquet 支持#

参见 https://arrow.apache.org/install/

wget https://packages.apache.org/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
sudo apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
sudo apt update
sudo apt install -y -V libarrow-dev libparquet-dev

获取源代码#

为了正确设置 SUMO_HOME,您必须记住构建 SUMO 的正确路径,即 SUMO 构建路径。获取源代码后,该路径将通过 pwd 显示。如果您想积极开发 SUMO,我们强烈建议使用 git 仓库。如果您出于某种原因需要特定版本的 SUMO,请构建 tarball 版本。

仓库检出(推荐)#

应执行以下命令:

git clone --recursive https://github.com/eclipse-sumo/sumo
cd sumo
git fetch origin refs/replace/*:refs/replace/*
pwd

额外的 replacements 获取对于获取完整的本地项目历史记录是必要的。

发布版本或每日 tarball#

下载 sumo-src-1.25.0.tar.gzhttps://sumo.dlr.de/daily/sumo-src-git.tar.gz

tar xzf sumo-src-<version>.tar.gz
cd sumo-<version>/
pwd

定义 SUMO_HOME#

在编译之前,建议定义环境变量 SUMO_HOME。SUMO_HOME 必须设置为上一步中的 SUMO 构建路径。假设您将 SUMO 放在文件夹 " /home/<user>/sumo-<version>" 中,如果您只想为当前会话定义,请在控制台中键入:

export SUMO_HOME="/home/<user>/sumo-<version>"

如果您想为所有会话定义(即每次运行您的 Linux 发行版时),请转到您的 HOME 文件夹,并找到以下三个文件之一(取决于您的 Linux 发行版):.bash_profile.bash_login.profile(请注意,这些文件可能是隐藏的)。然后编辑该文件,在末尾添加上面的行并重新启动您的会话。

您可以键入以下命令检查 SUMO_HOME 是否已成功设置:

echo $SUMO_HOME

如果控制台显示 "/home/<user>/sumo-<version>",则表示设置成功。

为工具安装 Python 包#

从 netedit 调用工具需要一系列 Python 包来在编译期间生成模板。其中许多可能通过您发行版的包管理器提供,大多数时候我们更喜欢使用这些。对于 Ubuntu,目前这意味着您应该首先执行:

sudo apt-get install python3-pyproj python3-rtree python3-pandas flake8 python3-autopep8 python3-pulp python3-ezdxf

然后使用 pip 安装剩余部分:

python3 -m pip install -r tools/requirements.txt -r tools/req_dev.txt

pip 安装将确保所有库都存在,因此可以安全地跳过第一个 apt-get 步骤。如果您需要有关软件包最低要求版本的信息,请直接从 requirements.txt 中阅读。请注意,requirements 文件中的最低版本仅反映我们当前的测试服务器设置,因此您也可能使用更早的版本。

如果您想精确复制我们的测试服务器设置,请使用 req_test_server.txt 中的版本。不幸的是,一些旧的 pip 包不完整,因此这需要 sudo apt install libspatialindex-dev

使用 cmake 构建 SUMO 二进制文件#

使用 cmake 构建需要 3.5 或更高版本。

为 cmake 创建一个构建文件夹(在 SUMO 根文件夹中),并使用可用选项的完整集合(如 GDAL 和 OpenSceneGraph 支持,如果安装了这些库)来配置 SUMO:

cmake -B build .

要构建调试版本,只需使用:

cmake -D CMAKE_BUILD_TYPE=Debug -B build .

Note

在某些平台上,所需的 cmake 可执行文件名为 cmake3

其他有用的 cmake 配置选项:

  • -D PROFILING=ON 为 gprof 启用性能分析工具(仅限 gcc 构建)
  • -D COVERAGE=ON 为 lcov 启用覆盖率工具(仅限 gcc 构建)
  • -D CHECK_OPTIONAL_LIBS=OFF 禁用所有可选库(仅包含 EPL 兼容许可的代码)
  • -D CMAKE_BUILD_TYPE=RelWithDebInfo 启用调试符号以调试发布版本或使用不同的性能分析器
  • -D PROJ_LIBRARY= 禁用 PROJ
  • -D FOX_CONFIG= 禁用 Fox 工具包(GUI 和多线程)
  • -D PYTHON_EXECUTABLE=/usr/bin/python3 选择不同的 python 版本(也适用于 libsumo / libtraci)
  • -D MVN_EXECUTABLE= 禁用 maven 打包(如果您没有网络连接,这尤其有用)
  • -D ENABLE_CS_BINDINGS=ON 在编译 libsumo / libtraci 时启用 C# 绑定

完成后,运行:

cmake --build build -j $(nproc)

nproc 命令为您提供计算机上的逻辑内核数,因此 make 将启动并行构建作业,这使得构建速度大大加快。如果您的系统上没有 nproc,请在此处插入一个固定数字或省略该选项。您也可以尝试:

cmake --build build -j $(grep -c ^processor /proc/cpuinfo)

使用 clang 构建#

如果您想使用不同的编译器(只是为了好玩或因为它具有额外的功能),您可以在配置时启用它。我们当前的 clang 配置用于额外的静态代码检查,启用了以下 CXXFLAGS:

-stdlib=libstdc++ -fsanitize=undefined,address,integer -fno-omit-frame-pointer -fsanitize-blacklist=$SUMO_HOME/build_config/clang_sanitize_blacklist.txt

您当然可以省去所有您不想要的检查器检查,但必须设置 stdlib 选项。黑名单过滤掉了 cstdlib 中的一个已知错误。有关详细信息,请参阅 clang 文档。

当前的 CMake 配置已经为调试构建包含了此配置,因此要使用 CMake 和 clang 构建,只需切换到您的仓库基础目录并使用:

CXX=clang++ cmake -D CMAKE_BUILD_TYPE=Debug -B build .
cmake --build build -j $(nproc)

clang-debug-build 将检测内存泄漏(以及其他问题)。如果错误报告带有神秘的十六进制数字,例如:

Indirect leak of 72 byte(s) in 1 object(s) allocated from:
    #0 0xa4ee2d  (.../sumo/bin/netconvertD+0xa4ee2d)

请设置以下环境变量以指向 llvm-symbolizer 可执行文件: export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer 在运行可执行文件之前。

请注意,未定义行为检查器非常敏感,也会报告系统库中的一些假阴性。建议在调用可执行文件之前使用: export UBSAN_OPTIONS=suppressions=$SUMO_HOME/build_config/clang_ubsan_suppressions.txt

构建最小功能集#

许多项目功能是可选的。要测试最小设置,可以使用以下构建配置:

cmake -DFOX_CONFIG= -DPROJ_LIBRARY= -DCHECK_OPTIONAL_LIBS=OFF -DFMI=OFF -B build. 

安装 SUMO 二进制文件#

此(可选)步骤将 SUMO 二进制文件复制到另一个路径,以便之后您可以删除所有源文件和中间文件。如果您不想(或不需要)这样做,您可以简单地跳过此步骤并从 bin 子文件夹(bin/sumo-gui 和 bin/sumo)运行 SUMO。

如果您想将 SUMO 二进制文件安装到您的系统中,请运行:

sudo cmake --install build

您必须将 SUMO_HOME 变量调整为安装目录(通常是 /usr/local/share/sumo)

export SUMO_HOME=/usr/local/share/sumo

卸载#

CMake 不提供 make uninstall,因此如果您曾经想卸载,请运行:

sudo xargs rm < install_manifest.txt

从您运行 make install 的同一文件夹。这将留下一些空目录,因此如果您也想删除它们,请仔细检查 $SUMO_HOME 是否指向正确的目录(见上文)并运行:

sudo xargs rm -r $SUMO_HOME

为 sumolib、traci 和 libsumo 构建 Python wheels#

如果您想将 sumolib、traci 和/或 libsumo 作为 wheels 分发,您可以直接从工具树构建这些 wheel。请注意,这些软件包的每日构建也可在 https://test.pypi.org 上获取。

pip install wheel build
cd tools
python build_config/version.py build_config/setup-sumolib.py ./setup.py
python -m build --wheel
python build_config/version.py build_config/setup-traci.py ./setup.py
python -m build --wheel
python build_config/version.py build_config/setup-libsumo.py ./setup.py
python -m build --wheel

您需要最近版本的 pip (>=22) 才能工作。如果由于某种原因您无法更新 pip,您也可以使用(不推荐的!)直接调用 setup.py 的方法。

cd tools
python build_config/setup-sumolib.py bdist_wheel

请注意,您始终需要位于 tools 目录中才能工作,您的 wheels 将放置在 tools/dist 中。此外,traci 和 sumolib wheel 是平台和 Python 版本无关的,而 libsumo 取决于您构建它时的确切平台和 Python。

(频繁)重新构建#

如果您进行了仓库克隆,您只需在 SUMO_HOME 文件夹内执行 git pull 即可更新它。然后切换到构建目录并再次运行 make -j $(nproc)

如果您的底层系统发生了变化(更新了库)或遇到其他构建问题,请先尝试通过删除构建目录(或至少 CMakeCache.txt)并再次运行 cmake 和 make 来进行干净构建,然后再报告错误。

如果您发现自己在微小更改后经常构建,请考虑安装 ccache 并再次运行 cmake。它会被自动拾取,并可以显著提高构建速度。

如何构建 JuPedSim 并使用 JuPedSim 构建 SUMO#

在本节中,您将学习如何构建最新版本的行人模拟器 JuPedSim 以及如何使用此最新版本的 JuPedSim 编译 SUMO。首先,克隆 JuPedSim 仓库:

git clone https://github.com/PedestrianDynamics/jupedsim

请注意,这将克隆完整的仓库,包括 JuPedSim 的最新版本。我们强烈建议构建 JuPedSim 的最新版本(不是 master 分支),该版本由 SUMO 官方支持。 您可以查阅 JuPedSim 构建过程;在此我们提出一个类似的步骤。首先检查最新版本,然后在克隆的目录中检出最新版本并进行常规的 cmake 构建。例如,对于 JuPedSim 版本 v1.3.1,您需要键入:

cd jupedsim
git checkout v1.3.1
cmake -B build .
cmake --build build
sudo cmake --install build

现在您应该确保安装了 GEOS (sudo apt-get install libgeos-dev) 并继续上面的标准构建步骤

调整 JuPedSim 构建#

如果您不想将 jupedsim 安装到系统中,可以指定一个替代的安装目录,如下所示:

cmake -B build -DCMAKE_INSTALL_PREFIX=$PWD/../jupedsim-install .
cmake --build build
cmake --install build

这将把 jupedsim 安装在检出目录旁边的 jupedsim-install 目录中。如果您将 jupedsim 安装到系统中或安装在 sumo 旁边的 jupedsim-install 目录中,SUMO 的标准 cmake 调用会自动找到它。

请注意,如果您想将 sumo 安装到系统中,您也需要将 jupedsim 安装到系统中。要调整或调试 jupedsim 构建,您也可以将配置更改为 Debug(使用 -DCMAKE_BUILD_TYPE=Debug)并像往常一样使用 CMake 启用多线程(使用 -j4)。如果您有不同的 jupedsim 版本或选择不同的安装路径,您可以在调用 CMake 时设置 JUPEDSIM_CUSTOMDIR 来通知 CMake JuPedSim 的安装位置。

有关在 SUMO 内部使用 JuPedSim 的进一步说明,请查阅模型文档

故障排除#

套接子系统问题#

问题:

recv ./foreign/tcpip/libtcpip.a(socket.o) (symbol belongs to implicit dependency /usr/lib/libsocket.so.1)

解决方案: https://lists.danga.com/pipermail/memcached/2005-September/001611.html

ld 找不到现有库 (Fedora-23)#

问题:

/usr/bin/ld: cannot find -lfreetype
ls -lah /usr/lib64/libfreetype*
 lrwxrwxrwx. 1 root root   21 Jul 28 15:54 /usr/lib64/libfreetype.so.6 -> libfreetype.so.6.12.0
 lrwxr-xr-xr-x 1 root root 689K Jul 28 15:54 /usr/lib64/libfreetype.so.6.12.0

解决方案:安装 dev 包;对于 fedora:

sudo yum install freetype-devel

有关详细信息,请参阅 stackoverflow 讨论。

ld 在现有外部库中找不到某些函数#

确保您没有安装像 anaconda 这样的环境,它会修改您的库搜索路径。

Cygwin 用户的附加说明#

目前 GUI 构建仍然很麻烦。这取决于您是想使用 X-Server 还是原生 Windows GUI。我们只尝试了原生 Windows GUI,并且必须更改已安装的 libFOX-1.4.la,使其包含:

dependency_libs=' -lgdi32 -lglaux -ldl -lcomctl32 -lwsock32 -lwinspool -lmpr
-lpthread -lpng /usr/lib/libtiff.la /usr/lib/libjpeg.la -lz -lbz2 -lopengl32 -lglu32'

您的情况可能会有所不同。