name: Build and Test on: [push] jobs: build-and-test: name: build py3.${{ matrix.python-version }} on ${{ matrix.platform || matrix.os.base }}-${{ matrix.os.version }} strategy: fail-fast: true # NOTE: In the matrix below, we call out macos 13 and latest (> 13) explicitly. This is to enable running on both Intel and Apple Silicon for Mac. # As of this writing, MacOS 13 is Intel and MacOS 14 and above is Apple Silicon. Ideally, the Apple transition to their new chip occurs fast and # we can drop macos-13 checks and then just use 'latest'. matrix: os: - base: ubuntu version: latest - base: macos version: '13' arch: 'x86_64' - base: macos version: 'latest' arch: 'arm64' - base: windows version: latest arch: 'amd64' python-version: - "10" - "11" include: - os: base: ubuntu version: latest platform: linux - os: base: windows version: latest ls: dir runs-on: ${{ format('{0}-{1}', matrix.os.base, matrix.os.version) }} steps: - uses: actions/checkout@v4 - name: set up rust uses: dtolnay/rust-toolchain@stable - name: install rust target for MacOS 14 (Apple Silicon) run: rustup target add aarch64-apple-darwin x86_64-apple-darwin if: matrix.os.base == 'macos' && matrix.os.version == '14' - name: install rust target for MacOS 13 (Intel Mac) run: rustup target add x86_64-apple-darwin aarch64-apple-darwin if: matrix.os.base == 'macos' && matrix.os.version == '13' - name: Update minimum supported MacOS for Wheels for MacOS 13 (Intel Mac) run: echo "MACOSX_DEPLOYMENT_TARGET=10.12" >> $GITHUB_ENV if: matrix.os.base == 'macos' && matrix.os.version == '13' - name: run cargo tests run: cargo test - name: set up python uses: actions/setup-python@v4 # uses: actions/setup-python@v5 with: python-version: "3.10" - name: install python dependencies run: python -m pip install --upgrade pip setuptools wheel twine cibuildwheel pytest - name: build source distribution if: matrix.os.base == 'ubuntu' && matrix.python-version == '10' run: | python -m pip install -U setuptools-rust python -c "import setuptools; setuptools.setup()" sdist - name: install FASTSim python run: python -m pip install -e .[dev] - name: run pytest run: pytest -v - name: build ${{ matrix.platform || matrix.os.base }} binaries run: cibuildwheel --output-dir dist env: CIBW_BUILD: "cp3${{ matrix.python-version }}-*" CIBW_SKIP: "*-win32 *-musllinux* *i686 *ppc64le *s390x *aarch64" CIBW_PLATFORM: ${{ matrix.platform || matrix.os.base }} # TODO: why doesn't pytest work with cibuildwheel? # CIBW_TEST_COMMAND: "pytest -v {project}/python/fastsim/tests" CIBW_TEST_COMMAND: "python -m unittest discover {project}/python/fastsim/tests" CIBW_ARCHS_MACOS: "${{ matrix.os.arch }}" # see https://cibuildwheel.readthedocs.io/en/stable/faq/#universal2 CIBW_TEST_SKIP: "*_universal2:arm64" CIBW_ENVIRONMENT: 'PATH="$HOME/.cargo/bin:$PATH"' CIBW_ENVIRONMENT_WINDOWS: 'PATH="$UserProfile\.cargo\bin;$PATH"' CIBW_MANYLINUX_X86_64_IMAGE: "manylinux2014" CIBW_MANYLINUX_I686_IMAGE: "manylinux2014" CIBW_BEFORE_BUILD: > pip install -U setuptools-rust && rustup default stable && rustup show CIBW_BEFORE_BUILD_LINUX: > yum -y install openssl openssl-devel && pip install -U setuptools-rust && curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain=nightly --profile=minimal -y && rustup show - name: list dist files run: ${{ matrix.ls || 'ls -lh' }} dist/ - uses: actions/upload-artifact@v4 with: name: fastsim-${{ matrix.platform || matrix.os.base }}-${{ matrix.os.version }}-py3.${{ matrix.python }}-${{ strategy.job-index }} path: ./dist/*