diff --git a/.github/workflows/create.yml b/.github/workflows/create.yml index d78194ef..3cbfc4e5 100644 --- a/.github/workflows/create.yml +++ b/.github/workflows/create.yml @@ -152,6 +152,7 @@ jobs: with: java-version: '17' distribution: 'temurin' + java-package: 'jre' architecture: ${{ matrix.architecture }} - name: Setup ant on macOS diff --git a/.github/workflows/test-wheels.yml b/.github/workflows/test-wheels.yml new file mode 100644 index 00000000..f648dd48 --- /dev/null +++ b/.github/workflows/test-wheels.yml @@ -0,0 +1,201 @@ +on: + push: + pull_request: + create: + +name: Continuous Integration - Testing Wheels on JREs +jobs: + build_test_jar: + runs-on: 'ubuntu-latest' + steps: + + - name: Checkout pyjnius + uses: actions/checkout@v3 + + - name: Setup java + # There's no need to setup java on ubuntu-latest, as build is done into a manylinux + # containerized environment. (CIBW_BEFORE_ALL_LINUX) takes care of it. + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + architecture: 'x64' + + - name: Setup ant on Linux + run: | + sudo apt-get update && sudo apt-get install -y ant + + - name: Build test-classes via ant + run: ant all + + - name: Upload test-classes + uses: actions/upload-artifact@v3 + with: + name: test-classes + path: build/test-classes + + build_wheels: + name: cibuildwheel on ${{ matrix.os }} ${{ matrix.architecture }} + env: + CIBW_BEFORE_ALL_LINUX: 'yum install -y java-11-openjdk-devel' + CIBW_REPAIR_WHEEL_COMMAND_MACOS: '' + CIBW_SKIP: 'cp36-* *musllinux*' + strategy: + matrix: + include: + - os: windows-latest + architecture: 'x86' + cibw_archs: 'x86' + - os: windows-latest + architecture: 'x64' + cibw_archs: 'AMD64' + - os: ubuntu-latest + architecture: 'x64' + cibw_archs: 'x86_64' + - os: macos-latest + architecture: 'x64' + cibw_archs: 'x86_64 universal2' + runs-on: ${{ matrix.os }} + steps: + + - name: Checkout pyjnius + uses: actions/checkout@v3 + + - name: Setup Python (Ubuntu x86_64, macOS Intel, Windows x86_64) + if: matrix.os == 'macos-latest' || matrix.os == 'windows-latest' || matrix.os == 'ubuntu-latest' + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Setup java + # There's no need to setup java on ubuntu-latest, as build is done into a manylinux + # containerized environment. (CIBW_BEFORE_ALL_LINUX) takes care of it. + if: ${{ matrix.os != 'ubuntu-latest' }} + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + architecture: ${{ matrix.architecture }} + + - name: Install cibuildwheel & build wheels (Windows) + if: matrix.os == 'windows-latest' + env: + CIBW_ARCHS: '${{ matrix.cibw_archs }}' + run: | + python -m pip install cibuildwheel~=2.16.2 + python -m cibuildwheel --output-dir dist + + - name: Install cibuildwheel & build wheels (Linux, macOS Intel) + if: (matrix.os == 'ubuntu-latest') || (matrix.os == 'kivy-ubuntu-arm64') || (matrix.os == 'macos-latest') + env: + CIBW_ARCHS: '${{ matrix.cibw_archs }}' + run: | + source .ci/utils.sh + ensure_python_version 3.11 + python -m pip install cibuildwheel~=2.16.2 + python -m cibuildwheel --output-dir dist + + - name: upload wheels + uses: actions/upload-artifact@v3 + with: + name: dist + path: dist + + test_wheels: + name: Test wheel on ${{ matrix.os }} (${{ matrix.architecture }}) Python ${{ matrix.python }} + needs: + - build_wheels + continue-on-error: true + strategy: + matrix: + os: ['ubuntu-latest', 'macos-latest', 'windows-latest', 'kivy-ubuntu-arm64'] + python: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', 'pypy3.7', 'pypy3.8', 'pypy3.9'] + include: + # We may would like to introduce tests also on windows-latest on x86 (win32 wheels)? + - os: ubuntu-latest + architecture: 'x64' + - os: windows-latest + architecture: 'x64' + - os: macos-latest + architecture: 'x64' + - os: apple-silicon-m1 + architecture: 'aarch64' + python: '3.10' + - os: apple-silicon-m1 + architecture: 'aarch64' + python: '3.11' + - os: apple-silicon-m1 + architecture: 'aarch64' + python: '3.12' + runs-on: ${{ matrix.os }} + steps: + + - name: Checkout pyjnius + uses: actions/checkout@v3 + + - uses: actions/download-artifact@v3 + with: + name: dist + path: dist + + - uses: actions/download-artifact@v3 + with: + name: test-classes + path: build/test-classes + + - name: Setup Python (Ubuntu x86_64, macOS Intel, Windows x86_64) + # Needs to be skipped on our self-hosted runners tagged as 'apple-silicon-m1' + if: matrix.os == 'macos-latest' || matrix.os == 'windows-latest' || matrix.os == 'ubuntu-latest' || matrix.os == 'apple-silicon-m1' + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python }} + + - name: Setup java + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + java-package: 'jre' + architecture: ${{ matrix.architecture }} + + - name: Install pyjnius wheel + test prerequisites (Windows, macOS) + if: matrix.os == 'windows-latest' || matrix.os == 'macos-latest' || matrix.os == 'apple-silicon-m1' + # --find-links=dist --no-index is needed to avoid downloading the pyjnius wheel + # from the index. We need to test the wheel we just built. + run: | + python -m pip install --find-links=dist --no-index pyjnius + python -m pip install pyjnius[dev,ci] + + - name: Install pyjnius wheel + test prerequisites (Linux) + if: matrix.os == 'ubuntu-latest' || matrix.os == 'kivy-ubuntu-arm64' + # --find-links=dist --no-index is needed to avoid downloading the pyjnius wheel + # from the index. We need to test the wheel we just built. + run: | + source .ci/utils.sh + ensure_python_version ${{ matrix.python }} + python -m pip install --find-links=dist --no-index pyjnius + python -m pip install pyjnius[dev,ci] + + - name: Test wheel (Linux, macOS) + if: (matrix.os == 'ubuntu-latest') || (matrix.os == 'kivy-ubuntu-arm64') || (matrix.os == 'macos-latest') || (matrix.os == 'apple-silicon-m1') + run: | + source .ci/utils.sh + ensure_python_version ${{ matrix.python }} + cd tests + CLASSPATH=../build/test-classes:../build/classes python -m pytest -v + + - name: Test wheel ( Windows + Python == 3.7.x ) + # On Python < 3.8.x, we can't use `os.add_dll_directory`, so the jre should be in PATH. + if: (matrix.os == 'windows-latest') && contains(matrix.python, '3.7') + run: | + cd tests + $env:PATH +=";$env:JAVA_HOME\jre\bin\server\;$env:JAVA_HOME\jre\bin\client\;$env:JAVA_HOME\bin\server\" + $env:CLASSPATH ="../build/test-classes;../build/classes" + python -m pytest -v + + - name: Test wheel (Windows + Python != 3.7.x ) + if: (matrix.os == 'windows-latest') && !contains(matrix.python, '3.7') + run: | + cd tests + $env:CLASSPATH ="../build/test-classes;../build/classes" + python -m pytest -v \ No newline at end of file diff --git a/docs/source/building.rst b/docs/source/building.rst index 3aedf64e..7f33fbcc 100644 --- a/docs/source/building.rst +++ b/docs/source/building.rst @@ -6,9 +6,9 @@ Building PyJNIus Building PyJNIus is necessary for development purposes, or if there is no pre-built binary for your particular platform. -Like installation of PyJNIus, building PyJNIus requires a `Java Development Kit +Building PyJNIus requires a `Java Development Kit `_ (JDK) -to be installed. +to be installed (NB: installing pre-built wheels required only a JRE). Apart from the JDK, the build requirements for each platform are as follows: diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 32f1dbdc..ebedac12 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -16,10 +16,11 @@ If there is no pre-compiled binary available, pip install will aim to compile a binary on your operating system. For more information see the :ref:`building` documentation. -You will need the Java JDK installed (`OpenJDK `_ is fine). +You will need the Java JRE installed (`OpenJDK `_ is fine). PyJNIus searches for Java in the usual places on each operating system. If PyJNIus cannot find Java, set the `JAVA_HOME` environment variable (this is often needed `on Windows `_). +NB: Building pyjnius requires a Java JDK rather than a JRE. Installation for Android ------------------------