Implement runtime availability checking #3077
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
# Every PR | |
pull_request: | |
# Once merged into `master`, and on `ci-full` to enable testing a full run | |
push: | |
branches: | |
- master | |
- ci-full | |
# Every monday at 09:00 in the morning | |
schedule: | |
- cron: '0 9 * * MON' | |
permissions: | |
contents: read | |
env: | |
# Disable incremental compilation | |
CARGO_BUILD_INCREMENTAL: false | |
# Set prettier + more verbose terminal output | |
CARGO_TERM_COLOR: always | |
CARGO_TERM_VERBOSE: true | |
RUST_BACKTRACE: 1 | |
# Faster compilation, error on warnings and only document current crate | |
RUSTFLAGS: "--codegen=debuginfo=0 --deny=warnings" | |
# Minimum deployment targets. | |
# Follows `rustc --target=x86_64-apple-darwin --print deployment-target` | |
MACOSX_DEPLOYMENT_TARGET: 10.12 | |
# Follows `rustc --target=x86_64-apple-ios --print deployment-target` | |
IPHONEOS_DEPLOYMENT_TARGET: 10.0 | |
# We only support compiling Objective-C code with clang | |
CC: clang | |
CXX: clang++ | |
# Crates that we want to run `rustdoc` and `clippy` on | |
# | |
# This excludes `header-translator`, `test-assembly`, `tests` and `test-ui`. | |
PUBLIC_CRATES: >- | |
--package=block2 | |
--package=objc2 | |
--package=objc2-encode | |
--package=objc2-proc-macros | |
--package=objc2-exception-helper | |
# BEGIN AUTOMATICALLY GENERATED | |
FRAMEWORKS_MACOS_10_12: --package=objc2-accounts --package=objc2-app-kit --package=objc2-automator --package=objc2-av-kit --package=objc2-cloud-kit --package=objc2-contacts --package=objc2-contacts-ui --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-image --package=objc2-core-location --package=objc2-core-wlan --package=objc2-event-kit --package=objc2-exception-handling --package=objc2-finder-sync --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-input-method-kit --package=objc2-local-authentication --package=objc2-map-kit --package=objc2-media-player --package=objc2-metal --package=objc2-metal-kit --package=objc2-multipeer-connectivity --package=objc2-network-extension --package=objc2-osa-kit --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-screen-saver --package=objc2-service-management --package=objc2-social --package=objc2-store-kit --package=objc2-web-kit | |
FRAMEWORKS_MACOS_10_13: --package=objc2-accounts --package=objc2-app-kit --package=objc2-automator --package=objc2-av-kit --package=objc2-cloud-kit --package=objc2-contacts --package=objc2-contacts-ui --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-image --package=objc2-core-location --package=objc2-core-ml --package=objc2-core-wlan --package=objc2-event-kit --package=objc2-exception-handling --package=objc2-external-accessory --package=objc2-finder-sync --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-input-method-kit --package=objc2-local-authentication --package=objc2-map-kit --package=objc2-media-player --package=objc2-metal --package=objc2-metal-kit --package=objc2-multipeer-connectivity --package=objc2-network-extension --package=objc2-osa-kit --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-screen-saver --package=objc2-service-management --package=objc2-social --package=objc2-store-kit --package=objc2-vision --package=objc2-web-kit | |
FRAMEWORKS_MACOS_11: --package=objc2-accessibility --package=objc2-accounts --package=objc2-ad-support --package=objc2-app-kit --package=objc2-app-tracking-transparency --package=objc2-authentication-services --package=objc2-automatic-assessment-configuration --package=objc2-automator --package=objc2-av-kit --package=objc2-business-chat --package=objc2-class-kit --package=objc2-cloud-kit --package=objc2-contacts --package=objc2-contacts-ui --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-image --package=objc2-core-location --package=objc2-core-ml --package=objc2-core-motion --package=objc2-core-wlan --package=objc2-device-check --package=objc2-event-kit --package=objc2-exception-handling --package=objc2-external-accessory --package=objc2-file-provider --package=objc2-file-provider-ui --package=objc2-finder-sync --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-identity-lookup --package=objc2-input-method-kit --package=objc2-link-presentation --package=objc2-local-authentication --package=objc2-map-kit --package=objc2-media-player --package=objc2-metal --package=objc2-metal-kit --package=objc2-ml-compute --package=objc2-multipeer-connectivity --package=objc2-natural-language --package=objc2-nearby-interaction --package=objc2-network-extension --package=objc2-osa-kit --package=objc2-photos --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-screen-saver --package=objc2-service-management --package=objc2-social --package=objc2-sound-analysis --package=objc2-speech --package=objc2-store-kit --package=objc2-system-extensions --package=objc2-uniform-type-identifiers --package=objc2-user-notifications --package=objc2-virtualization --package=objc2-vision --package=objc2-web-kit | |
FRAMEWORKS_MACOS_12: --package=objc2-accessibility --package=objc2-accounts --package=objc2-ad-services --package=objc2-ad-support --package=objc2-app-kit --package=objc2-app-tracking-transparency --package=objc2-authentication-services --package=objc2-automatic-assessment-configuration --package=objc2-automator --package=objc2-av-kit --package=objc2-business-chat --package=objc2-class-kit --package=objc2-cloud-kit --package=objc2-contacts --package=objc2-contacts-ui --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-image --package=objc2-core-location --package=objc2-core-ml --package=objc2-core-motion --package=objc2-core-wlan --package=objc2-data-detection --package=objc2-device-check --package=objc2-event-kit --package=objc2-exception-handling --package=objc2-external-accessory --package=objc2-file-provider --package=objc2-file-provider-ui --package=objc2-finder-sync --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-identity-lookup --package=objc2-input-method-kit --package=objc2-link-presentation --package=objc2-local-authentication --package=objc2-local-authentication-embedded-ui --package=objc2-mail-kit --package=objc2-map-kit --package=objc2-media-player --package=objc2-metal --package=objc2-metal-kit --package=objc2-metric-kit --package=objc2-ml-compute --package=objc2-multipeer-connectivity --package=objc2-natural-language --package=objc2-nearby-interaction --package=objc2-network-extension --package=objc2-osa-kit --package=objc2-photos --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-screen-saver --package=objc2-service-management --package=objc2-social --package=objc2-sound-analysis --package=objc2-speech --package=objc2-store-kit --package=objc2-system-extensions --package=objc2-uniform-type-identifiers --package=objc2-user-notifications --package=objc2-virtualization --package=objc2-vision --package=objc2-web-kit | |
FRAMEWORKS_MACOS_13: --package=objc2-accessibility --package=objc2-accounts --package=objc2-ad-services --package=objc2-ad-support --package=objc2-app-kit --package=objc2-app-tracking-transparency --package=objc2-authentication-services --package=objc2-automatic-assessment-configuration --package=objc2-automator --package=objc2-av-kit --package=objc2-background-assets --package=objc2-business-chat --package=objc2-call-kit --package=objc2-class-kit --package=objc2-cloud-kit --package=objc2-contacts --package=objc2-contacts-ui --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-image --package=objc2-core-location --package=objc2-core-ml --package=objc2-core-motion --package=objc2-core-wlan --package=objc2-data-detection --package=objc2-device-check --package=objc2-event-kit --package=objc2-exception-handling --package=objc2-extension-kit --package=objc2-external-accessory --package=objc2-file-provider --package=objc2-file-provider-ui --package=objc2-finder-sync --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-health-kit --package=objc2-identity-lookup --package=objc2-input-method-kit --package=objc2-link-presentation --package=objc2-local-authentication --package=objc2-local-authentication-embedded-ui --package=objc2-mail-kit --package=objc2-map-kit --package=objc2-media-player --package=objc2-metal --package=objc2-metal-fx --package=objc2-metal-kit --package=objc2-metric-kit --package=objc2-ml-compute --package=objc2-multipeer-connectivity --package=objc2-natural-language --package=objc2-nearby-interaction --package=objc2-network-extension --package=objc2-osa-kit --package=objc2-photos --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-screen-capture-kit --package=objc2-screen-saver --package=objc2-service-management --package=objc2-social --package=objc2-sound-analysis --package=objc2-speech --package=objc2-store-kit --package=objc2-system-extensions --package=objc2-uniform-type-identifiers --package=objc2-user-notifications --package=objc2-virtualization --package=objc2-vision --package=objc2-web-kit | |
FRAMEWORKS_MACOS_14: --package=objc2-accessibility --package=objc2-accounts --package=objc2-ad-services --package=objc2-ad-support --package=objc2-app-kit --package=objc2-app-tracking-transparency --package=objc2-authentication-services --package=objc2-automatic-assessment-configuration --package=objc2-automator --package=objc2-av-kit --package=objc2-background-assets --package=objc2-business-chat --package=objc2-call-kit --package=objc2-class-kit --package=objc2-cloud-kit --package=objc2-contacts --package=objc2-contacts-ui --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-image --package=objc2-core-location --package=objc2-core-ml --package=objc2-core-motion --package=objc2-core-wlan --package=objc2-data-detection --package=objc2-device-check --package=objc2-event-kit --package=objc2-exception-handling --package=objc2-extension-kit --package=objc2-external-accessory --package=objc2-file-provider --package=objc2-file-provider-ui --package=objc2-finder-sync --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-health-kit --package=objc2-identity-lookup --package=objc2-input-method-kit --package=objc2-link-presentation --package=objc2-local-authentication --package=objc2-local-authentication-embedded-ui --package=objc2-mail-kit --package=objc2-map-kit --package=objc2-media-player --package=objc2-metal --package=objc2-metal-fx --package=objc2-metal-kit --package=objc2-metric-kit --package=objc2-ml-compute --package=objc2-multipeer-connectivity --package=objc2-natural-language --package=objc2-nearby-interaction --package=objc2-network-extension --package=objc2-osa-kit --package=objc2-photos --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-screen-capture-kit --package=objc2-screen-saver --package=objc2-sensitive-content-analysis --package=objc2-service-management --package=objc2-social --package=objc2-sound-analysis --package=objc2-speech --package=objc2-store-kit --package=objc2-symbols --package=objc2-system-extensions --package=objc2-uniform-type-identifiers --package=objc2-user-notifications --package=objc2-virtualization --package=objc2-vision --package=objc2-web-kit | |
FRAMEWORKS_IOS_10: --package=objc2-accounts --package=objc2-ad-support --package=objc2-av-kit --package=objc2-call-kit --package=objc2-cloud-kit --package=objc2-contacts --package=objc2-contacts-ui --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-image --package=objc2-core-location --package=objc2-core-motion --package=objc2-event-kit --package=objc2-external-accessory --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-health-kit --package=objc2-local-authentication --package=objc2-map-kit --package=objc2-media-player --package=objc2-metal --package=objc2-metal-kit --package=objc2-multipeer-connectivity --package=objc2-network-extension --package=objc2-photos --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-social --package=objc2-speech --package=objc2-store-kit --package=objc2-ui-kit --package=objc2-user-notifications | |
FRAMEWORKS_GNUSTEP: --package=objc2-app-kit --package=objc2-foundation | |
# END AUTOMATICALLY GENERATED | |
# The current nightly Rust version. Keep this synced with `rust-toolchain.toml` | |
CURRENT_NIGHTLY: nightly-2024-09-05 | |
# Various features that we'd usually want to test with | |
# | |
# Note: The `exception` feature is not enabled here, since it requires | |
# compiling C code, even if just running a `check`/`clippy` build. | |
INTERESTING_FEATURES: --features=block2,unstable-private,all | |
# https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci | |
# Note: We don't cache `~/.cargo/bin`, that is done separately when needed. | |
CARGO_CACHE_PATH: | | |
~/.cargo/registry/index/ | |
~/.cargo/registry/cache/ | |
~/.cargo/git/db/ | |
# Only enable time-consuming checks when about to do a new release | |
# | |
# This condition is duplicated a few places, since there's no good way to | |
# deduplicate such information in GitHub Actions... | |
FULL: ${{ (github.head_ref == 'new-versions' || github.ref_name == 'ci-full') && true || '' }} | |
jobs: | |
fmt: | |
name: Check formatting | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use system Rust | |
run: rustup override set stable | |
- name: cargo fmt | |
# This runs on the entire repository, including submodules | |
run: cargo fmt -- --check | |
lint: | |
name: Lint ${{ matrix.name }} | |
runs-on: ubuntu-latest | |
strategy: | |
# These jobs are "cheap" to run, will likely run in parallel anyhow, and | |
# it can be useful to know exactly which parts failed. | |
fail-fast: false | |
matrix: | |
include: | |
- name: macOS 64bit | |
target: aarch64-apple-darwin | |
args: $PUBLIC_CRATES $FRAMEWORKS_MACOS_14 $INTERESTING_FEATURES | |
- name: iOS 32bit | |
target: armv7s-apple-ios | |
build-std: true | |
# `cc` works poorly when cross-compiling, so let's ignore `objc2-exception-helper` for now. | |
args: --package=block2 --package=objc2 --package=objc2-encode --package=objc2-proc-macros $FRAMEWORKS_IOS_10 $INTERESTING_FEATURES -Zbuild-std | |
- name: GNUStep + exceptions | |
target: x86_64-unknown-linux-gnu | |
args: $PUBLIC_CRATES $FRAMEWORKS_GNUSTEP $INTERESTING_FEATURES --features=gnustep-1-9,catch-all | |
- name: header-translator | |
target: x86_64-unknown-linux-gnu | |
args: -pheader-translator | |
- name: test-assembly | |
target: x86_64-unknown-linux-gnu | |
args: -ptest-assembly | |
env: | |
CARGO_BUILD_TARGET: ${{ matrix.target }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use nightly toolchain | |
run: | | |
rustup toolchain install ${{ env.CURRENT_NIGHTLY }} --profile=minimal --no-self-update | |
rustup override set ${{ env.CURRENT_NIGHTLY }} | |
- name: Add clippy component | |
run: rustup component add clippy | |
- name: Add rust-src component for -Zbuild-std | |
if: matrix.build-std | |
run: rustup component add rust-src | |
- name: Install target | |
if: ${{ matrix.target && !matrix.build-std }} | |
run: rustup target add ${{ matrix.target }} | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: cargo doc | |
run: cargo doc --no-deps --document-private-items ${{ matrix.args }} | |
env: | |
# docsrs runs on nightly, so we can use nightly features when `docsrs` is enabled. | |
RUSTDOCFLAGS: "--deny=warnings --cfg=docsrs" | |
- name: cargo clippy | |
run: cargo clippy --all-targets ${{ matrix.args }} | |
msrv: | |
name: Check MSRV | |
runs-on: ubuntu-latest | |
env: | |
CARGO_BUILD_TARGET: x86_64-apple-darwin | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use MSRV toolchain | |
run: | | |
rustup toolchain install 1.71 --profile=minimal --no-self-update | |
rustup override set 1.71 | |
- name: Install target | |
run: rustup target add x86_64-apple-darwin | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: cargo check | |
run: cargo check --package=block2 --package=objc2 --package=objc2-encode --package=objc2-proc-macros $FRAMEWORKS_MACOS_14 --features=all | |
env: | |
RUSTFLAGS: "--codegen=debuginfo=0" # Removed --deny=warnings | |
ui: | |
name: Compiler UI | |
runs-on: macos-13 | |
needs: | |
- fmt | |
- lint | |
env: | |
TRYBUILD: overwrite | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use nightly toolchain | |
run: | | |
rustup toolchain install ${{ env.CURRENT_NIGHTLY }} --profile=minimal --no-self-update | |
rustup override set ${{ env.CURRENT_NIGHTLY }} | |
- name: Add rust-src component to allow compiler UI to display sources | |
run: rustup component add rust-src | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Run UI tests | |
run: cargo run --features=run --bin=test-ui | |
- name: Check diff | |
if: ${{ always() }} | |
run: git diff --exit-code | |
assembly: | |
name: Assembly tests | |
runs-on: ubuntu-latest | |
needs: | |
- fmt | |
- lint | |
env: | |
TEST_OVERWRITE: 1 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use nightly toolchain | |
run: | | |
rustup toolchain install ${{ env.CURRENT_NIGHTLY }} --profile=minimal --no-self-update | |
rustup override set ${{ env.CURRENT_NIGHTLY }} | |
- name: Add rust-src component for -Zbuild-std | |
run: rustup component add rust-src | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Run macOS x86_64 assembly tests | |
run: cargo run --bin=test-assembly -- -Z build-std --target=x86_64-apple-darwin | |
- name: Run all assembly tests | |
if: ${{ env.FULL }} | |
run: ./helper-scripts/run-assembly-tests.sh | |
- name: Check diff | |
if: ${{ always() }} | |
run: git diff --exit-code | |
header-translator: | |
name: Verify header translator output | |
runs-on: macos-14 | |
needs: | |
- fmt | |
- lint | |
env: | |
DEVELOPER_DIR: /Applications/Xcode_16.0.app/Contents/Developer | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use system Rust | |
run: rustup override set stable | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Run header translator | |
run: cargo run --bin=header-translator | |
- name: Verify that no files changed | |
run: git diff --exit-code --submodule=diff | |
check-framework-features: | |
# if: ${{ env.FULL }} | |
# This will take ~40 minutes | |
if: ${{ github.head_ref == 'new-versions' || github.ref_name == 'ci-full' }} | |
name: Check framework features | |
runs-on: macos-12 | |
needs: | |
- fmt | |
- lint | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use system Rust | |
run: rustup override set stable | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Check frameworks with each feature enabled separately | |
run: cargo run --bin=check_framework_features | |
test-macos: | |
name: Test macOS 12 | |
runs-on: macos-12 | |
needs: | |
- fmt | |
# Currently the slowest check, so let's get it started as soon as possible | |
# - lint | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use nightly toolchain | |
run: | | |
rustup toolchain install ${{ env.CURRENT_NIGHTLY }} --profile=minimal --no-self-update | |
rustup override set ${{ env.CURRENT_NIGHTLY }} | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Test without features | |
run: cargo test $PUBLIC_CRATES -ptests | |
- name: Test all frameworks | |
run: cargo test $PUBLIC_CRATES $FRAMEWORKS_MACOS_10_12 -ptests $INTERESTING_FEATURES | |
test-apple: | |
# if: ${{ env.FULL }} | |
if: ${{ github.head_ref == 'new-versions' || github.ref_name == 'ci-full' }} | |
name: ${{ matrix.name }} | |
runs-on: ${{ matrix.os || 'macos-latest' }} | |
needs: | |
- fmt | |
- lint | |
strategy: | |
# MacOS instances are rate-limited, which means that whenever we can | |
# avoid doing work, we should! | |
fail-fast: true | |
matrix: | |
include: | |
- name: Test macOS 13 | |
target: x86_64-apple-darwin | |
os: macos-13 | |
frameworks: MACOS_13 | |
- name: Test macOS 14 | |
target: aarch64-apple-darwin | |
os: macos-14 | |
frameworks: MACOS_14 | |
- name: Build macOS AArch64 | |
target: aarch64-apple-darwin | |
frameworks: MACOS_11 | |
- name: Test macOS old SDK | |
target: x86_64-apple-darwin | |
# Oldest macOS version we support | |
sdk: "10.12" | |
frameworks: MACOS_10_12 | |
# The SDK itself only supports compiling build scripts for x86_64 | |
os: macos-13 | |
- name: Test macOS nightly | |
target: aarch64-apple-darwin | |
nightly: true | |
frameworks: MACOS_11 | |
- name: Build macOS 32bit | |
target: i686-apple-darwin | |
nightly: true | |
build-std: true | |
# Newest SDK that supports 32-bit | |
sdk: "10.13" | |
frameworks: MACOS_10_13 | |
# The SDK itself only supports compiling build scripts for x86_64 | |
os: macos-13 | |
- name: Build iOS simulator ARM64 | |
target: aarch64-apple-ios-sim | |
frameworks: IOS_10 | |
- name: Build iOS ARM64 | |
target: aarch64-apple-ios | |
frameworks: IOS_10 | |
- name: Build iOS ARMv7s | |
target: armv7s-apple-ios | |
nightly: true | |
build-std: true | |
frameworks: IOS_10 | |
- name: Build iOS 32bit x86 | |
target: i386-apple-ios | |
nightly: true | |
build-std: true | |
frameworks: IOS_10 | |
env: | |
CARGO_BUILD_TARGET: ${{ matrix.target }} | |
# Modern macOS can only run the target that they're built for. | |
# So we pass `--no-run` when building for other targets. | |
ARGS: >- | |
${{ matrix.build-std && '-Zbuild-std -Zdoctest-xcompile' }} | |
${{ matrix.target && '--no-run' }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use nightly toolchain | |
if: ${{ matrix.nightly }} | |
run: | | |
rustup toolchain install ${{ env.CURRENT_NIGHTLY }} --profile=minimal --no-self-update | |
rustup override set ${{ env.CURRENT_NIGHTLY }} | |
- name: Use stable toolchain | |
if: ${{ !matrix.nightly }} | |
run: rustup override set stable | |
- name: Add rust-src component for -Zbuild-std | |
if: matrix.build-std | |
run: rustup component add rust-src | |
- name: Install target | |
if: ${{ !matrix.build-std }} | |
run: rustup target add ${{ matrix.target }} | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Cache SDK | |
id: sdk-cache | |
if: matrix.sdk | |
uses: actions/cache@v4 | |
with: | |
path: ~/sdk | |
key: sdk-test-apple-${{ matrix.name }} | |
- name: Download different macOS SDK | |
if: matrix.sdk && steps.sdk-cache.outputs.cache-hit != 'true' | |
# macOS SDKs: | |
# - https://github.com/alexey-lysiuk/macos-sdk | |
# - https://github.com/phracker/MacOSX-SDKs | |
# - https://github.com/hexops/sdk-macos-12.0 | |
# | |
# iOS SDKs: | |
# - https://github.com/xybp888/iOS-SDKs | |
# - https://github.com/theos/sdks | |
run: | | |
wget https://github.com/alexey-lysiuk/macos-sdk/releases/download/${{ matrix.sdk }}/MacOSX${{ matrix.sdk }}.tar.bz2 | |
tar -xyf MacOSX${{ matrix.sdk }}.tar.bz2 | |
mv MacOSX${{ matrix.sdk }}.sdk $HOME/sdk | |
- name: Setup SDK environment | |
if: matrix.sdk | |
# This changes a variable, so is only set when a custom SDK is used | |
run: echo "SDKROOT=$HOME/sdk" >> $GITHUB_ENV | |
- name: Test without features | |
run: cargo test $ARGS $PUBLIC_CRATES -ptests | |
- name: Test Foundation | |
run: cargo test $ARGS $PUBLIC_CRATES -ptests $INTERESTING_FEATURES -pobjc2-foundation | |
- name: Test all frameworks | |
run: cargo test $ARGS $PUBLIC_CRATES -ptests $INTERESTING_FEATURES --features=catch-all $FRAMEWORKS_${{ matrix.frameworks }} | |
- name: Test Foundation in release mode | |
run: cargo test $ARGS $PUBLIC_CRATES -ptests $INTERESTING_FEATURES -pobjc2-foundation --features=catch-all --release | |
- name: Test Foundation with unstable features | |
if: ${{ matrix.nightly }} | |
run: cargo test $ARGS $PUBLIC_CRATES -ptests $INTERESTING_FEATURES -pobjc2-foundation --features=catch-all,unstable-autoreleasesafe ${{ matrix.sdk != '10.12' && '--features=unstable-simd' || '' }} | |
# TODO: Re-enable this on all of Foundation once we do some form of | |
# availability checking. | |
- name: Test static class and selectors | |
if: ${{ !contains(matrix.frameworks, 'IOS') && !contains(matrix.frameworks, 'MACOS_10_12') }} | |
run: >- | |
cargo test $ARGS $PUBLIC_CRATES -ptests -pobjc2-foundation | |
--features=unstable-static-sel,unstable-static-class,unstable-static-nsstring | |
--features=NSString | |
test-ios: | |
# if: ${{ env.FULL }} | |
if: ${{ github.head_ref == 'new-versions' || github.ref_name == 'ci-full' }} | |
name: Test on iOS simulator w. dinghy | |
runs-on: macos-13 | |
needs: | |
- fmt | |
- lint | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use stable toolchain | |
run: rustup override set stable | |
- name: Install simulator target | |
run: rustup target add x86_64-apple-ios | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Install cargo-dinghy | |
uses: taiki-e/install-action@v2 | |
with: | |
tool: [email protected] | |
- name: Launch XCode Simulator and prepare Dinghy | |
# Note that we're not testing all configurations with dinghy, since that | |
# takes a very long time to run, and hence impedes general development. | |
run: | | |
# Get system info | |
xcrun simctl list runtimes | |
# Launch the simulator | |
RUNTIME_ID=$(xcrun simctl list runtimes | grep iOS | cut -d ' ' -f 7 | tail -1) | |
SIM_ID=$(xcrun simctl create MyIphone com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro $RUNTIME_ID) | |
xcrun simctl boot $SIM_ID | |
# Export simulator ID | |
echo "SIM_ID=$SIM_ID" >> $GITHUB_ENV | |
- name: Test | |
run: cargo-dinghy --device=$SIM_ID test $PUBLIC_CRATES $FRAMEWORKS_IOS_10 -ptests $INTERESTING_FEATURES --features=catch-all | |
test-gnustep: | |
name: ${{ matrix.name }} | |
runs-on: ${{ matrix.os || 'ubuntu-latest' }} | |
needs: | |
- fmt | |
- lint | |
strategy: | |
# GNUStep tests are currently flaky, this makes it easier to see | |
fail-fast: false | |
matrix: | |
include: | |
- name: Test GNUStep with libobjc2 v1.9 | |
target: x86_64-unknown-linux-gnu | |
runtime: gnustep-1-9 | |
libobjc2: "1.9" | |
- name: Test GNUStep with libobjc2 v2.0 | |
# Fails for some reason on Ubuntu 22 | |
os: ubuntu-20.04 | |
target: x86_64-unknown-linux-gnu | |
runtime: gnustep-2-0 | |
libobjc2: "2.0" | |
- name: Test GNUStep with libobjc2 v2.1 on nightly | |
target: x86_64-unknown-linux-gnu | |
nightly: true | |
runtime: gnustep-2-1 | |
libobjc2: "2.1" | |
# fuzz: true # Disable fuzzing for now, it fails because it tries to load all symbols in Foundation | |
- name: Test GNUStep 32bit | |
# Ubuntu 22 image doesn't have the required C++ libraries | |
# installed for 32-bit | |
os: ubuntu-20.04 | |
target: i686-unknown-linux-gnu | |
cflags: -m32 | |
configureflags: --target=x86-pc-linux-gnu | |
runtime: gnustep-1-9 | |
libobjc2: "1.9" | |
env: | |
CARGO_BUILD_TARGET: ${{ matrix.target }} | |
CFLAGS: ${{ matrix.cflags }} | |
CXXFLAGS: ${{ matrix.cflags }} | |
ASMFLAGS: ${{ matrix.cflags }} | |
LDFLAGS: ${{ matrix.cflags }} | |
# http://wiki.gnustep.org/index.php/Building_GNUstep_under_Debian_FreeBSD#installing_gnustep-make | |
RUNTIME_VERSION: gnustep-${{ matrix.libobjc2 }} | |
# Exclude `objc2-exception-helper`, for some reason that can't be tested directly on GNUStep | |
PUBLIC_CRATES: >- | |
--package=block2 | |
--package=objc2 | |
--package=objc2-encode | |
--package=objc2-proc-macros | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Cache external dependencies | |
id: extern-cache | |
uses: actions/cache@v4 | |
with: | |
# We could have just cached build-files, and then rerun the build tool | |
# every time, letting it figure out what's changed. However, this has | |
# the problem that GNUStep-Base ./configure invalidates the cache, | |
# which makes it very hard to know when to rebuild and when not to. | |
# | |
# So instead we just place the final outputs in ~/extern, and cache | |
# them there: | |
# - bin/* | |
# - lib/libobjc.so | |
# - lib/libgnustep-base.so | |
# - include/Foundation/* | |
# - include/objc/* | |
path: | | |
~/extern/bin | |
~/extern/lib | |
~/extern/include | |
# Change this key if we start caching more things | |
key: extern-${{ github.job }}-${{ matrix.name }}-v1 | |
- name: Setup environment | |
# These add to PATH-like variables, so they can always be set | |
run: | | |
mkdir -p $HOME/extern/bin | |
mkdir -p $HOME/extern/lib | |
mkdir -p $HOME/extern/include | |
echo "PATH=$HOME/extern/bin:$PATH" >> $GITHUB_ENV | |
echo "LIBRARY_PATH=$HOME/extern/lib:$LIBRARY_PATH" >> $GITHUB_ENV | |
echo "LD_LIBRARY_PATH=$HOME/extern/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV | |
echo "CPATH=$HOME/extern/include:$CPATH" >> $GITHUB_ENV | |
# Debug print these | |
ls -al $HOME/extern/* | |
- name: Install Clang + Valgrind | |
run: | | |
sudo apt-get update | |
sudo apt-get -y install clang valgrind | |
- name: Install cross compilation tools | |
if: matrix.target == 'i686-unknown-linux-gnu' | |
run: | | |
sudo dpkg --add-architecture i386 | |
sudo apt-get update | |
sudo apt-get -y install gcc-multilib libgcc-10-dev:i386 \ | |
libc6-dev:i386 libstdc++-10-dev:i386 libffi-dev:i386 \ | |
libxml2-dev:i386 libicu-dev:i386 | |
- name: Install Make and Cmake | |
if: steps.extern-cache.outputs.cache-hit != 'true' | |
run: sudo apt-get -y install make cmake | |
- name: Install GNUStep libobjc2 | |
if: steps.extern-cache.outputs.cache-hit != 'true' | |
run: | | |
wget https://github.com/gnustep/libobjc2/archive/refs/tags/v${{ matrix.libobjc2 }}.tar.gz | |
tar -xzf v${{ matrix.libobjc2 }}.tar.gz | |
# Install robin-map on v2.1 | |
if test -d libobjc2-2.1; then | |
cd libobjc2-2.1/third_party | |
# Remove possibly existing `robin-map` folder | |
rm -rf robin-map | |
wget https://github.com/Tessil/robin-map/archive/757de829927489bee55ab02147484850c687b620.tar.gz | |
tar -xzf 757de829927489bee55ab02147484850c687b620.tar.gz | |
mv robin-map-757de829927489bee55ab02147484850c687b620 robin-map | |
cd ../.. | |
fi | |
mkdir -p libobjc2-${{ matrix.libobjc2 }}/build | |
cd libobjc2-${{ matrix.libobjc2 }}/build | |
cmake -Wno-dev -DCMAKE_INSTALL_PREFIX=$HOME/extern -DTESTS=OFF .. | |
make install | |
- name: Install GNUStep make | |
if: steps.extern-cache.outputs.cache-hit != 'true' | |
run: | | |
wget https://github.com/gnustep/tools-make/archive/refs/tags/make-2_9_0.tar.gz | |
tar -xzf make-2_9_0.tar.gz | |
mkdir -p tools-make-make-2_9_0/build | |
cd tools-make-make-2_9_0/build | |
../configure --prefix=$HOME/extern --with-library-combo=ng-gnu-gnu | |
make install | |
- name: Install GNUStep base library | |
if: steps.extern-cache.outputs.cache-hit != 'true' | |
run: | | |
wget https://github.com/gnustep/libs-base/archive/refs/tags/base-1_28_0.tar.gz | |
tar -xzf base-1_28_0.tar.gz | |
cd libs-base-base-1_28_0 | |
./configure --prefix=$HOME/extern --disable-tls --disable-xslt ${{ matrix.configureflags }} | |
make install | |
ls -al $HOME/extern/* | |
- name: Install GNUStep GUI | |
if: matrix.target == 'x86_64-unknown-linux-gnu' && steps.extern-cache.outputs.cache-hit != 'true' | |
run: | | |
wget https://github.com/gnustep/libs-gui/archive/refs/tags/gui-0_29_0.tar.gz | |
tar -xzf gui-0_29_0.tar.gz | |
cd libs-gui-gui-0_29_0 | |
./configure --prefix=$HOME/extern --disable-jpeg ${{ matrix.configureflags }} | |
make install | |
ls -al $HOME/extern/* | |
- name: Use nightly toolchain | |
if: ${{ matrix.nightly }} | |
run: | | |
rustup toolchain install ${{ env.CURRENT_NIGHTLY }} --profile=minimal --no-self-update | |
rustup override set ${{ env.CURRENT_NIGHTLY }} | |
- name: Use stable toolchain | |
if: ${{ !matrix.nightly }} | |
run: rustup override set stable | |
- name: Install target | |
if: ${{ matrix.target }} | |
run: rustup target add ${{ matrix.target }} | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Cache cargo-fuzz | |
if: ${{ matrix.fuzz }} | |
id: fuzz-cache | |
uses: actions/cache@v4 | |
with: | |
path: ~/.cargo/bin/cargo-fuzz | |
# Change this key if we update the required cargo-fuzz version | |
key: cargo-fuzz-${{ github.job }}-${{ matrix.name }}-v0-11-2 | |
- name: Install cargo-fuzz | |
if: ${{ matrix.fuzz && steps.fuzz-cache.outputs.cache-hit != 'true' }} | |
run: cargo install cargo-fuzz --version=^0.11.2 | |
- name: Test Foundation | |
run: cargo test --features=${{ matrix.runtime }} $PUBLIC_CRATES $INTERESTING_FEATURES -ptests -pobjc2-foundation --features=catch-all | |
- name: Test all frameworks | |
if: ${{ env.FULL && matrix.target == 'x86_64-unknown-linux-gnu' }} | |
run: cargo test --features=${{ matrix.runtime }} $PUBLIC_CRATES $INTERESTING_FEATURES -ptests $FRAMEWORKS_GNUSTEP --features=catch-all | |
- name: Test in release mode | |
# Disabled on GNUStep 2.1 for now | |
if: ${{ env.FULL && matrix.runtime != 'gnustep-2-1' }} | |
run: cargo test --features=${{ matrix.runtime }} $PUBLIC_CRATES -pobjc2-foundation --release | |
- name: Run fuzzing | |
if: ${{ matrix.fuzz }} | |
run: | | |
# Run each fuzz target for 100000 runs (approx. 5 seconds), and | |
# timeout after 2 seconds. | |
# | |
# We specify the number of runs explicitly instead of using | |
# `max_total_time`, to get more determinism. | |
for fuzz_target in $(cargo-fuzz list --fuzz-dir=./crates/test-fuzz/) | |
do | |
echo "Fuzzing $fuzz_target" | |
cargo-fuzz run --fuzz-dir=./crates/test-fuzz/ $fuzz_target --features=${{ matrix.runtime }},fuzz-all -- -runs=10000 -timeout=2 -jobs=10 | |
done | |
# Check if the fuzzer encountered something that should be added to | |
# the corpus. | |
git diff --exit-code | |
- name: Run benchmarks | |
# Disabled since it started failing for some reason | |
if: ${{ false }} | |
# Difficult to install Valgrind on macOS | |
# See https://github.com/LouisBrunner/valgrind-macos | |
run: cargo bench --features=${{ matrix.runtime }} | |
test-compiler-rt: | |
name: Test Compiler-RT | |
runs-on: ubuntu-latest | |
needs: | |
- fmt | |
- lint | |
env: | |
# `compiler-rt` is only relevant for block2 | |
PUBLIC_CRATES: --package=block2 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Use system Rust | |
run: rustup override set stable | |
- name: Cache Cargo | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.CARGO_CACHE_PATH }} | |
key: cargo-${{ github.job }}-${{ matrix.name }}-${{ hashFiles('**/Cargo.lock') }} | |
- name: Install clang + libBlocksRuntime | |
run: | | |
sudo apt-get update | |
sudo apt-get -y install clang libblocksruntime-dev | |
- name: Test | |
run: cargo test $PUBLIC_CRATES --features=compiler-rt | |
- name: Test in release mode | |
run: cargo test $PUBLIC_CRATES --features=compiler-rt --release |