diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 09f5a23ffa..0c8ae3e218 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -168,6 +168,10 @@ jobs: --package-file Package@swift-6.1.swift \ --is-pr "${{ github.event_name == 'pull_request' }}" \ --change-path true + ./scripts/prepare-package.sh \ + --package-file Package@swift-6.2.swift \ + --is-pr "${{ github.event_name == 'pull_request' }}" \ + --change-path true - run: ./scripts/ci-select-xcode.sh 16.4 - run: swift build working-directory: Samples/macOS-SPM-CommandLine @@ -198,6 +202,10 @@ jobs: --package-file Package@swift-6.1.swift \ --is-pr "${{ github.event_name == 'pull_request' }}" \ --change-path true + ./scripts/prepare-package.sh \ + --package-file Package@swift-6.2.swift \ + --is-pr "${{ github.event_name == 'pull_request' }}" \ + --change-path true - run: ./scripts/ci-select-xcode.sh 16.4 - run: swift build working-directory: Samples/SPM-Dynamic @@ -228,6 +236,10 @@ jobs: --package-file Package@swift-6.1.swift \ --is-pr "${{ github.event_name == 'pull_request' }}" \ --change-path true + ./scripts/prepare-package.sh \ + --package-file Package@swift-6.2.swift \ + --is-pr "${{ github.event_name == 'pull_request' }}" \ + --change-path true - run: ./scripts/ci-select-xcode.sh 16.4 - run: swift build --target SentrySwiftUI - name: Run CI Diagnostics @@ -257,6 +269,10 @@ jobs: --package-file Package@swift-6.1.swift \ --is-pr "${{ github.event_name == 'pull_request' }}" \ --change-path true + ./scripts/prepare-package.sh \ + --package-file Package@swift-6.2.swift \ + --is-pr "${{ github.event_name == 'pull_request' }}" \ + --change-path true - run: ./scripts/ci-select-xcode.sh 16.4 - run: set -o pipefail &&xcodebuild build -scheme visionOS-SPM -sdk xros -destination 'generic/platform=xros' | tee raw-build-output-spm-visionOS.log | xcbeautify working-directory: Samples/visionOS-SPM diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 315192cc0f..56b5734903 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -112,12 +112,15 @@ jobs: - name: Prepare Package.swift shell: bash run: | - # Swift 6.1+ uses Package@swift-6.1.swift; hide it so prepare-package's + # Swift 6.1+ and 6.2+ uses Package@swift-6.1.swift and Package@swift-6.2.swift; hide it so prepare-package's # modified Package.swift is used (avoids "Multiple commands produce" from - # unmodified binary targets in the 6.1 manifest). + # unmodified binary targets in the 6.1 and 6.2 manifests). if [[ -f Package@swift-6.1.swift ]]; then mv Package@swift-6.1.swift Package@swift-6.1.swift.bak fi + if [[ -f Package@swift-6.2.swift ]]; then + mv Package@swift-6.2.swift Package@swift-6.2.swift.bak + fi ./scripts/prepare-package.sh \ --package-file Package.swift \ --is-pr "${{ github.event_name == 'pull_request' }}" \ diff --git a/CHANGELOG.md b/CHANGELOG.md index beab20f807..9d8b5eab17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Fixes +- Added `Package@swift-6.2.swift` to avoid issues with unsafe build flags on SPM > 6.2 (#7778) - Detect development builds via provisioning profile and debugger attachment (#7702) - Keep replayType as `buffer` for Session Replay triggered by an error (#7804) - Fix race condition in scope observer notifications causing EXC_BAD_ACCESS during cold launch (#7807) diff --git a/Package@swift-6.2.swift b/Package@swift-6.2.swift new file mode 100644 index 0000000000..9b99f5e486 --- /dev/null +++ b/Package@swift-6.2.swift @@ -0,0 +1,123 @@ +// swift-tools-version:6.2 + +#if canImport(Darwin) +import Darwin.C +#elseif canImport(Glibc) +import Glibc +#elseif canImport(MSVCRT) +import MSVCRT +#endif + +import PackageDescription + +var products: [Product] = [ + .library(name: "Sentry", targets: ["Sentry", "SentryCppHelper"]), + .library(name: "Sentry-Dynamic", targets: ["Sentry-Dynamic"]), + .library(name: "Sentry-Dynamic-WithARM64e", targets: ["Sentry-Dynamic-WithARM64e"]), + .library(name: "Sentry-WithoutUIKitOrAppKit", targets: ["Sentry-WithoutUIKitOrAppKit", "SentryCppHelper"]), + .library(name: "Sentry-WithoutUIKitOrAppKit-WithARM64e", targets: ["Sentry-WithoutUIKitOrAppKit-WithARM64e", "SentryCppHelper"]), + .library(name: "SentrySwiftUI", targets: ["Sentry", "SentrySwiftUI", "SentryCppHelper"]), + .library(name: "SentryDistribution", targets: ["SentryDistribution"]) +] + +var targets: [Target] = [ + .binaryTarget( + name: "Sentry", + url: "https://github.com/getsentry/sentry-cocoa/releases/download/9.10.0/Sentry.xcframework.zip", + checksum: "166692d02bb59fe9a158fe59b16e122fda40dddf6deaabed65a9e4b240f84c9b" //Sentry-Static + ), + .binaryTarget( + name: "Sentry-Dynamic", + url: "https://github.com/getsentry/sentry-cocoa/releases/download/9.10.0/Sentry-Dynamic.xcframework.zip", + checksum: "1dd70512f3b5af6c74f1b8f11279531900173fb638d7d541320a7cbc00ed06bc" //Sentry-Dynamic + ), + .binaryTarget( + name: "Sentry-Dynamic-WithARM64e", + url: "https://github.com/getsentry/sentry-cocoa/releases/download/9.10.0/Sentry-Dynamic-WithARM64e.xcframework.zip", + checksum: "7d981d7ad0686c5fd68c791b721820a360285dc711e2b23e79114a6a62d799a6" //Sentry-Dynamic-WithARM64e + ), + .binaryTarget( + name: "Sentry-WithoutUIKitOrAppKit", + url: "https://github.com/getsentry/sentry-cocoa/releases/download/9.10.0/Sentry-WithoutUIKitOrAppKit.xcframework.zip", + checksum: "8c70de11731587e2c615089464820b67d8f0103b5e019d81a16b0cac31e33e65" //Sentry-WithoutUIKitOrAppKit + ), + .binaryTarget( + name: "Sentry-WithoutUIKitOrAppKit-WithARM64e", + url: "https://github.com/getsentry/sentry-cocoa/releases/download/9.10.0/Sentry-WithoutUIKitOrAppKit-WithARM64e.xcframework.zip", + checksum: "abd3b0836ce6637cbc274e7d979b345ec3c2f46857d5412e78c1d2f0fe3397b0" //Sentry-WithoutUIKitOrAppKit-WithARM64e + ), + .target( + name: "SentrySwiftUI", + dependencies: ["Sentry"], + path: "Sources/SentrySwiftUI", + exclude: ["module.modulemap"], + linkerSettings: [ + .linkedFramework("Sentry") + ] + ), + .target( + name: "SentryCppHelper", + path: "Sources/SentryCppHelper", + linkerSettings: [ + .linkedLibrary("c++") + ] + ), + .target(name: "SentryDistribution", path: "Sources/SentryDistribution"), + .testTarget(name: "SentryDistributionTests", dependencies: ["SentryDistribution"], path: "Sources/SentryDistributionTests") +] + +// Targets required to support compile-from-source builds via SPM. +products.append(.library(name: "SentrySPM", targets: ["SentryObjCInternal"])) +targets += [ + // At least one source file is required, therefore we use a dummy class to satisfy the SPM build system + .target( + name: "SentryHeaders", + path: "Sources/Sentry", + sources: ["SentryDummyPublicEmptyClass.m"], + publicHeadersPath: "Public" + ), + .target( + name: "_SentryPrivate", + dependencies: ["SentryHeaders"], + path: "Sources/Sentry", + sources: ["SentryDummyPrivateEmptyClass.m"], + publicHeadersPath: "include"), + .target( + name: "SentrySwift", + dependencies: ["_SentryPrivate", "SentryHeaders"], + path: "Sources/Swift", + swiftSettings: [ + .unsafeFlags(["-enable-library-evolution"]), + .define("SENTRY_NO_UI_FRAMEWORK", .when(traits: ["NoUIFramework"])) + ]), + + // SentryObjCInternal compiles all ObjC/C sources from the repo. Named "Internal" + // to reserve "SentryObjC" for a future public Objective-C wrapper around the SDK. + .target( + name: "SentryObjCInternal", + dependencies: ["SentrySwift"], + path: "Sources", + exclude: ["Sentry/SentryDummyPublicEmptyClass.m", "Sentry/SentryDummyPrivateEmptyClass.m", "Swift", "SentrySwiftUI", "Resources", "Configuration", "SentryCppHelper", "SentryDistribution", "SentryDistributionTests"], + cSettings: [ + .headerSearchPath("Sentry"), + .headerSearchPath("SentryCrash/Recording"), + .headerSearchPath("SentryCrash/Recording/Monitors"), + .headerSearchPath("SentryCrash/Recording/Tools"), + .headerSearchPath("SentryCrash/Installations"), + .headerSearchPath("SentryCrash/Reporting/Filters"), + .headerSearchPath("SentryCrash/Reporting/Filters/Tools"), + .define("SENTRY_NO_UI_FRAMEWORK", to: "1", .when(traits: ["NoUIFramework"])) + ]) +] + +let package = Package( + name: "Sentry", + platforms: [.iOS(.v15), .macOS(.v10_14), .tvOS(.v15), .watchOS(.v8), .visionOS(.v1)], + products: products, + traits: [ + .init(name: "NoUIFramework", description: "Build without UIKit/AppKit framework linkage. Use for command-line tools or contexts where UI frameworks are unavailable.") + ], + targets: targets, + swiftLanguageModes: [.v5], + cxxLanguageStandard: .cxx14 +) diff --git a/Utils/VersionBump/main.swift b/Utils/VersionBump/main.swift index 80d35ca928..ed27395e68 100644 --- a/Utils/VersionBump/main.swift +++ b/Utils/VersionBump/main.swift @@ -40,6 +40,7 @@ let files = [ "./Sentry.podspec", "./Package.swift", "./Package@swift-6.1.swift", + "./Package@swift-6.2.swift", "./SentrySwiftUI.podspec", "./Sources/Sentry/SentryMeta.m", "./3rd-party-integrations/SentrySwiftLog/Package.swift",