Fix Rust panics in exception::catch
, and make it safe
#3106
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: | |
push: | |
branches: | |
# Once merged into `master` | |
- master | |
# And on `ci-full` to allow running time-consuming checks. | |
- 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-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-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_MACOS_15: --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_IOS_17: --package=objc2-accessibility --package=objc2-accounts --package=objc2-ad-services --package=objc2-ad-support --package=objc2-app-tracking-transparency --package=objc2-authentication-services --package=objc2-automatic-assessment-configuration --package=objc2-av-kit --package=objc2-background-assets --package=objc2-background-tasks --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-data-detection --package=objc2-device-check --package=objc2-event-kit --package=objc2-extension-kit --package=objc2-external-accessory --package=objc2-file-provider --package=objc2-file-provider-ui --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-health-kit --package=objc2-identity-lookup --package=objc2-link-presentation --package=objc2-local-authentication --package=objc2-local-authentication-embedded-ui --package=objc2-map-kit --package=objc2-media-player --package=objc2-metal --package=objc2-metal-kit --package=objc2-metric-kit --package=objc2-multipeer-connectivity --package=objc2-natural-language --package=objc2-nearby-interaction --package=objc2-network-extension --package=objc2-photos --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-sensitive-content-analysis --package=objc2-social --package=objc2-sound-analysis --package=objc2-speech --package=objc2-store-kit --package=objc2-symbols --package=objc2-ui-kit --package=objc2-uniform-type-identifiers --package=objc2-user-notifications --package=objc2-vision --package=objc2-web-kit | |
FRAMEWORKS_TVOS_17: --package=objc2-accessibility --package=objc2-ad-support --package=objc2-app-tracking-transparency --package=objc2-authentication-services --package=objc2-av-kit --package=objc2-background-tasks --package=objc2-cloud-kit --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-image --package=objc2-core-location --package=objc2-core-ml --package=objc2-data-detection --package=objc2-device-check --package=objc2-extension-kit --package=objc2-external-accessory --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-link-presentation --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-network-extension --package=objc2-photos --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-sound-analysis --package=objc2-store-kit --package=objc2-symbols --package=objc2-ui-kit --package=objc2-uniform-type-identifiers --package=objc2-user-notifications --package=objc2-vision | |
FRAMEWORKS_MAC_CATALYST_17: --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-background-tasks --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-ui --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-health-kit --package=objc2-identity-lookup --package=objc2-link-presentation --package=objc2-local-authentication --package=objc2-local-authentication-embedded-ui --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-photos --package=objc2-photos-ui --package=objc2-quartz-core --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-ui-kit --package=objc2-uniform-type-identifiers --package=objc2-user-notifications --package=objc2-vision --package=objc2-web-kit | |
FRAMEWORKS_VISIONOS_1: --package=objc2-accessibility --package=objc2-ad-services --package=objc2-app-tracking-transparency --package=objc2-authentication-services --package=objc2-automatic-assessment-configuration --package=objc2-av-kit --package=objc2-background-assets --package=objc2-background-tasks --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-data-detection --package=objc2-device-check --package=objc2-event-kit --package=objc2-extension-kit --package=objc2-external-accessory --package=objc2-file-provider --package=objc2-file-provider-ui --package=objc2-foundation --package=objc2-game-controller --package=objc2-game-kit --package=objc2-health-kit --package=objc2-identity-lookup --package=objc2-link-presentation --package=objc2-local-authentication --package=objc2-local-authentication-embedded-ui --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-multipeer-connectivity --package=objc2-natural-language --package=objc2-network-extension --package=objc2-photos --package=objc2-photos-ui --package=objc2-quartz-core --package=objc2-sound-analysis --package=objc2-speech --package=objc2-store-kit --package=objc2-symbols --package=objc2-ui-kit --package=objc2-uniform-type-identifiers --package=objc2-user-notifications --package=objc2-vision --package=objc2-web-kit | |
FRAMEWORKS_WATCHOS_10: --package=objc2-accessibility --package=objc2-authentication-services --package=objc2-av-kit --package=objc2-call-kit --package=objc2-cloud-kit --package=objc2-contacts --package=objc2-core-bluetooth --package=objc2-core-data --package=objc2-core-location --package=objc2-core-ml --package=objc2-core-motion --package=objc2-data-detection --package=objc2-device-check --package=objc2-event-kit --package=objc2-extension-kit --package=objc2-foundation --package=objc2-game-kit --package=objc2-health-kit --package=objc2-local-authentication --package=objc2-map-kit --package=objc2-media-player --package=objc2-natural-language --package=objc2-nearby-interaction --package=objc2-network-extension --package=objc2-photos-ui --package=objc2-sound-analysis --package=objc2-store-kit --package=objc2-symbols --package=objc2-ui-kit --package=objc2-uniform-type-identifiers --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-11-14 | |
# 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/ | |
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: | |
# Check three major architectures (x86_64, Aarch64 and any 32bit), and | |
# test three OS'es (macOS, iOS and a more obscure one, visionOS simulator). | |
# | |
# This should give us fairly good coverage for normal PRs. | |
- name: macOS x86_64 | |
target: x86_64-apple-darwin | |
args: $PUBLIC_CRATES $FRAMEWORKS_MACOS_14 $INTERESTING_FEATURES | |
- name: iOS ARMv7s | |
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_17 $INTERESTING_FEATURES -Zbuild-std | |
- name: visionOS Aarch64 simulator | |
target: aarch64-apple-visionos-sim | |
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_VISIONOS_1 $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: ubuntu-latest | |
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,gnustep-1-7 --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: ${{ github.ref_name == 'ci-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-15 # Aarch64 | |
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: | |
# This will take ~40 minutes | |
if: ${{ github.ref_name == 'ci-full' }} | |
name: Check framework features | |
runs-on: macos-15 # Aarch64 | |
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 | |
# We make sure to have at least one check on macOS that actually runs the code, | |
# but all other tests are only run if absolutely needed (see `test-apple` below). | |
test-macos: | |
name: Test macOS 15 Aarch64 | |
runs-on: macos-15 # Aarch64 | |
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: ${{ github.ref_name == 'ci-full' }} | |
name: ${{ matrix.test && 'Test' || 'Build' }} ${{ matrix.name }} | |
runs-on: ${{ matrix.os }} | |
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: | |
# Reasonably varied set of macOS targets. | |
- name: macOS 12 x86_64 | |
target: x86_64-apple-darwin | |
os: macos-12 # x86_64 | |
frameworks: MACOS_13 | |
test: true | |
- name: macOS 15 AArch64 | |
target: aarch64-apple-darwin | |
os: macos-15 # Aarch64 | |
frameworks: MACOS_15 | |
test: true | |
- name: macOS 14 Aarch64 nightly | |
target: aarch64-apple-darwin | |
os: macos-14 # Aarch64 | |
frameworks: MACOS_14 | |
nightly: true | |
test: true | |
# Old macOS targets. | |
- name: macOS 13 x86 with 10.13 SDK | |
target: i686-apple-darwin | |
# The SDK itself only supports compiling build scripts for x86_64 | |
os: macos-13 # x86_64 | |
frameworks: MACOS_10_13 | |
nightly: true | |
build-std: true | |
# Newest SDK that supports 32-bit | |
sdk: "10.13" | |
- name: macOS 13 x86_64 with 10.12 SDK | |
target: x86_64-apple-darwin | |
os: macos-13 # x86_64 | |
frameworks: MACOS_10_12 | |
# Oldest macOS version we support. | |
# The SDK itself only supports compiling build scripts for x86_64. | |
sdk: "10.12" | |
test: true | |
# A reasonably varied set of iOS/tvOS/watchOS/visionOS targets. | |
- name: iOS x86_64 simulator | |
target: x86_64-apple-ios | |
os: macos-14 # Aarch64 | |
frameworks: IOS_17 | |
- name: Mac Catalyst Aarch64 | |
target: aarch64-apple-ios-macabi | |
os: macos-14 # Aarch64 | |
frameworks: MAC_CATALYST_17 | |
test: true | |
- name: visionOS Aarch64 | |
target: aarch64-apple-visionos | |
os: macos-14 # Aarch64 | |
frameworks: VISIONOS_1 | |
nightly: true | |
build-std: true | |
- name: tvOS Aarch64 | |
target: aarch64-apple-tvos | |
os: macos-14 # Aarch64 | |
frameworks: TVOS_17 | |
nightly: true | |
build-std: true | |
- name: watchOS ARM64_32 | |
target: arm64_32-apple-watchos | |
os: macos-14 # Aarch64 | |
frameworks: WATCHOS_10 | |
nightly: true | |
build-std: true | |
- name: iOS ARMv7s | |
target: armv7s-apple-ios | |
os: macos-14 # Aarch64 | |
frameworks: IOS_10 | |
nightly: true | |
build-std: true | |
- name: iOS x86 | |
target: i386-apple-ios | |
os: macos-14 # Aarch64 | |
frameworks: IOS_10 | |
nightly: true | |
build-std: true | |
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.test && '' || '--no-run' }} | |
# Mac Catalyst requires a higher version. | |
IPHONEOS_DEPLOYMENT_TARGET: ${{ contains(matrix.target, 'macabi') && '13.1' || '10.0' }} | |
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: ${{ matrix.frameworks == 'MACOS_15' }} | |
run: >- | |
cargo test $ARGS $PUBLIC_CRATES -ptests -pobjc2-foundation | |
--features=unstable-static-sel,unstable-static-class,unstable-static-nsstring | |
--features=NSString | |
test-ios: | |
if: ${{ github.ref_name == 'ci-full' }} | |
name: Test on iOS simulator w. dinghy | |
runs-on: macos-13 # x86_64 | |
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: cargo-dinghy@0.6 | |
- 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: ${{ github.ref_name == 'ci-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: ${{ github.ref_name == 'ci-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 |