dtool: make dlmalloc mmap-only to avoid sbrk/glibc heap corruption #30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Continuous Integration | |
| on: [push, pull_request] | |
| jobs: | |
| cmake: | |
| name: CMake Buildsystem | |
| if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')" | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| profile: | |
| - ubuntu-bionic-double-standard-unity-makefile | |
| - ubuntu-bionic-coverage-ninja | |
| - macos-coverage-unity-xcode | |
| - macos-nometa-standard-makefile | |
| - windows-standard-unity-msvc | |
| - windows-nopython-nometa-standard-msvc | |
| include: | |
| - profile: ubuntu-bionic-double-standard-unity-makefile | |
| os: ubuntu-24.04 | |
| config: Standard | |
| unity: YES | |
| generator: Unix Makefiles | |
| compiler: Default | |
| metalibs: YES | |
| python: YES | |
| eigen: NO | |
| double: YES | |
| asan: YES | |
| - profile: ubuntu-bionic-coverage-ninja | |
| os: ubuntu-24.04 | |
| config: Coverage | |
| unity: NO | |
| generator: Ninja | |
| compiler: Clang | |
| metalibs: YES | |
| python: YES | |
| eigen: NO | |
| double: NO | |
| asan: YES | |
| - profile: macos-coverage-unity-xcode | |
| os: macOS-15 | |
| config: Coverage | |
| unity: YES | |
| generator: Xcode | |
| compiler: Default | |
| metalibs: YES | |
| python: YES | |
| eigen: NO | |
| double: NO | |
| - profile: macos-nometa-standard-makefile | |
| os: macOS-15 | |
| config: Standard | |
| unity: NO | |
| generator: Unix Makefiles | |
| compiler: Default | |
| metalibs: NO | |
| python: YES | |
| eigen: NO | |
| double: NO | |
| asan: YES | |
| - profile: windows-standard-unity-msvc | |
| os: windows-2022 | |
| config: Standard | |
| unity: YES | |
| generator: Visual Studio 17 2022 | |
| compiler: Default | |
| metalibs: YES | |
| python: YES | |
| eigen: NO | |
| double: NO | |
| - profile: windows-nopython-nometa-standard-msvc | |
| os: windows-2022 | |
| config: Standard | |
| unity: NO | |
| generator: Visual Studio 17 2022 | |
| compiler: Default | |
| metalibs: NO | |
| python: NO | |
| eigen: NO | |
| double: NO | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 10 | |
| - name: Self-destruct makepanda | |
| run: python3 makepanda/selfdestruct.py --yes | |
| - name: Install dependencies (macOS) | |
| if: runner.os == 'macOS' | |
| run: | | |
| curl -O https://www.panda3d.org/download/panda3d-1.10.16/panda3d-1.10.16-tools-mac.tar.gz | |
| tar -xf panda3d-1.10.16-tools-mac.tar.gz | |
| mv panda3d-1.10.16/thirdparty thirdparty | |
| rmdir panda3d-1.10.16 | |
| # Temporary hack so that pzip can run, since we are about to remove Cg anyway. | |
| install_name_tool -id "$(pwd)/thirdparty/darwin-libs-a/nvidiacg/lib/libCg.dylib" thirdparty/darwin-libs-a/nvidiacg/lib/libCg.dylib | |
| brew install ccache | |
| - name: Set up XCode (macOS) | |
| if: runner.os == 'macOS' | |
| run: sudo xcode-select -s /Applications/Xcode_16.app/Contents/Developer | |
| - name: Install dependencies (Ubuntu) | |
| if: startsWith(matrix.os, 'ubuntu') | |
| run: > | |
| sudo apt-get update | |
| sudo apt-get install | |
| build-essential ninja-build clang llvm ccache | |
| bison flex | |
| libeigen3-dev libfreetype6-dev libjpeg-dev libode-dev | |
| libopenal-dev libpng-dev libssl-dev libvorbis-dev libx11-dev | |
| libxcursor-dev libxrandr-dev nvidia-cg-toolkit zlib1g-dev | |
| libgl1-mesa-dev libegl1-mesa-dev libgl1-mesa-dri mesa-utils-extra | |
| python3-setuptools python3-tk | |
| - name: Cache dependencies (Windows) | |
| if: runner.os == 'Windows' | |
| uses: actions/cache@v5 | |
| with: | |
| path: thirdparty | |
| key: ci-cmake-${{ runner.OS }}-thirdparty-v1.10.16-r1 | |
| - name: Install dependencies (Windows) | |
| if: runner.os == 'Windows' | |
| shell: bash | |
| run: | | |
| if [ ! -d thirdparty/win-libs-vc14-x64 ]; then | |
| curl --retry 5 --retry-delay 10 --retry-all-errors -fLo thirdparty-tools.zip "https://www.panda3d.org/download/panda3d-1.10.16/panda3d-1.10.16-tools-win64.zip" | |
| unzip -q thirdparty-tools.zip -d thirdparty-tools | |
| mv thirdparty-tools/panda3d-1.10.16/thirdparty . | |
| fi | |
| - name: ccache (non-Windows) | |
| if: runner.os != 'Windows' | |
| uses: actions/cache@v5 | |
| with: | |
| path: ccache | |
| key: ci-cmake-ccache-${{ matrix.profile }} | |
| - name: Configure | |
| shell: bash | |
| env: | |
| CMAKE_GENERATOR: "${{ matrix.generator }}" | |
| run: > | |
| mkdir -p build | |
| cd build | |
| if ${{ matrix.compiler == 'Clang' }}; then | |
| if [[ "$CMAKE_GENERATOR" =~ Studio.+20(19|22) ]]; then | |
| export CMAKE_GENERATOR_TOOLSET=ClangCL | |
| elif [[ "$CMAKE_GENERATOR" == *Studio* ]]; then | |
| export CMAKE_GENERATOR_TOOLSET=LLVM | |
| else | |
| export CC=clang CXX=clang++ | |
| fi | |
| fi | |
| if ${{ runner.os != 'Windows' }}; then | |
| compilerLauncher=$(echo -DCMAKE_C{,XX}_COMPILER_LAUNCHER=ccache) | |
| export CCACHE_DIR="$(dirname $PWD)/ccache" | |
| echo "CCACHE_DIR=$(dirname $PWD)/ccache" >> $GITHUB_ENV | |
| fi | |
| cmake | |
| ${compilerLauncher:-} | |
| -D CMAKE_UNITY_BUILD=${{ matrix.unity }} | |
| -D CMAKE_BUILD_TYPE="${{ matrix.config }}" | |
| -D BUILD_METALIBS=${{ matrix.metalibs }} | |
| -D HAVE_PYTHON=${{ runner.os != 'Windows' && matrix.python || 'NO' }} | |
| -D HAVE_EIGEN=${{ matrix.eigen }} | |
| -D STDFLOAT_DOUBLE=${{ matrix.double }} | |
| -D ENABLE_ASAN=${{ matrix.asan || 'NO' }} | |
| .. | |
| echo "$PWD/${{ matrix.config }}/bin" >> $GITHUB_PATH | |
| echo "$PWD/bin" >> $GITHUB_PATH | |
| - name: Configure headless OpenGL | |
| if: matrix.os == 'ubuntu-24.04' | |
| run: | | |
| echo "LIBGL_ALWAYS_SOFTWARE=1" >> $GITHUB_ENV | |
| echo "EGL_PLATFORM=surfaceless" >> $GITHUB_ENV | |
| echo "EGL_LOG_LEVEL=debug" >> $GITHUB_ENV | |
| mkdir -p build/etc/panda3d | |
| echo "load-display p3headlessgl" >> build/etc/panda3d/10_ci.prc | |
| eglinfo || true | |
| - name: Build (no Python) | |
| if: contains(matrix.python, 'NO') | |
| # BEGIN A | |
| working-directory: build | |
| run: cmake --build . --config ${{ matrix.config }} --parallel 4 | |
| # END A | |
| - name: Setup Python (Python 3.8) | |
| if: contains(matrix.python, 'YES') | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.8' | |
| - name: Configure (Python 3.8) | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| run: > | |
| cmake -DWANT_PYTHON_VERSION=3.8 -DHAVE_PYTHON=YES | |
| -DPython_FIND_REGISTRY=NEVER -DPython_ROOT="$pythonLocation" . | |
| - name: Build (Python 3.8) | |
| if: contains(matrix.python, 'YES') | |
| # BEGIN A | |
| working-directory: build | |
| run: cmake --build . --config ${{ matrix.config }} --parallel 4 | |
| # END A | |
| - name: Test (Python 3.8) | |
| # BEGIN B | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| env: | |
| PYTHONPATH: ${{ matrix.config }} | |
| ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0:log_path=asan.log.py38 | |
| run: | | |
| PYTHON_EXECUTABLE=$(grep 'Python_EXECUTABLE:' CMakeCache.txt | sed 's/.*=//') | |
| $PYTHON_EXECUTABLE -m pip install -r ../requirements-test.txt | |
| export COVERAGE_FILE=.coverage.$RANDOM LLVM_PROFILE_FILE=$PWD/pid-%p.profraw | |
| run_pytest ../tests --cov=. | |
| # END B | |
| - name: Setup Python (Python 3.9) | |
| if: contains(matrix.python, 'YES') | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.9' | |
| - name: Configure (Python 3.9) | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| run: > | |
| cmake -DWANT_PYTHON_VERSION=3.9 -DHAVE_PYTHON=YES | |
| -DPython_FIND_REGISTRY=NEVER -DPython_ROOT="$pythonLocation" . | |
| - name: Build (Python 3.9) | |
| if: contains(matrix.python, 'YES') | |
| # BEGIN A | |
| working-directory: build | |
| run: cmake --build . --config ${{ matrix.config }} --parallel 4 | |
| # END A | |
| - name: Test (Python 3.9) | |
| # BEGIN B | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| env: | |
| PYTHONPATH: ${{ matrix.config }} | |
| ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0:log_path=asan.log.py39 | |
| run: | | |
| PYTHON_EXECUTABLE=$(grep 'Python_EXECUTABLE:' CMakeCache.txt | sed 's/.*=//') | |
| $PYTHON_EXECUTABLE -m pip install -r ../requirements-test.txt | |
| export COVERAGE_FILE=.coverage.$RANDOM LLVM_PROFILE_FILE=$PWD/pid-%p.profraw | |
| run_pytest ../tests --cov=. | |
| # END B | |
| - name: Setup Python (Python 3.10) | |
| if: contains(matrix.python, 'YES') | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10' | |
| - name: Configure (Python 3.10) | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| run: > | |
| cmake -DWANT_PYTHON_VERSION=3.10 -DHAVE_PYTHON=YES | |
| -DPython_FIND_REGISTRY=NEVER -DPython_ROOT="$pythonLocation" . | |
| - name: Build (Python 3.10) | |
| if: contains(matrix.python, 'YES') | |
| # BEGIN A | |
| working-directory: build | |
| run: cmake --build . --config ${{ matrix.config }} --parallel 4 | |
| # END A | |
| - name: Test (Python 3.10) | |
| # BEGIN B | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| env: | |
| PYTHONPATH: ${{ matrix.config }} | |
| ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0:log_path=asan.log.py310 | |
| run: | | |
| PYTHON_EXECUTABLE=$(grep 'Python_EXECUTABLE:' CMakeCache.txt | sed 's/.*=//') | |
| $PYTHON_EXECUTABLE -m pip install -r ../requirements-test.txt | |
| export COVERAGE_FILE=.coverage.$RANDOM LLVM_PROFILE_FILE=$PWD/pid-%p.profraw | |
| run_pytest ../tests --cov=. | |
| # END B | |
| - name: Setup Python (Python 3.11) | |
| if: contains(matrix.python, 'YES') | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.11' | |
| - name: Configure (Python 3.11) | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| run: > | |
| cmake -DWANT_PYTHON_VERSION=3.11 -DHAVE_PYTHON=YES | |
| -DPython_FIND_REGISTRY=NEVER -DPython_ROOT="$pythonLocation" . | |
| - name: Build (Python 3.11) | |
| if: contains(matrix.python, 'YES') | |
| # BEGIN A | |
| working-directory: build | |
| run: cmake --build . --config ${{ matrix.config }} --parallel 4 | |
| # END A | |
| - name: Test (Python 3.11) | |
| # BEGIN B | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| env: | |
| PYTHONPATH: ${{ matrix.config }} | |
| ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0:log_path=asan.log.py311 | |
| run: | | |
| PYTHON_EXECUTABLE=$(grep 'Python_EXECUTABLE:' CMakeCache.txt | sed 's/.*=//') | |
| $PYTHON_EXECUTABLE -m pip install -r ../requirements-test.txt | |
| export COVERAGE_FILE=.coverage.$RANDOM LLVM_PROFILE_FILE=$PWD/pid-%p.profraw | |
| run_pytest ../tests --cov=. | |
| # END B | |
| - name: Setup Python (Python 3.12) | |
| if: contains(matrix.python, 'YES') | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.12' | |
| - name: Configure (Python 3.12) | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| run: > | |
| cmake -DWANT_PYTHON_VERSION=3.12 -DHAVE_PYTHON=YES | |
| -DPython_FIND_REGISTRY=NEVER -DPython_ROOT="$pythonLocation" . | |
| - name: Build (Python 3.12) | |
| if: contains(matrix.python, 'YES') | |
| # BEGIN A | |
| working-directory: build | |
| run: cmake --build . --config ${{ matrix.config }} --parallel 4 | |
| # END A | |
| - name: Test (Python 3.12) | |
| # BEGIN B | |
| if: contains(matrix.python, 'YES') | |
| working-directory: build | |
| shell: bash | |
| env: | |
| PYTHONPATH: ${{ matrix.config }} | |
| ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0:log_path=asan.log.py312 | |
| run: | | |
| PYTHON_EXECUTABLE=$(grep 'Python_EXECUTABLE:' CMakeCache.txt | sed 's/.*=//') | |
| $PYTHON_EXECUTABLE -m pip install -r ../requirements-test.txt | |
| export COVERAGE_FILE=.coverage.$RANDOM LLVM_PROFILE_FILE=$PWD/pid-%p.profraw | |
| run_pytest ../tests --cov=. | |
| # END B | |
| - name: Show ASan errors | |
| if: failure() && contains(matrix.asan, 'YES') | |
| working-directory: build | |
| run: | | |
| ls -lAh asan.log.* || true | |
| if cat asan.log.* 2>/dev/null | grep -q .; then | |
| echo '### Address Sanitizer Report' >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| cat asan.log.* >> $GITHUB_STEP_SUMMARY 2>/dev/null || echo "No ASan errors found" | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| fi | |
| - name: Upload coverage reports | |
| if: always() && matrix.config == 'Coverage' | |
| working-directory: build | |
| shell: bash | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| run: | | |
| shopt -s expand_aliases | |
| if ${{ runner.os == 'macOS' }}; then alias llvm-profdata='xcrun llvm-profdata' llvm-cov='xcrun llvm-cov'; fi | |
| python -m pip install coverage | |
| python -m coverage combine $(find . -name '.coverage.*') | |
| TOTAL=$(python -m coverage report --format=total) | |
| echo '### Coverage Report' >> $GITHUB_STEP_SUMMARY | |
| echo "<details><summary>Coverage: <b>${TOTAL}%</b></summary>" >> $GITHUB_STEP_SUMMARY | |
| echo '' >> $GITHUB_STEP_SUMMARY | |
| python -m coverage report --format=markdown >> $GITHUB_STEP_SUMMARY | |
| echo '</details>' >> $GITHUB_STEP_SUMMARY | |
| llvm-profdata merge pid-*.profraw -o coverage.profdata | |
| llvm-cov show $(grep -Rl LLVM_PROFILE_FILE . | sed 's/^/-object /') -instr-profile=coverage.profdata > coverage.txt | |
| bash <(curl -s https://codecov.io/bash) -y ../.github/codecov.yml | |
| makepanda: | |
| if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')" | |
| strategy: | |
| matrix: | |
| os: [ubuntu-24.04, windows-2022, macOS-15] | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install dependencies (Ubuntu) | |
| if: matrix.os == 'ubuntu-24.04' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install build-essential bison flex libfreetype6-dev libgl1-mesa-dev libegl1-mesa-dev libgl1-mesa-dri mesa-utils-extra libjpeg-dev libode-dev libopenal-dev libpng-dev libssl-dev libvorbis-dev libx11-dev libxcursor-dev libxrandr-dev nvidia-cg-toolkit zlib1g-dev | |
| - name: Cache thirdparty packages (Windows) | |
| if: runner.os == 'Windows' | |
| uses: actions/cache@v5 | |
| with: | |
| path: thirdparty | |
| key: ci-makepanda-${{ runner.OS }}-thirdparty-v1.10.16 | |
| - name: Get thirdparty packages (Windows) | |
| if: runner.os == 'Windows' | |
| shell: bash | |
| run: | | |
| if [ ! -d thirdparty/win-libs-vc14-x64 ]; then | |
| curl --retry 5 --retry-delay 10 --retry-all-errors -fLo thirdparty-tools.zip "https://www.panda3d.org/download/panda3d-1.10.16/panda3d-1.10.16-tools-win64.zip" | |
| unzip -q thirdparty-tools.zip -d thirdparty-tools | |
| mv thirdparty-tools/panda3d-1.10.16/thirdparty . | |
| fi | |
| - name: Get thirdparty packages (macOS) | |
| if: runner.os == 'macOS' | |
| run: | | |
| curl -O https://www.panda3d.org/download/panda3d-1.10.16/panda3d-1.10.16-tools-mac.tar.gz | |
| tar -xf panda3d-1.10.16-tools-mac.tar.gz | |
| mv panda3d-1.10.16/thirdparty thirdparty | |
| rmdir panda3d-1.10.16 | |
| (cd thirdparty/darwin-libs-a && rm -rf rocket) | |
| (cd thirdparty/darwin-libs-a && rm -rf openexr) | |
| - name: Set up XCode (macOS) | |
| if: runner.os == 'macOS' | |
| run: sudo xcode-select -s /Applications/Xcode_16.app/Contents/Developer | |
| - name: Configure headless OpenGL | |
| if: matrix.os == 'ubuntu-24.04' | |
| run: | | |
| echo "LIBGL_ALWAYS_SOFTWARE=1" >> $GITHUB_ENV | |
| echo "EGL_PLATFORM=surfaceless" >> $GITHUB_ENV | |
| echo "EGL_LOG_LEVEL=debug" >> $GITHUB_ENV | |
| mkdir -p built/etc | |
| mkdir -p built_dbl/etc | |
| echo "load-display p3headlessgl" >> built/etc/ci.prc | |
| echo "load-display p3headlessgl" >> built_dbl/etc/ci.prc | |
| - name: Set up Python 3.13 | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.13' | |
| - name: Build Python 3.13 | |
| shell: bash | |
| run: | | |
| python makepanda/makepanda.py --git-commit=${{github.sha}} --outputdir=built --everything --no-eigen --python-incdir="$pythonLocation/include" --python-libdir="$pythonLocation/lib" --verbose --threads=4 --windows-sdk=10 --msvc-version=14.3 | |
| - name: Test Python 3.13 | |
| shell: bash | |
| run: | | |
| python -m pip install -r requirements-test.txt | |
| PYTHONPATH=built LD_LIBRARY_PATH=built/lib:$pythonLocation/lib DYLD_LIBRARY_PATH=built/lib python -m pytest | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.12' | |
| - name: Build Python 3.12 (double) | |
| shell: bash | |
| run: | | |
| python makepanda/makepanda.py --override STDFLOAT_DOUBLE=1 --git-commit=${{github.sha}} --outputdir=built_dbl --everything --no-eigen --python-incdir="$pythonLocation/include" --python-libdir="$pythonLocation/lib" --verbose --threads=4 --windows-sdk=10 --msvc-version=14.3 | |
| - name: Test Python 3.12 (double) | |
| shell: bash | |
| run: | | |
| python -m pip install -r requirements-test.txt | |
| PYTHONPATH=built_dbl LD_LIBRARY_PATH=built_dbl/lib:$pythonLocation/lib DYLD_LIBRARY_PATH=built_dbl/lib python -m pytest | |
| - name: Make installer | |
| run: | | |
| python makepanda/makepackage.py --verbose --lzma --outputdir=built_dbl | |
| - name: Set up Python 3.11 | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.11' | |
| - name: Build Python 3.11 | |
| shell: bash | |
| run: | | |
| python makepanda/makepanda.py --git-commit=${{github.sha}} --outputdir=built --everything --no-eigen --python-incdir="$pythonLocation/include" --python-libdir="$pythonLocation/lib" --verbose --threads=4 --windows-sdk=10 --msvc-version=14.3 | |
| - name: Test Python 3.11 | |
| shell: bash | |
| run: | | |
| python -m pip install -r requirements-test.txt | |
| PYTHONPATH=built LD_LIBRARY_PATH=built/lib:$pythonLocation/lib DYLD_LIBRARY_PATH=built/lib python -m pytest | |
| - name: Set up Python 3.10 | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10' | |
| - name: Build Python 3.10 | |
| shell: bash | |
| run: | | |
| python makepanda/makepanda.py --git-commit=${{github.sha}} --outputdir=built --everything --no-eigen --python-incdir="$pythonLocation/include" --python-libdir="$pythonLocation/lib" --verbose --threads=4 --windows-sdk=10 --msvc-version=14.3 | |
| - name: Test Python 3.10 | |
| shell: bash | |
| run: | | |
| python -m pip install -r requirements-test.txt | |
| PYTHONPATH=built LD_LIBRARY_PATH=built/lib:$pythonLocation/lib DYLD_LIBRARY_PATH=built/lib python -m pytest | |
| - name: Set up Python 3.9 | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.9' | |
| - name: Build Python 3.9 | |
| shell: bash | |
| run: | | |
| python makepanda/makepanda.py --git-commit=${{github.sha}} --outputdir=built --everything --no-eigen --python-incdir="$pythonLocation/include" --python-libdir="$pythonLocation/lib" --verbose --threads=4 --windows-sdk=10 --msvc-version=14.3 | |
| - name: Test Python 3.9 | |
| shell: bash | |
| run: | | |
| python -m pip install -r requirements-test.txt | |
| PYTHONPATH=built LD_LIBRARY_PATH=built/lib:$pythonLocation/lib DYLD_LIBRARY_PATH=built/lib python -m pytest | |
| - name: Set up Python 3.8 | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.8' | |
| - name: Build Python 3.8 | |
| shell: bash | |
| run: | | |
| python makepanda/makepanda.py --git-commit=${{github.sha}} --outputdir=built --everything --no-eigen --python-incdir="$pythonLocation/include" --python-libdir="$pythonLocation/lib" --verbose --threads=4 --windows-sdk=10 --msvc-version=14.3 | |
| - name: Test Python 3.8 | |
| shell: bash | |
| run: | | |
| python -m pip install -r requirements-test.txt | |
| PYTHONPATH=built LD_LIBRARY_PATH=built/lib:$pythonLocation/lib DYLD_LIBRARY_PATH=built/lib python -m pytest | |
| - name: Make installer | |
| run: | | |
| python makepanda/makepackage.py --verbose --lzma | |
| emscripten: | |
| if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')" | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install build-essential ninja-build bison flex nodejs python3-pip | |
| - name: Setup emsdk | |
| uses: mymindstorm/setup-emsdk@v14 | |
| with: | |
| version: 4.0.2 | |
| actions-cache-folder: 'emsdk-cache' | |
| - name: Restore Python build cache | |
| id: cache-emscripten-python-restore | |
| uses: actions/cache/restore@v5 | |
| with: | |
| path: ~/python | |
| key: cache-emscripten-python-3.12.8 | |
| - name: Build Python 3.12 | |
| if: steps.cache-emscripten-python-restore.outputs.cache-hit != 'true' | |
| run: | | |
| wget https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tar.xz | |
| tar -xJf Python-3.12.8.tar.xz | |
| (cd Python-3.12.8 && EM_CONFIG=$EMSDK/.emscripten python3 Tools/wasm/wasm_build.py emscripten-browser) | |
| (cd Python-3.12.8/builddir/emscripten-browser && make install DESTDIR=~/python) | |
| cp Python-3.12.8/builddir/emscripten-browser/Modules/_hacl/libHacl_Hash_SHA2.a ~/python/usr/local/lib | |
| cp Python-3.12.8/builddir/emscripten-browser/Modules/_decimal/libmpdec/libmpdec.a ~/python/usr/local/lib | |
| cp Python-3.12.8/builddir/emscripten-browser/Modules/expat/libexpat.a ~/python/usr/local/lib | |
| rm -rf Python-3.12.8 | |
| - name: Save Python build cache | |
| id: cache-emscripten-python-save | |
| if: steps.cache-emscripten-python-restore.outputs.cache-hit != 'true' | |
| uses: actions/cache/save@v5 | |
| with: | |
| path: ~/python | |
| key: ${{ steps.cache-emscripten-python-restore.outputs.cache-primary-key }} | |
| - name: Build for Emscripten | |
| shell: bash | |
| run: | | |
| python3 makepanda/makepanda.py --git-commit=${{github.sha}} --target emscripten --python-incdir=~/python/usr/local/include --python-libdir=~/python/usr/local/lib --static --everything --no-pandatool --no-deploytools --verbose --threads=4 | |
| - name: Install test dependencies | |
| shell: bash | |
| run: | | |
| python3 -m pip install -t ~/python/usr/local/lib/python3.12/site-packages -r requirements-test.txt | |
| - name: Test in node.js | |
| shell: bash | |
| run: | | |
| PYTHONHOME=~/python/usr/local PYTHONPATH=built node built/bin/run_tests.js tests | |
| android: | |
| if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')" | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - android-abi: arm64-v8a | |
| android-arch: arm64 | |
| android-triple: aarch64-linux-android | |
| ndk-version: 29.0.14206865 | |
| runner: ubuntu-latest | |
| - android-abi: armeabi-v7a | |
| android-arch: arm | |
| android-triple: arm-linux-androideabi | |
| ndk-version: 29.0.14206865 | |
| runner: ubuntu-latest | |
| - android-abi: x86_64 | |
| android-arch: x86_64 | |
| android-triple: x86_64-linux-android | |
| ndk-version: 29.0.14206865 | |
| runner: ubuntu-latest | |
| - android-abi: x86 | |
| android-arch: x86 | |
| android-triple: i686-linux-android | |
| ndk-version: 29.0.14206865 | |
| runner: ubuntu-latest | |
| runs-on: ${{ matrix.runner }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Setup Android SDK | |
| uses: android-actions/setup-android@v4 | |
| with: | |
| packages: 'tools platform-tools platforms;android-21 ndk;${{ matrix.ndk-version }}' | |
| - name: Set up Android NDK | |
| run: | | |
| echo "ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/${{ matrix.ndk-version }}" >> $GITHUB_ENV | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.13' | |
| - name: Restore Python build cache | |
| id: cache-android-python-restore | |
| uses: actions/cache/restore@v5 | |
| with: | |
| path: ~/python-prefix | |
| key: cache-android-python-3.13.9-${{ matrix.android-abi }}-ndk${{ matrix.ndk-version }} | |
| - name: Build Python 3.13 | |
| if: steps.cache-android-python-restore.outputs.cache-hit != 'true' | |
| run: | | |
| wget https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tar.xz | |
| tar -xJf Python-3.13.9.tar.xz | |
| sed -i.bak "s/aarch64-linux-android/${{ matrix.android-triple }}/" Python-3.13.9/Android/android.py | |
| sed -i.bak "s/ndk_version=[0-9.]\{1,\}/ndk_version=${{ matrix.ndk-version }}/" Python-3.13.9/Android/android-env.sh | |
| (cd Python-3.13.9/Android && python3 android.py build ${{ matrix.android-triple }}) | |
| cp -R Python-3.13.9/cross-build/${{ matrix.android-triple }}/prefix ~/python-prefix | |
| rm -rf Python-3.13.9 | |
| - name: Save Python build cache | |
| id: cache-android-python-save | |
| if: steps.cache-android-python-restore.outputs.cache-hit != 'true' | |
| uses: actions/cache/save@v5 | |
| with: | |
| path: ~/python-prefix | |
| key: ${{ steps.cache-android-python-restore.outputs.cache-primary-key }} | |
| - name: Restore thirdparty build cache | |
| id: cache-android-thirdparty-restore | |
| uses: actions/cache/restore@v5 | |
| with: | |
| path: ./thirdparty | |
| key: cache-android-thirdparty-935c80380ca171e08587c570e9dad678d29db3c8-${{ matrix.android-abi }}-ndk${{ matrix.ndk-version }} | |
| - name: Install yasm | |
| if: steps.cache-android-thirdparty-restore.outputs.cache-hit != 'true' | |
| run: ${{runner.os == 'macOS' && 'brew' || 'sudo apt-get'}} install yasm | |
| - name: Build thirdparty packages | |
| if: steps.cache-android-thirdparty-restore.outputs.cache-hit != 'true' | |
| run: | | |
| git clone --revision=935c80380ca171e08587c570e9dad678d29db3c8 --depth=1 https://github.com/rdb/panda3d-thirdparty.git thirdparty | |
| cd thirdparty | |
| cmake -B build \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \ | |
| -DCMAKE_ANDROID_ARCH_ABI=${{ matrix.android-abi }} \ | |
| -DCMAKE_ANDROID_ARCH=${{ matrix.android-arch }} \ | |
| -DCMAKE_SYSTEM_VERSION=21 \ | |
| -DANDROID_ABI=${{ matrix.android-abi }} \ | |
| -DANDROID_PLATFORM=android-21 \ | |
| -DBUILD_FCOLLADA=OFF \ | |
| -DBUILD_OPENSSL=OFF \ | |
| -DBUILD_VRPN=OFF \ | |
| -DBUILD_ARTOOLKIT=OFF | |
| cmake --build build --config Release -j4 | |
| rm -rf build | |
| - name: Save thirdparty build cache | |
| id: cache-android-thirdparty-save | |
| if: steps.cache-android-thirdparty-restore.outputs.cache-hit != 'true' | |
| uses: actions/cache/save@v5 | |
| with: | |
| path: ./thirdparty | |
| key: ${{ steps.cache-android-thirdparty-restore.outputs.cache-primary-key }} | |
| - name: Build for Android | |
| shell: bash | |
| run: | | |
| python makepanda/makepanda.py --git-commit=${{github.sha}} --target android-21 --python-incdir=~/python-prefix/include --python-libdir=~/python-prefix/lib --arch ${{ matrix.android-arch }} --everything --no-openssl --no-tinydisplay --no-pandatool --verbose --threads=4 | |
| - name: Install test dependencies | |
| shell: bash | |
| run: | | |
| python -m pip install -t ~/python-prefix/lib/python3.13/site-packages -r requirements-test.txt | |
| - name: Enable KVM group perms | |
| if: startsWith(matrix.runner, 'ubuntu') | |
| run: | | |
| echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
| sudo udevadm control --reload-rules | |
| sudo udevadm trigger --name-match=kvm | |
| - name: Setup Android Emulator and Run Tests | |
| if: startsWith(matrix.android-abi, 'x86') | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: 27 | |
| arch: ${{ matrix.android-abi }} | |
| target: default | |
| profile: pixel_6 | |
| script: | | |
| adb shell "rm -rf /data/local/tmp/panda3d-tests" | |
| adb push built/bin/run_tests /data/local/tmp/panda3d-tests/run_tests | |
| adb shell "mkdir /data/local/tmp/panda3d-tests/lib" | |
| adb push built/lib/*.so /data/local/tmp/panda3d-tests/lib | |
| adb push ~/python-prefix/lib/*.so /data/local/tmp/panda3d-tests/lib | |
| adb push ~/python-prefix/lib/python3.13 /data/local/tmp/panda3d-tests/lib/python3.13 | |
| adb push built/panda3d /data/local/tmp/panda3d-tests/lib/python3.13/site-packages/ | |
| adb push built/direct /data/local/tmp/panda3d-tests/lib/python3.13/site-packages/ | |
| adb push built/models /data/local/tmp/panda3d-tests/models | |
| adb push built/etc /data/local/tmp/panda3d-tests/etc | |
| adb push tests /data/local/tmp/panda3d-tests/tests | |
| adb shell "cd /data/local/tmp/panda3d-tests && LD_LIBRARY_PATH=/data/local/tmp/panda3d-tests/lib PYTHONPATH=/data/local/tmp/panda3d-tests/lib/python3.13/site-packages ./run_tests -v tests" |