Skip to content

Implement runtime availability checking #3077

Implement runtime availability checking

Implement runtime availability checking #3077

Workflow file for this run

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