Skip to content

examples: replace packaging.version with stdlib tuple comparison #42

examples: replace packaging.version with stdlib tuple comparison

examples: replace packaging.version with stdlib tuple comparison #42

Workflow file for this run

name: CI macOS ARM
on:
push:
branches: ["master", "cefpython147"]
pull_request:
branches: ["master"]
workflow_dispatch:
inputs:
bypass_cache:
description: "Bypass all caches for a clean run"
type: boolean
default: false
jobs:
download-cef:
runs-on: macos-14
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Read CEF version
id: cef-version
run: |
ver=$(python3 -c "
import re, sys
h = open('src/version/cef_version_macarm64.h').read()
m = re.search(r'#define CEF_VERSION \"([^\"]+)\"', h)
print(m.group(1))
")
echo "value=$ver" >> $GITHUB_OUTPUT
- name: Cache CEF binaries
uses: actions/cache@v4
if: ${{ inputs.bypass_cache != true }}
with:
path: |
build/cef_binary_*
build/cef*_macarm64
key: cef-macosarm64-v3-${{ steps.cef-version.outputs.value }}
- name: Install build tools
run: python tools/requirements.py
- name: Download CEF binaries
run: python tools/download_cef.py
compile:
needs: download-cef
runs-on: macos-14
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Read CEF version
id: cef-version
run: |
ver=$(python3 -c "
import re, sys
h = open('src/version/cef_version_macarm64.h').read()
m = re.search(r'#define CEF_VERSION \"([^\"]+)\"', h)
print(m.group(1))
")
echo "value=$ver" >> $GITHUB_OUTPUT
- name: Restore CEF cache
uses: actions/cache/restore@v4
if: ${{ inputs.bypass_cache != true }}
with:
path: |
build/cef_binary_*
build/cef*_macarm64
key: cef-macosarm64-v3-${{ steps.cef-version.outputs.value }}
- name: Install build tools
run: python tools/requirements.py
- name: Prepare prebuilt CEF
run: python tools/automate.py --prebuilt-cef
- name: Verify CEF architecture
run: |
wrapper=$(ls build/cef*_macarm64/lib/libcef_dll_wrapper.a 2>/dev/null | head -1)
if [ -z "$wrapper" ]; then echo "libcef_dll_wrapper.a not found"; exit 1; fi
archs=$(lipo -info "$wrapper" 2>&1)
echo "$archs"
echo "$archs" | grep -q arm64 || { echo "ERROR: libcef_dll_wrapper.a is not arm64"; exit 1; }
- name: Configure CMake
run: cmake -S . -B build/_cmake_build -G Ninja -DCMAKE_BUILD_TYPE=Release
- name: Build
run: cmake --build build/_cmake_build --parallel
- name: Stage build outputs
run: |
mkdir -p build/artifacts
cp build/_cmake_build/cefpython_py*.so build/artifacts/
cp build/_cmake_build/subprocess_build/subprocess build/artifacts/
cef_dir=$(ls -d build/cef*_macarm64 2>/dev/null | head -1)
find "$cef_dir/bin" -maxdepth 1 -mindepth 1 \
! -name 'cefclient*' ! -name 'cefsimple*' ! -name 'ceftests*' \
-exec cp -r {} build/artifacts/ \;
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: build-py${{ matrix.python-version }}-macosarm64
path: build/artifacts/
retention-days: 1
test:
needs: compile
runs-on: macos-14
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: build-py${{ matrix.python-version }}-macosarm64
path: build/artifacts/
- name: Set up cefpython3 package for testing
run: |
cp -r build/artifacts/. cefpython3/
chmod +x cefpython3/subprocess
# Ad-hoc sign our compiled binaries so macOS allows them to run.
# (Our freshly built binaries have no signature; unsigned binaries
# are blocked on macOS 14+.)
codesign --force --sign - cefpython3/subprocess
for f in cefpython3/cefpython_py*.so; do codesign --force --sign - "$f"; done
- name: Run unit tests
run: |
# Create a minimal app bundle so Python has a CFBundleIdentifier.
# CEF 130+ forms the MachPortRendezvousServer bootstrap service name
# as BaseBundleID()+".MachPortRendezvousServer."+pid. Without a
# bundle ID the name starts with "." which bootstrap_register rejects,
# causing renderer subprocesses to crash. Setting CFProcessPath
# before Python starts makes CFBundleGetMainBundle() return this
# bundle, giving BaseBundleID() a valid value before CefInitialize().
BUNDLE_DIR="${{ github.workspace }}/CEFPython.app"
mkdir -p "$BUNDLE_DIR/Contents/MacOS"
ln -sf "$(which python)" "$BUNDLE_DIR/Contents/MacOS/python"
cat > "$BUNDLE_DIR/Contents/Info.plist" << 'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>org.cefpython</string>
<key>CFBundleName</key>
<string>CEFPython</string>
<key>CFBundleExecutable</key>
<string>python</string>
</dict>
</plist>
PLIST
PYTHONPATH="${{ github.workspace }}" \
CFProcessPath="$BUNDLE_DIR/Contents/MacOS/python" \
python unittests/_test_runner.py
wheel:
needs: test
runs-on: macos-14
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: build-py${{ matrix.python-version }}-macosarm64
path: build/artifacts/
- name: Set up cefpython3 package
run: cp -r build/artifacts/. cefpython3/
- name: Codesign binaries for distribution
run: |
# Ad-hoc sign the subprocess binary so macOS 14+ Gatekeeper allows
# it to execute when users install the wheel. Without signing,
# macOS blocks the unsigned binary and the GPU process (which uses
# the same binary with --type=gpu-process) exits with code 1003
# (GPU_DEAD_ON_ARRIVAL), causing a fatal crash.
codesign --force --sign - cefpython3/subprocess
for f in cefpython3/cefpython_py*.so; do codesign --force --sign - "$f"; done
- name: Build wheel
run: python tools/build_distrib.py
- name: Upload wheel artifact
uses: actions/upload-artifact@v4
with:
name: cefpython3-py${{ matrix.python-version }}-macosarm64
path: build/dist/*.whl