Build From Source
=================
We recommend developing EnvPool on Ubuntu 24.04. Release wheels are built for
Python 3.11-3.14 in ``manylinux_2_28_x86_64`` and
``manylinux_2_28_aarch64`` environments for Linux, on ``macos-14`` for
macOS, and on ``windows-2022`` for Windows.
We use `bazel `_ to build EnvPool. Comparing with
`pip `_, using Bazel to build python package with C++ .so
files has some advantages:
- Bazel allows us to build from source code, but no need to directly includes
the code in our repo;
- no need to write complex CMake files, especially with multiple third-party
dependencies;
- using Bazel for CI test pipeline can only run the test with modified part,
so that it can save a lot of time.
Install Bazelisk
----------------
Bazelisk is a version controller for Bazel. You can install it via
`npm `_
.. code-block:: bash
sudo apt install -y npm
npm install -g @bazel/bazelisk
or `golang `_ with version >= 1.16:
.. code-block:: bash
sudo apt install -y golang-go
export PATH=$HOME/go/bin:$PATH
go install github.com/bazelbuild/bazelisk@latest
ln -sf $HOME/go/bin/bazelisk $HOME/go/bin/bazel
.. note ::
For users in mainland China, please do the following step to install go and bazel:
1. Install golang >= 1.16 from other sites, e.g., https://studygolang.com/dl
2. Change go proxy: ``go env -w GOPROXY=https://goproxy.cn``
3. Install bazel from https://mirrors.huaweicloud.com/bazel/
.. code-block:: bash
wget https://studygolang.com/dl/golang/go1.18.1.linux-amd64.tar.gz
# then follow the instructions on golang official website
go env -w GOPROXY=https://goproxy.cn
wget https://mirrors.huaweicloud.com/bazel/8.6.0/bazel-8.6.0-linux-x86_64
chmod +x bazel-8.6.0-linux-x86_64
mkdir -p $HOME/go/bin
mv bazel-8.6.0-linux-x86_64 $HOME/go/bin/bazel
export PATH=$PATH:$HOME/go/bin # or write to .bashrc / .zshrc
# check if successfully installed
bazel
See `Issue #87 `_.
Install Other Dependencies
--------------------------
EnvPool source builds share a few common requirements across platforms:
- **Python >= 3.11**
- **Java 17**
- **Go >= 1.22** plus ``bazelisk`` / ``bazel``
- **SWIG**
- **Qt 5**
The default build and test shortcuts in this repo use **Bazel 8.6.0** via
``bazelisk``.
Linux (Ubuntu 24.04)
^^^^^^^^^^^^^^^^^^^^
EnvPool currently builds with the system GCC/G++ toolchain on Ubuntu 24.04. To
install the required development packages:
.. code-block:: bash
sudo apt install -y build-essential openjdk-17-jdk python3-dev \
python3-pip python-is-python3 golang-go cmake ninja-build swig qtbase5-dev \
qtdeclarative5-dev
# Some Bazel Qt rules still look for this legacy include path.
sudo ln -sf "$(qmake -query QT_INSTALL_HEADERS)" /usr/include/qt
macOS
^^^^^
Install the Xcode Command Line Tools first, then install the user-space
dependencies with Homebrew:
.. code-block:: bash
xcode-select --install
brew install go openjdk@17 cmake ninja swig qt@5
sudo ln -sf "$(brew --prefix cmake)/bin/cmake" /usr/local/bin/cmake
sudo ln -sf "$(brew --prefix ninja)/bin/ninja" /usr/local/bin/ninja
export PATH="$(brew --prefix openjdk@17)/bin:$PATH"
export BAZEL_RULES_QT_DIR="$(brew --prefix qt@5)"
Windows
^^^^^^^
Install the following before building from source:
- Visual Studio 2022 (or Build Tools 2022) with the **Desktop development with
C++** workload
- Git for Windows
- Java 17
- Go 1.22+
- Qt 5.15.2 with the ``msvc2019_64`` toolchain
Then install the remaining command-line dependencies and export the Bazel / Qt
environment variables:
.. code-block:: powershell
choco install -y cmake make ninja strawberryperl swig
$env:BAZEL_SH = "C:/Program Files/Git/usr/bin/bash.exe"
$env:QT_ROOT_DIR = "C:/Qt/5.15.2/msvc2019_64"
$env:BAZEL_RULES_QT_DIR = $env:QT_ROOT_DIR
$env:PATH = "$env:QT_ROOT_DIR\\bin;$env:PATH"
If you want to reproduce the Windows MuJoCo render validation from CI, install
Mesa software OpenGL as well and export:
.. code-block:: powershell
$env:ENVPOOL_DLL_DIR = "C:/mesa"
$env:GALLIUM_DRIVER = "llvmpipe"
$env:MESA_GL_VERSION_OVERRIDE = "4.5COMPAT"
EnvPool loads ``libglapi.dll``, ``libgallium_wgl.dll``, and
``opengl32.dll`` from ``ENVPOOL_DLL_DIR`` before the Windows MuJoCo render
tests and before the GLFW-backed render path.
Qt runtime in wheels
^^^^^^^^^^^^^^^^^^^^
Linux release wheels intentionally exclude the Qt shared libraries used by
Procgen (``libQt5Core.so.5`` and ``libQt5Gui.so.5``) from ``auditwheel``
repair. Bundling those libraries also pulls in a large Qt / ICU runtime stack,
so Procgen users on Linux should install the system Qt 5 runtime instead, for
example with ``apt install qtbase5-dev`` or ``dnf install qt5-qtbase``.
Windows release wheels currently bundle the Qt runtime DLLs required by
Procgen (``Qt5Core.dll`` and ``Qt5Gui.dll``) directly next to
``procgen_envpool.pyd``. End users installing the wheel do **not** need a
separate Qt installation at runtime on Windows.
Source builds still require a local Qt 5 installation so Bazel can compile and
link against Qt. Linux and macOS continue to rely on system Qt packages at
build time.
Install CUDA to enable XLA: see https://developer.nvidia.com/cuda-downloads
Install other dependencies: see
`Dockerfile `_.
Build Wheel
-----------
To build a release version, type:
.. code-block:: bash
cp third_party/pip_requirements/requirements-release.txt third_party/pip_requirements/requirements.txt
bazel run --config=release //:setup -- bdist_wheel
This creates a wheel under ``bazel-bin/setup.runfiles/envpool/dist``.
.. note ::
For users in mainland China:
- If you find ``pip install`` is quite slow to fetch 3rd-party libraries,
the solution is to uncomment ``extra_args`` in ``envpool/pip.bzl`` to
switch the pip source.
- If you find ``bazel build`` is quite slow to fetch 3rd-party libraries,
please refer https://docs.bazel.build/versions/main/external.html#using-proxies
.. code-block:: bash
export HTTP_PROXY=http://...
export HTTPS_PROXY=http://...
# then run the command to build
See `Issue #87 `_.
Use Shortcut
------------
We provide several shortcuts to make things easier.
.. code-block:: bash
# This will install bazelisk via golang, need sudo
make bazel-install
# This will verbose all compile commands to help debug
make bazel-debug
# This will build python wheel (.whl) file under `dist/` folder
make bazel-build
# This will automatically run the tests
make bazel-test
# On Windows, export ENVPOOL_DLL_DIR/GALLIUM_DRIVER/
# MESA_GL_VERSION_OVERRIDE first if you want MuJoCo render to use Mesa.
# This will generate a merged Python + C/C++ LCOV report
make bazel-coverage
# Normalize LCOV source paths before rendering HTML with genhtml
python3 scripts/coverage_summary.py \
--lcov bazel-out/_coverage/_coverage_report.dat \
--genhtml-lcov-file coverage/lcov.genhtml.info \
--repo-root "$PWD"
# This will build a wheel for release
make bazel-release
# This will install the built wheel and run the release smoke, including
# one render() call after reset() for the wheel smoke envs.
make release-test
Use Docker to Create Develop Environment
----------------------------------------
We also provide dockerfile for building such a container. To create a docker
develop environment, run
.. code-block:: bash
make docker-dev
The code is under ``/app``, and you can communicate with the host machine file
system via ``/host``.