-
-
Notifications
You must be signed in to change notification settings - Fork 477
Add CEF 147, Python 3.10–3.14, Linux/macOS ARM64/Windows support with modern build system #691
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: cefpython147
Are you sure you want to change the base?
Changes from all commits
98cd08e
252b5da
e813552
71afdf0
7ad34c6
a933a32
22a939f
249129e
ca4d507
9eaacaa
af5a2bf
f4f589a
15a65ca
5cb6c38
fbb6011
d0c2908
6d3587e
7849fb0
0dbdf15
f9a5aaf
77cbf1d
aa14253
b8a6d6d
8180b39
f3c23c7
36bb856
b9679b0
b5cff20
39f201e
24d0a6d
0808057
ed41dde
c941cd5
383bc90
d38b533
f36d710
62fc993
6b1abee
f0d242f
5bfa8fc
228bfb4
d9f75a5
c41ec22
f6f2494
73ccde9
a8745e8
e159e35
58b92ad
b6ffe1b
0e8c637
9b84fdb
1afdedb
359ddd2
7e94c8b
3428095
517d352
06af762
9e77690
756edd2
91ad3a3
259417d
1e6ebc9
6b138dc
e309b80
5ae9c4c
4640a4d
799d893
2c1ef2b
1db0f0d
e2fd2df
e2e5a99
8cf68ca
a524002
d73d233
4acd649
59d74a4
b6b92f5
e3d1918
978c5e9
cb6ef7d
0519110
307c7f9
cec7ee4
9a54787
ecfc97e
d1e6f9b
7c104fc
87d25a8
66049fb
03ff1bd
06f9ead
5912f0d
95fbddc
050db65
741359b
7f99583
2110147
e6143d9
500a9d2
a4dad65
9fb5c91
f5682bc
1e2cac4
9373155
44339c1
f45f0d0
388cb4d
0d8549d
f7c75a0
6fa9f76
596bb61
9a16e85
756ba5a
e44b0b4
230f562
53495ec
5ebbbea
2a47d56
03aecfb
e9d3ff1
1eaf4e7
f06df36
0c8544d
e978a7a
b6636b9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,143 @@ | ||
| name: CI Linux | ||
|
|
||
| on: | ||
| push: | ||
| branches: ["master", "cefpython147"] | ||
| pull_request: | ||
| branches: ["master", "cefpython147"] | ||
| workflow_dispatch: | ||
| inputs: | ||
| bypass_cache: | ||
| description: "Bypass all caches for a clean run" | ||
| type: boolean | ||
| default: false | ||
|
|
||
| jobs: | ||
| download-cef: | ||
| runs-on: ubuntu-24.04 | ||
| 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=$(grep -oP '(?<=#define CEF_VERSION ")[^"]+' src/version/cef_version_linux.h) | ||
| 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*_linux64 | ||
| key: cef-linux64-${{ steps.cef-version.outputs.value }} | ||
|
|
||
| - name: Install build tools | ||
| run: python tools/requirements.py | ||
|
|
||
| - name: Download CEF binaries | ||
| run: python tools/download_cef.py | ||
|
|
||
| wheel: | ||
| needs: download-cef | ||
| runs-on: ubuntu-24.04 | ||
| timeout-minutes: 75 | ||
| 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=$(grep -oP '(?<=#define CEF_VERSION ")[^"]+' src/version/cef_version_linux.h) | ||
| 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*_linux64 | ||
| key: cef-linux64-${{ steps.cef-version.outputs.value }} | ||
|
|
||
| - name: Install system dependencies | ||
| run: | | ||
| sudo apt-get update -q | ||
| sudo apt-get install -y --no-install-recommends \ | ||
| cmake ninja-build pkg-config \ | ||
| libgtk2.0-dev libgtk-3-dev \ | ||
| libglib2.0-dev libx11-dev \ | ||
| libnss3-dev libatk1.0-dev \ | ||
| libxcomposite-dev libxdamage-dev libxext-dev \ | ||
| libxfixes-dev libxrandr-dev libxrender-dev | ||
|
|
||
| - name: Install build tools | ||
| run: python tools/requirements.py | ||
|
|
||
| - name: Prepare prebuilt CEF | ||
| run: python tools/automate.py --prebuilt-cef | ||
|
|
||
| - 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*_linux64 2>/dev/null | head -1) | ||
| find "$cef_dir/bin" -maxdepth 1 -mindepth 1 \ | ||
| ! -name 'cefclient*' ! -name 'cefsimple*' ! -name 'ceftests*' ! -name 'chrome-sandbox' \ | ||
| -exec cp -r {} build/artifacts/ \; | ||
|
|
||
| - name: Install runtime dependencies | ||
| run: | | ||
| sudo apt-get install -y --no-install-recommends \ | ||
| libnss3 libatk1.0-0 libatk-bridge2.0-0 \ | ||
| libx11-6 libxcomposite1 libxdamage1 libxext6 \ | ||
| libxfixes3 libxrandr2 libxrender1 \ | ||
| libgtk2.0-0 libglib2.0-0 xvfb | ||
|
|
||
| - name: Set up cefpython3 package | ||
| run: | | ||
| cp -r build/artifacts/. cefpython3/ | ||
| chmod +x cefpython3/subprocess | ||
|
|
||
| - name: Resize /dev/shm for Chromium shared memory | ||
| run: sudo mount -o remount,size=512m /dev/shm | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this still required since |
||
|
|
||
| - name: Run unit tests | ||
| run: xvfb-run python unittests/_test_runner.py | ||
| env: | ||
| PYTHONPATH: ${{ github.workspace }} | ||
|
|
||
| - name: Build wheel | ||
| run: python tools/build_distrib.py | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we test the generated wheel package in CI? Previously build_distrib.py installed the built wheel and ran tests against the installed package. |
||
|
|
||
| - name: Upload wheel artifact | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: cefpython3-py${{ matrix.python-version }}-linux64 | ||
| path: build/dist/*.whl | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,237 @@ | ||
| name: CI macOS ARM | ||
|
|
||
| on: | ||
| push: | ||
| branches: ["master", "cefpython147"] | ||
| pull_request: | ||
| branches: ["master", "cefpython147"] | ||
| 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 }} | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What does |
||
|
|
||
| - 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)) | ||
| ") | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This code duplicates. |
||
| 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 }} | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What does |
||
|
|
||
| - name: Install build tools | ||
| run: python tools/requirements.py | ||
|
|
||
| - name: Prepare prebuilt CEF | ||
| run: python tools/automate.py --prebuilt-cef | ||
|
|
||
| - name: Verify CEF architecture | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Verifying CEF architecture runs only on Mac? Linux and Windows not? |
||
| 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 | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The wheel is not tested. |
||
|
|
||
| - name: Upload wheel artifact | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: cefpython3-py${{ matrix.python-version }}-macosarm64 | ||
| path: build/dist/*.whl | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this cache take into account changes to download_cef.py and automate.py scripts?