# This configuration is used to build and test on GitHub Actions only. # It is not the same configuration that is used by Google DeepMind to create release binaries. # The "official" binaries are built with Clang 13 on all platforms, and are linked against libc++ # on Linux. # # We set CMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF here to reduce build time. # It is highly recommended that this is set to ON for production builds. # TODO(matijak): Consider switching Windows to Ninja builds only, this configures slightly faster # and brings Windows in line with other OSes. Also we wouldn't need to specify the --config option # in the build step because Ninja doesn't support multiple configurations (unlike MSBuild). name: build on: push: paths-ignore: - "doc/**" - "**/README.md" pull_request: paths-ignore: - "doc/**" - "**/README.md" jobs: mujoco: strategy: fail-fast: false matrix: include: - os: ubuntu-24.04 label: "ubuntu-24.04-gcc-14" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=gcc-14 -DCMAKE_CXX_COMPILER:STRING=g++-14 -DCMAKE_EXE_LINKER_FLAGS:STRING=-Wl,--no-as-needed tmpdir: "/tmp" - os: ubuntu-24.04 label: "ubuntu-24.04-gcc-13" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=gcc-13 -DCMAKE_CXX_COMPILER:STRING=g++-13 -DCMAKE_EXE_LINKER_FLAGS:STRING=-Wl,--no-as-needed tmpdir: "/tmp" - os: ubuntu-22.04 label: "ubuntu-22.04-gcc-12" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=gcc-12 -DCMAKE_CXX_COMPILER:STRING=g++-12 -DCMAKE_EXE_LINKER_FLAGS:STRING=-Wl,--no-as-needed tmpdir: "/tmp" - os: ubuntu-22.04 label: "ubuntu-22.04-gcc-11" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=gcc-11 -DCMAKE_CXX_COMPILER:STRING=g++-11 -DCMAKE_EXE_LINKER_FLAGS:STRING=-Wl,--no-as-needed tmpdir: "/tmp" - os: ubuntu-22.04 label: "ubuntu-22.04-gcc-10" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=gcc-10 -DCMAKE_CXX_COMPILER:STRING=g++-10 -DCMAKE_EXE_LINKER_FLAGS:STRING=-Wl,--no-as-needed tmpdir: "/tmp" - os: ubuntu-24.04 label: "ubuntu-24.04-clang-18" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=clang-18 -DCMAKE_CXX_COMPILER:STRING=clang++-18 -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" - os: ubuntu-24.04 label: "ubuntu-24.04-clang-17" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=clang-17 -DCMAKE_CXX_COMPILER:STRING=clang++-17 -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" - os: ubuntu-24.04 label: "ubuntu-24.04-clang-16" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=clang-16 -DCMAKE_CXX_COMPILER:STRING=clang++-16 -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" - os: ubuntu-22.04 label: "ubuntu-22.04-clang-15" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=clang-15 -DCMAKE_CXX_COMPILER:STRING=clang++-15 -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" - os: ubuntu-22.04 label: "ubuntu-22.04-clang-14" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=clang-14 -DCMAKE_CXX_COMPILER:STRING=clang++-14 -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" - os: ubuntu-22.04 label: "ubuntu-22.04-clang-13" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=clang-13 -DCMAKE_CXX_COMPILER:STRING=clang++-13 -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" - os: macos-15 label: "macos-15-arm64" cmake_args: >- -G Ninja -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" - os: macos-15-large label: "macos-15-x86_64" cmake_args: >- -G Ninja -DMUJOCO_HARDEN:BOOL=ON tmpdir: "/tmp" - os: windows-2025 label: "windows-2025" cmake_args: >- -DCMAKE_SYSTEM_VERSION="10.0.26100.0" cmake_build_args: "-- -m" tmpdir: "C:/Temp" name: "${{ matrix.label }}" runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - name: Prepare Linux if: ${{ runner.os == 'Linux' }} run: bash ./.github/workflows/build_steps.sh prepare_linux - name: Prepare macOS if: ${{ runner.os == 'macOS' }} run: brew install ninja - uses: actions/setup-python@v4 with: python-version: "3.11" - name: Prepare Python shell: bash env: TMPDIR: ${{ matrix.tmpdir }} run: bash ./.github/workflows/build_steps.sh prepare_python - name: Setup Node.js for WASM bindings if: ${{ runner.os == 'Linux' && matrix.label != 'ubuntu-24.04-clang-18' }} uses: actions/setup-node@v4 with: node-version: '20' # Exclude platforms covered by the `wasm` job. - name: Install NPM Dependencies for WASM bindings if: ${{ runner.os == 'Linux' && matrix.label != 'ubuntu-24.04-clang-18' }} run: bash ./.github/workflows/build_steps.sh npm_ci # Exclude platforms covered by the `wasm` job. - name: Setup Emscripten for WASM bindings if: ${{ runner.os == 'Linux' && matrix.label != 'ubuntu-24.04-clang-18' }} run: bash ./.github/workflows/build_steps.sh setup_emsdk - name: Configure MuJoCo env: TMPDIR: ${{ matrix.tmpdir }} CMAKE_ARGS: ${{ matrix.cmake_args }} run: bash ./.github/workflows/build_steps.sh configure_mujoco - name: Build MuJoCo working-directory: build env: CMAKE_BUILD_ARGS: ${{ matrix.cmake_build_args }} run: bash ../.github/workflows/build_steps.sh build_mujoco - name: Copy in the correct VC runtime DLLs (workaround for actions/runner-images#10004) if: ${{ runner.os == 'Windows' }} working-directory: build shell: powershell run: | Copy-Item (Join-Path ` ((Get-ChildItem -Directory ` -Path "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Redist\MSVC\14.*" | Sort -Descending | Select-Object -First 1).FullName ) 'x64\Microsoft.VC143.CRT\*.dll') "bin\Release" - name: Test MuJoCo working-directory: build run: bash ../.github/workflows/build_steps.sh test_mujoco - name: Install MuJoCo working-directory: build run: bash ../.github/workflows/build_steps.sh install_mujoco - name: Copy plugins (POSIX) if: ${{ runner.os != 'Windows' }} working-directory: build env: TMPDIR: ${{ matrix.tmpdir }} run: bash ../.github/workflows/build_steps.sh copy_plugins_posix - name: Copy plugins (Windows) if: ${{ runner.os == 'Windows' }} working-directory: build env: TMPDIR: ${{ matrix.tmpdir }} run: bash ../.github/workflows/build_steps.sh copy_plugins_window - name: Configure samples working-directory: sample env: TMPDIR: ${{ matrix.tmpdir }} CMAKE_ARGS: ${{ matrix.cmake_args }} run: bash ../.github/workflows/build_steps.sh configure_samples - name: Build samples working-directory: sample/build run: cmake --build . --config=Release ${{ matrix.cmake_build_args }} - name: Configure simulate working-directory: simulate env: TMPDIR: ${{ matrix.tmpdir }} CMAKE_ARGS: ${{ matrix.cmake_args }} run: bash ../.github/workflows/build_steps.sh configure_simulate - name: Build simulate working-directory: simulate/build env: CMAKE_BUILD_ARGS: ${{ matrix.cmake_build_args }} run: bash ../../.github/workflows/build_steps.sh build_simulate # Exclude platforms covered by the `studio` job. # Exclude macos-15-x86_64 because we don't have a way maintain/develop the build locally. - name: Configure Studio if: ${{ matrix.label != 'windows-2025' && matrix.label != 'macos-15-arm64' && matrix.label != 'macos-15-x86_64' }} env: CMAKE_ARGS: ${{ matrix.cmake_args }} run: bash ./.github/workflows/build_steps.sh configure_studio # Exclude platforms covered by the `studio` job. # Exclude macos-15-x86_64 because we don't have a way maintain/develop the build locally. # TODO(haroonq): Fix Filament compilation for GCC<=12? - name: Build Studio if: ${{ matrix.label != 'windows-2025' && matrix.label != 'macos-15-arm64' && matrix.label != 'macos-15-x86_64' && matrix.label != 'ubuntu-22.04-gcc-10' && matrix.label != 'ubuntu-22.04-gcc-11' && matrix.label != 'ubuntu-22.04-gcc-12' }} run: bash ./.github/workflows/build_steps.sh build_studio - name: Make Python sdist shell: bash working-directory: python env: TMPDIR: ${{ matrix.tmpdir }} run: bash ../.github/workflows/build_steps.sh make_python_sdist - name: Build Python bindings if: ${{ runner.os != 'Windows' }} shell: bash working-directory: python/dist env: TMPDIR: ${{ matrix.tmpdir }} CMAKE_ARGS: ${{ matrix.cmake_args }} run: bash ../../.github/workflows/build_steps.sh build_python_bindings - name: Install Python bindings if: ${{ runner.os != 'Windows' }} shell: bash working-directory: python/dist env: TMPDIR: ${{ matrix.tmpdir }} run: bash ../../.github/workflows/build_steps.sh install_python_bindings - name: Test Python bindings if: ${{ runner.os != 'Windows' }} shell: bash env: MUJOCO_GL: disable TMPDIR: ${{ matrix.tmpdir }} run: bash ./.github/workflows/build_steps.sh test_python_bindings # Exclude platforms covered by the `wasm` job. - name: Build and Test WASM bindings if: ${{ runner.os == 'Linux' && matrix.label != 'ubuntu-24.04-clang-18' }} shell: bash run: bash ./.github/workflows/build_steps.sh build_test_wasm - name: Package MJX if: ${{ runner.os != 'Windows' }} shell: bash working-directory: mjx env: TMPDIR: ${{ matrix.tmpdir }} run: bash ../.github/workflows/build_steps.sh package_mjx - name: Install MJX if: ${{ runner.os != 'Windows' }} shell: bash working-directory: mjx env: TMPDIR: ${{ matrix.tmpdir }} run: bash ../.github/workflows/build_steps.sh install_mjx - name: Test MJX if: ${{ runner.os != 'Windows' }} shell: bash working-directory: mjx env: TMPDIR: ${{ matrix.tmpdir }} run: bash ../.github/workflows/build_steps.sh test_mjx - name: Notify team chat shell: bash env: GCHAT_API_URL: ${{ secrets.GCHAT_API }} JOB_URL: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" CHATMSG_AUTHOR_NAME: ${{ github.event.head_commit.author.name }} CHATMSG_AUTHOR_EMAIL: ${{ github.event.head_commit.author.email }} CHATMSG_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} CHATMSG_JOB_ID: ${{ matrix.label }} if: ${{ failure() && github.event_name == 'push' && env.GCHAT_API_URL != '' }} run: bash ./.github/workflows/build_steps.sh notify_team_chat # This job quickly determines if MuJoCo Studio is broken. studio: strategy: fail-fast: false matrix: include: - os: ubuntu-24.04 label: "ubuntu-24.04-clang-18-studio" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=clang-18 -DCMAKE_CXX_COMPILER:STRING=clang++-18 -DMUJOCO_HARDEN:BOOL=ON - os: windows-2025 label: "windows-2025-ninja-studio" cmake_args: >- -G Ninja -DCMAKE_SYSTEM_VERSION=10.0.26100.0 - os: macos-15 label: "macos-15-arm64-studio" cmake_args: >- -G Ninja -DCMAKE_CXX_FLAGS="-Wno-error=deprecated-declarations" -DMUJOCO_HARDEN:BOOL=ON name: "${{ matrix.label }}" runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - name: Prepare Windows (setup MSVC) if: ${{ runner.os == 'Windows' }} uses: ilammy/msvc-dev-cmd@v1 - name: Prepare Linux if: ${{ runner.os == 'Linux' }} run: bash ./.github/workflows/build_steps.sh prepare_linux - name: Configure Studio with legacy OpenGL rendering env: CMAKE_ARGS: ${{ matrix.cmake_args }} run: bash ./.github/workflows/build_steps.sh configure_studio_legacy_opengl - name: Build Studio with legacy OpenGL rendering run: bash ./.github/workflows/build_steps.sh build_studio - name: Configure Studio with Filament rendering env: CMAKE_ARGS: ${{ matrix.cmake_args }} run: bash ./.github/workflows/build_steps.sh configure_studio - name: Build Studio with Filament rendering run: bash ./.github/workflows/build_steps.sh build_studio - name: Notify team chat shell: bash env: GCHAT_API_URL: ${{ secrets.GCHAT_API }} JOB_URL: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" CHATMSG_AUTHOR_NAME: ${{ github.event.head_commit.author.name }} CHATMSG_AUTHOR_EMAIL: ${{ github.event.head_commit.author.email }} CHATMSG_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} CHATMSG_JOB_ID: ${{ matrix.label }} if: ${{ failure() && github.event_name == 'push' && env.GCHAT_API_URL != '' }} run: bash ./.github/workflows/build_steps.sh notify_team_chat # This job quickly determines if WASM bindings are broken. wasm: name: "ubuntu-24.04-clang-18-wasm" runs-on: ubuntu-24.04 env: label: "ubuntu-24.04-clang-18-wasm" cmake_args: >- -G Ninja -DCMAKE_C_COMPILER:STRING=clang-18 -DCMAKE_CXX_COMPILER:STRING=clang++-18 -DMUJOCO_HARDEN:BOOL=ON steps: - uses: actions/checkout@v3 - name: Setup Node.js for WASM bindings uses: actions/setup-node@v4 with: node-version: '20' - name: Prepare Linux if: ${{ runner.os == 'Linux' }} run: bash ./.github/workflows/build_steps.sh prepare_linux # For convenience run multiple build_steps functions in a single step. - name: Prepare, Build and Test WASM bindings env: CMAKE_ARGS: ${{ env.cmake_args }} run: | bash ./.github/workflows/build_steps.sh npm_ci bash ./.github/workflows/build_steps.sh setup_emsdk bash ./.github/workflows/build_steps.sh build_test_wasm - name: Notify team chat shell: bash env: GCHAT_API_URL: ${{ secrets.GCHAT_API }} JOB_URL: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" CHATMSG_AUTHOR_NAME: ${{ github.event.head_commit.author.name }} CHATMSG_AUTHOR_EMAIL: ${{ github.event.head_commit.author.email }} CHATMSG_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} CHATMSG_JOB_ID: ${{ env.label }} if: ${{ failure() && github.event_name == 'push' && env.GCHAT_API_URL != '' }} run: bash ./.github/workflows/build_steps.sh notify_team_chat