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.15/panda3d-1.10.15-tools-mac.tar.gz tar -xf panda3d-1.10.15-tools-mac.tar.gz mv panda3d-1.10.15/thirdparty thirdparty rmdir panda3d-1.10.15 # 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 libgl1-mesa-dev libjpeg-dev libode-dev libopenal-dev libpng-dev libssl-dev libvorbis-dev libx11-dev libxcursor-dev libxrandr-dev nvidia-cg-toolkit zlib1g-dev 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.15-r1 - name: Install dependencies (Windows) if: runner.os == 'Windows' shell: powershell run: | if (!(Test-Path thirdparty/win-libs-vc14-x64)) { $wc = New-Object System.Net.WebClient $wc.DownloadFile("https://www.panda3d.org/download/panda3d-1.10.15/panda3d-1.10.15-tools-win64.zip", "thirdparty-tools.zip") Expand-Archive -Path thirdparty-tools.zip Move-Item -Path thirdparty-tools/panda3d-1.10.15/thirdparty -Destination . } - 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: 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 "
Coverage: ${TOTAL}%" >> $GITHUB_STEP_SUMMARY echo '' >> $GITHUB_STEP_SUMMARY python -m coverage report --format=markdown >> $GITHUB_STEP_SUMMARY echo '
' >> $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 libjpeg-dev libode-dev libopenal-dev libpng-dev libssl-dev libvorbis-dev libx11-dev libxcursor-dev libxrandr-dev nvidia-cg-toolkit zlib1g-dev - name: Get thirdparty packages (Windows) if: runner.os == 'Windows' shell: powershell run: | $wc = New-Object System.Net.WebClient $wc.DownloadFile("https://www.panda3d.org/download/panda3d-1.10.16/panda3d-1.10.16-tools-win64.zip", "thirdparty-tools.zip") Expand-Archive -Path thirdparty-tools.zip Move-Item -Path thirdparty-tools/panda3d-1.10.16/thirdparty -Destination . - 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) - name: Set up XCode (macOS) if: runner.os == 'macOS' run: sudo xcode-select -s /Applications/Xcode_16.app/Contents/Developer - 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@v3 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"