diff --git a/.circleci/config.yml b/.circleci/config.yml index 8517f44..455b9d6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2 jobs: build_docs: docker: - - image: cimg/python:3.10 + - image: cimg/python:3.12.3 steps: - checkout - run: diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..d15c975 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + actions: + patterns: + - "*" diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..ddb3e48 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,4 @@ +changelog: + exclude: + authors: + - dependabot diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml index 2fb2adc..f6b05fe 100644 --- a/.github/workflows/build_wheels.yml +++ b/.github/workflows/build_wheels.yml @@ -14,11 +14,91 @@ concurrency: jobs: build_wheels: - name: Build wheels on ${{ matrix.os }} + name: ${{ matrix.os }} ${{ matrix.arch }} py${{ matrix.python}} wheels runs-on: ${{ matrix.os }} + continue-on-error: true strategy: matrix: # macos-13 is an intel runner, macos-14 is apple silicon os: [ubuntu-latest, windows-latest, macos-13, macos-14] + arch: [native] + python: ["*"] + # Split aarch64 across jobs because it uses emulation (slow) + include: + - os: ubuntu-latest + arch: i686 + python: "*" + - os: ubuntu-latest + arch: aarch64 + python: "38" + - os: ubuntu-latest + arch: aarch64 + python: "39" + - os: ubuntu-latest + arch: aarch64 + python: "310" + - os: ubuntu-latest + arch: aarch64 + python: "311" + - os: ubuntu-latest + arch: aarch64 + python: "312" steps: - uses: actions/checkout@v4 + with: + submodules: true + # Linux emulation for aarch64 support + # https://cibuildwheel.pypa.io/en/stable/faq/#emulation + - uses: docker/setup-qemu-action@v3 + with: + platforms: all + if: runner.os == 'Linux' && matrix.arch == 'aarch64' + - uses: pypa/cibuildwheel@v2.19.1 + env: + CIBW_BUILDING: "true" + CIBW_ARCHS: ${{ matrix.arch }} # simplest for now + CIBW_BUILD: "{c,p}p${{ matrix.python }}-*" + CIBW_SKIP: "{c,p}p3{6,7}-*" + CIBW_TEST_COMMAND: "python -c \"import rtmixer; print(rtmixer.__version__)\"" + # No portaudio on these platforms: + CIBW_TEST_SKIP: "*_i686 *-musllinux_* *_aarch64" + # To enable testing we'd have to bump up to the Almalinux 8-based image: + # CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_28" + CIBW_BUILD_VERBOSITY: "3" + CIBW_BEFORE_TEST_LINUX: "bash {project}/tools/cibw_before_test_linux.sh" + - uses: actions/upload-artifact@v4 + with: + name: cibw-wheels-${{ matrix.os }}-${{ matrix.arch}}-${{ strategy.job-index }} + path: ./wheelhouse/*.whl + + # From https://cibuildwheel.pypa.io/en/stable/deliver-to-pypi/ + # and https://github.com/pypa/gh-action-pypi-publish?tab=readme-ov-file#trusted-publishing + make_sdist: + name: Make SDist + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: pipx run build --sdist + - uses: actions/upload-artifact@v4 + with: + name: cibw-sdist + path: dist/*.tar.gz + + pypi-publish: + name: Upload release to PyPI + needs: [build_wheels, make_sdist] + if: github.event_name == 'release' && github.event.action == 'published' + environment: + name: pypi + url: https://pypi.org/p/rtmixer + permissions: + id-token: write + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + pattern: cibw-* + path: dist + merge-multiple: true + - run: ls -al dist/* + - uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index f022b90..0000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,87 +0,0 @@ -# Originally adapted from github.com/vispy/vispy (BSD 3-clause) -trigger: - branches: - include: - - '*' - tags: - include: - - '*' -variables: - CIBW_BUILDING: "true" - CIBW_SKIP: "cp27-* cp34-* cp35-* pp27-*" - CIBW_TEST_SKIP: "*-manylinux_i686 *-musllinux*" # 686 and musllinux images do not support "yum install portaudio" - CIBW_TEST_COMMAND: "python -c \"import rtmixer; print(rtmixer.__version__)\"" - CIBW_BUILD_VERBOSITY: "3" - CIBW_BEFORE_BUILD_LINUX: "pip install -U pip setuptools" - CIBW_BEFORE_TEST_LINUX: "yum install -y portaudio" -jobs: -- job: linux - pool: {vmImage: 'Ubuntu-18.04'} - steps: - - task: UsePythonVersion@0 - - bash: | - git submodule update --init --recursive - python -m pip install --upgrade pip - pip install cibuildwheel twine numpy Cython jupyter ipywidgets - python setup.py sdist -d wheelhouse - cibuildwheel --output-dir wheelhouse . - - task: PublishPipelineArtifact@1 - inputs: - path: $(System.DefaultWorkingDirectory)/wheelhouse - artifact: deployLinux -- job: macos - pool: {vmImage: 'macOS-10.15'} - steps: - - task: UsePythonVersion@0 - - bash: | - git submodule update --init --recursive - python -m pip install --upgrade pip - pip install cibuildwheel - cibuildwheel --output-dir wheelhouse . - - task: PublishPipelineArtifact@1 - inputs: - path: $(System.DefaultWorkingDirectory)/wheelhouse - artifact: deployMacOS -- job: windows - pool: {vmImage: 'vs2017-win2016'} - steps: - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.6', architecture: x86}} - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.6', architecture: x64}} - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.7', architecture: x86}} - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.7', architecture: x64}} - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.8', architecture: x86}} - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.8', architecture: x64}} - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.9', architecture: x86}} - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.9', architecture: x64}} - - {task: UsePythonVersion@0, inputs: {versionSpec: '3.10', architecture: x64}} - - bash: | - git submodule update --init --recursive - python -m pip install --upgrade pip - pip install cibuildwheel - cibuildwheel --output-dir wheelhouse . - - task: PublishPipelineArtifact@1 - inputs: - path: $(System.DefaultWorkingDirectory)/wheelhouse - artifact: deployWindows -- job: deployPyPI - pool: {vmImage: 'Ubuntu-18.04'} - condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) - dependsOn: - - linux - - macos - - windows - steps: - - task: UsePythonVersion@0 - - task: DownloadPipelineArtifact@2 - inputs: - patterns: | - deployLinux/* - deployMacOS/*.whl - deployWindows/*.whl - - bash: | - cd $(Pipeline.Workspace) - python -m pip install --upgrade pip - pip install twine - twine upload -u "__token__" --skip-existing deployLinux/* deployMacOS/* deployWindows/* - env: - TWINE_PASSWORD: $(pypiToken) diff --git a/rtmixer_build.py b/rtmixer_build.py index 3728138..ef647e4 100644 --- a/rtmixer_build.py +++ b/rtmixer_build.py @@ -1,5 +1,6 @@ # This is used to create the _rtmixer extension module (see setup.py). +import sys from cffi import FFI import pa_ringbuffer @@ -15,15 +16,16 @@ """) ffibuilder.cdef(open('src/rtmixer.h').read()) +# '-Wconversion' +extra_compile_args = list() +if sys.platform == "linux": + extra_compile_args.append("--std=c99") ffibuilder.set_source( '_rtmixer', RINGBUFFER_CDEF + open('src/rtmixer.c').read(), include_dirs=['src', 'portaudio/include'], sources=['portaudio/src/common/pa_ringbuffer.c'], - extra_compile_args=[ - '--std=c99', - # '-Wconversion', - ], + extra_compile_args=extra_compile_args, # TODO: release mode by default, option for using debug mode undef_macros=[ # 'NDEBUG' diff --git a/src/rtmixer.py b/src/rtmixer.py index 571477b..7cc48a9 100644 --- a/src/rtmixer.py +++ b/src/rtmixer.py @@ -3,7 +3,7 @@ https://python-rtmixer.readthedocs.io/ """ -__version__ = '0.1.4' +__version__ = '0.1.5' import sounddevice as _sd from pa_ringbuffer import init as _init_ringbuffer diff --git a/tools/cibw_before_test_linux.sh b/tools/cibw_before_test_linux.sh new file mode 100755 index 0000000..b751f29 --- /dev/null +++ b/tools/cibw_before_test_linux.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -xeo pipefail + +if [[ "$(cat /etc/redhat-release)" == 'AlmaLinux'* ]]; then + dnf config-manager --set-enabled powertools + dnf install -y epel-release +fi +yum install -y portaudio