From 230aa175d89ce9ac8de1690ff8ffe2bb34369107 Mon Sep 17 00:00:00 2001 From: Dhiogo Brustolin Date: Thu, 1 Dec 2022 10:53:29 -0300 Subject: [PATCH 01/10] chore: Update craft to publish both podspecs (#2477) Added SentryPrivate.podspec to be published by craft --- .craft.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.craft.yml b/.craft.yml index c60d251142d..6d5f131f7a9 100644 --- a/.craft.yml +++ b/.craft.yml @@ -3,6 +3,8 @@ changelogPolicy: auto preReleaseCommand: bash ./scripts/bump.sh targets: - name: github + - name: cocoapods + specPath: SentryPrivate.podspec - name: cocoapods specPath: Sentry.podspec - name: registry From a0c8696be39095bc3d73b11ccf82afe11523361a Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Thu, 1 Dec 2022 16:28:49 +0100 Subject: [PATCH 02/10] ci: Fix Codecov (#2472) Fix codecov by using slather. --- .github/workflows/test.yml | 11 ++++++++++- Gemfile.lock | 2 +- Makefile | 2 +- scripts/xcode-test.sh | 8 ++++---- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index acf18d04189..63485826bd3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -180,6 +180,12 @@ jobs: # manipulating string in expressions. run: ./scripts/xcode-test.sh ${{matrix.platform}} ${{matrix.test-destination-os}} $GITHUB_REF_NAME + - name: Run Slather + if: success() + run: | + gem install slather + slather coverage -x --output-directory slather/ --scheme Sentry --workspace Sentry.xcworkspace Sentry.xcodeproj + - name: Archiving DerivedData Logs uses: actions/upload-artifact@v3 if: failure() @@ -200,11 +206,14 @@ jobs: # See https://docs.codecov.io/docs/merging-reports # Checkout .codecov.yml to see the config of Codecov - name: Push code coverage to codecov - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3 + uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3.1.1 # SentrySystemEventsBreadcrumbsTest only run on Catalyst and iOS # so the coverage report shows a reduced coverage. if: ${{ contains(matrix.platform, 'Mac Catalyst') || contains(matrix.platform, 'iOS') }} + with: + fail_ci_if_error: true + verbose: true # We don't run all unit tests with Thread Sanitizer enabled because # that adds a significant overhead. diff --git a/Gemfile.lock b/Gemfile.lock index 16f9357a92d..4473934b048 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -296,4 +296,4 @@ DEPENDENCIES xcpretty BUNDLED WITH - 2.3.23 + 2.3.21 diff --git a/Makefile b/Makefile index 2d9603a2500..a9f7a395aa2 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ format-swift: test: @echo "--> Running all tests" - xcodebuild -workspace Sentry.xcworkspace -scheme Sentry -configuration Test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES -destination "platform=macOS" test | rbenv exec bundle exec xcpretty -t + xcodebuild -workspace Sentry.xcworkspace -scheme Sentry -configuration Test GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES -enableCodeCoverage YES -destination "platform=macOS" test | rbenv exec bundle exec xcpretty -t .PHONY: test run-test-server: diff --git a/scripts/xcode-test.sh b/scripts/xcode-test.sh index 5f4a35a09f7..1bd057fbdba 100755 --- a/scripts/xcode-test.sh +++ b/scripts/xcode-test.sh @@ -62,13 +62,13 @@ if [ $PLATFORM == "iOS" -a $OS == "12.4" ]; then # Skip some tests that fail on iOS 12.4. env NSUnbufferedIO=YES xcodebuild -workspace Sentry.xcworkspace \ -scheme Sentry -configuration $CONFIGURATION \ - GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES -destination "$DESTINATION" \ + GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES -enableCodeCoverage YES -destination "$DESTINATION" \ -skip-testing:"SentryTests/SentrySDKTests/testMemoryFootprintOfAddingBreadcrumbs" \ -skip-testing:"SentryTests/SentrySDKTests/testMemoryFootprintOfTransactions" \ - test | tee raw-test-output.log | $RUBY_ENV_ARGS xcpretty -t -r junit && exit ${PIPESTATUS[0]} + test | tee raw-test-output.log | $RUBY_ENV_ARGS xcpretty -t && exit ${PIPESTATUS[0]} else env NSUnbufferedIO=YES xcodebuild -workspace Sentry.xcworkspace \ -scheme Sentry -configuration $CONFIGURATION \ - GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES -destination "$DESTINATION" \ - test | tee raw-test-output.log | $RUBY_ENV_ARGS xcpretty -t -r junit && exit ${PIPESTATUS[0]} + GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES -enableCodeCoverage YES -destination "$DESTINATION" \ + test | tee raw-test-output.log | $RUBY_ENV_ARGS xcpretty -t && exit ${PIPESTATUS[0]} fi From a7450910118ddbf9b94b21ea3b60e2be06a864e8 Mon Sep 17 00:00:00 2001 From: Dhiogo Brustolin Date: Thu, 1 Dec 2022 14:01:27 -0300 Subject: [PATCH 03/10] fix: Version bump script (#2478) Fixed version bump script. Added ids to craft targets. --- .craft.yml | 2 ++ Utils/VersionBump/main.swift | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.craft.yml b/.craft.yml index 6d5f131f7a9..67788e5eab9 100644 --- a/.craft.yml +++ b/.craft.yml @@ -4,8 +4,10 @@ preReleaseCommand: bash ./scripts/bump.sh targets: - name: github - name: cocoapods + id: sentryprivate-cocoapod specPath: SentryPrivate.podspec - name: cocoapods + id: sentry-cocoapod specPath: Sentry.podspec - name: registry sdks: diff --git a/Utils/VersionBump/main.swift b/Utils/VersionBump/main.swift index 3b11e125c82..de8776741c5 100644 --- a/Utils/VersionBump/main.swift +++ b/Utils/VersionBump/main.swift @@ -24,7 +24,7 @@ if regex.firstMatch(in: args[1]) == nil { let fromVersionFileHandler = try open(fromVersionFile) let fromFileContent: String = fromVersionFileHandler.read() -for match in Regex(semver, options: [.dotMatchesLineSeparators]).allMatches(in: fromFileContent) { +if let match = Regex(semver, options: [.dotMatchesLineSeparators]).firstMatch(in: fromFileContent) { let fromVersion = match.matchedString let toVersion = args[1] From d8c347f481095a85cded4857f5d8f4c709907722 Mon Sep 17 00:00:00 2001 From: Andrew McKnight Date: Thu, 1 Dec 2022 14:05:10 -0800 Subject: [PATCH 04/10] fix: profiling app release version format (#2470) * fix: list versions the same way they are reported elsewhere in sentry --- CHANGELOG.md | 1 + Sources/Sentry/SentryProfiler.mm | 7 +------ Tests/SentryTests/Profiling/SentryProfilerSwiftTests.swift | 7 ++++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8d6640e8e3..83119678ede 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ This version adds a dependency on Swift. - Increase `SentryCrashMAX_STRINGBUFFERSIZE` to reduce the instances where we're dropping a crash due to size limit (#2465) - `SentryAppStateManager` correctly unsubscribes from `NSNotificationCenter` when closing the SDK (#2460) - The SDK no longer reports an OOM when a crash happens after closing the SDK (#2468) +- Use the preexisting app release version format for profiles (#2470) ### Breaking Changes diff --git a/Sources/Sentry/SentryProfiler.mm b/Sources/Sentry/SentryProfiler.mm index 7d6be5a23fe..99d0c7ad6ee 100644 --- a/Sources/Sentry/SentryProfiler.mm +++ b/Sources/Sentry/SentryProfiler.mm @@ -548,12 +548,7 @@ - (void)captureEnvelope profile[@"platform"] = _transactions.firstObject.platform; profile[@"environment"] = _hub.scope.environmentString ?: _hub.getClient.options.environment; profile[@"timestamp"] = [[SentryCurrentDate date] sentry_toIso8601String]; - - const auto bundle = NSBundle.mainBundle; - profile[@"release"] = - [NSString stringWithFormat:@"%@ (%@)", - [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey], - [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]]; + profile[@"release"] = _hub.getClient.options.releaseName; # if SENTRY_HAS_UIKIT auto relativeFrameTimestampsNs = [NSMutableArray array]; diff --git a/Tests/SentryTests/Profiling/SentryProfilerSwiftTests.swift b/Tests/SentryTests/Profiling/SentryProfilerSwiftTests.swift index 98fcb74c3d2..e383e94327f 100644 --- a/Tests/SentryTests/Profiling/SentryProfilerSwiftTests.swift +++ b/Tests/SentryTests/Profiling/SentryProfilerSwiftTests.swift @@ -270,9 +270,10 @@ private extension SentryProfilerSwiftTests { XCTAssertEqual(transactionEnvironment, profile["environment"] as! String) - let version = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) ?? "(null)" - let build = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "(null)" - let releaseString = "\(version) (\(build))" + let bundleID = Bundle.main.object(forInfoDictionaryKey: kCFBundleIdentifierKey as String) ?? "(null)" + let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "(null)" + let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) ?? "(null)" + let releaseString = "\(bundleID)@\(version)+\(build)" XCTAssertEqual(profile["release"] as! String, releaseString) XCTAssertNotEqual(SentryId.empty, SentryId(uuidString: profile["profile_id"] as! String)) From 5ce81fdb6fbd0d597d5c6e6d9ba878030c43670b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Dec 2022 11:30:51 +0100 Subject: [PATCH 05/10] build(deps): bump actions/stale from 5.1.1 to 6.0.1 (#2482) Bumps [actions/stale](https://github.com/actions/stale) from 5.1.1 to 6.0.1. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/9c1b1c6e115ca2af09755448e0dbba24e5061cc8...5ebf00ea0e4c1561e9b43a292ed34424fb1d4578) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index fcc7ef0aaaa..c4dc92d958c 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -7,7 +7,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@9c1b1c6e115ca2af09755448e0dbba24e5061cc8 + - uses: actions/stale@5ebf00ea0e4c1561e9b43a292ed34424fb1d4578 with: repo-token: ${{ github.token }} days-before-stale: 21 From 5da2d4808c297772e288cc9fa4e815d26696738b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Dec 2022 12:35:24 +0100 Subject: [PATCH 06/10] build(deps): bump github/codeql-action from 2.1.32 to 2.1.35 (#2481) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.1.32 to 2.1.35. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/4238421316c33d73aeea2801274dd286f157c2bb...b2a92eb56d8cb930006a1c6ed86b0782dd8a4297) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b4cc7f32f91..664ee22c713 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -22,7 +22,7 @@ jobs: uses: actions/checkout@v3 - name: Initialize CodeQL - uses: github/codeql-action/init@4238421316c33d73aeea2801274dd286f157c2bb # pin@v2 + uses: github/codeql-action/init@b2a92eb56d8cb930006a1c6ed86b0782dd8a4297 # pin@v2 with: languages: ${{ matrix.language }} @@ -35,4 +35,4 @@ jobs: -destination platform="iOS Simulator,OS=latest,name=iPhone 11 Pro" - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@4238421316c33d73aeea2801274dd286f157c2bb # pin@v2 + uses: github/codeql-action/analyze@b2a92eb56d8cb930006a1c6ed86b0782dd8a4297 # pin@v2 From dd2e1012d358906e561734071b422b1e283488d5 Mon Sep 17 00:00:00 2001 From: Andrew McKnight Date: Fri, 2 Dec 2022 14:50:36 -0800 Subject: [PATCH 07/10] fix: remove reference to context property that was removed (#2480) --- .../TrendingMovies/TrendingMovies/Utilities/Tracer.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Samples/TrendingMovies/TrendingMovies/Utilities/Tracer.swift b/Samples/TrendingMovies/TrendingMovies/Utilities/Tracer.swift index 7f46254c6b8..b0c36b8112f 100644 --- a/Samples/TrendingMovies/TrendingMovies/Utilities/Tracer.swift +++ b/Samples/TrendingMovies/TrendingMovies/Utilities/Tracer.swift @@ -75,12 +75,12 @@ extension Tracer { var span: Span func annotate(key: String, value: String) { - print("[TrendingMovies] annotating span \(span.context.spanId.sentrySpanIdString), key \(key) and value \(value)") - span.context.setTag(value: value, key: key) + print("[TrendingMovies] annotating span \(span.spanId.sentrySpanIdString), key \(key) and value \(value)") + span.setTag(value: value, key: key) } func end() { - print("[TrendingMovies] ending span \(span.context.spanId.sentrySpanIdString)") + print("[TrendingMovies] ending span \(span.spanId.sentrySpanIdString)") span.finish() } } From b9c959862d9576d98fd11f792027c38d8184810e Mon Sep 17 00:00:00 2001 From: Andrew McKnight Date: Fri, 2 Dec 2022 15:46:09 -0800 Subject: [PATCH 08/10] ci: fix caching in some CI jobs (#2479) * run the job when trendingmovies sources change or public sentry headers change * fix: cache keys pointing to hashes of files at invalid paths --- .github/workflows/benchmarking.yml | 2 +- .github/workflows/profile-data-generator.yml | 6 +++++- .github/workflows/saucelabs-UI-tests.yml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/benchmarking.yml b/.github/workflows/benchmarking.yml index 82aeabe4a33..0c9d71432b3 100644 --- a/.github/workflows/benchmarking.yml +++ b/.github/workflows/benchmarking.yml @@ -38,7 +38,7 @@ jobs: path: | DerivedData/Build/Products/Debug-iphoneos/iOS-Swift.app.dSYM DerivedData/Build/Products/Debug-iphoneos/iOS-Swift.app - key: ios-swift-for-ui-testing-cache-key-${{ hashFiles('Samples/iOS-Swift/iOS-Swift/**') }}-${{ hashFiles('Sentry/Sources/**') }} + key: ios-swift-for-ui-testing-cache-key-${{ hashFiles('Samples/iOS-Swift/iOS-Swift/**') }}-${{ hashFiles('Sources/Sentry/**') }} - name: Cache iOS-Swift UI Test Runner App build product id: ios-swift-benchmark-runner-cache uses: actions/cache@v3 diff --git a/.github/workflows/profile-data-generator.yml b/.github/workflows/profile-data-generator.yml index d107d6ca99e..dc2e513d458 100644 --- a/.github/workflows/profile-data-generator.yml +++ b/.github/workflows/profile-data-generator.yml @@ -4,6 +4,10 @@ name: Generate Profiling Test Data on: schedule: - cron: '0 */6 * * *' # every 6 hours = 4x/day + pull_request: + paths: + - 'Sources/Sentry/Public/**' + - 'Samples/TrendingMovies/**' jobs: build-profile-data-generator-targets: @@ -30,7 +34,7 @@ jobs: path: | DerivedData/Build/Products/Debug-iphoneos/TrendingMovies.app DerivedData/Build/Products/Debug-iphoneos/TrendingMovies.app.dSYM - key: trendingmovies-app-cache-key-${{ hashFiles('Samples/TrendingMovies/TrendingMovies/**') }}-${{ hashFiles('Sentry/Sources/**') }} + key: trendingmovies-app-cache-key-${{ hashFiles('Samples/TrendingMovies/TrendingMovies/**') }}-${{ hashFiles('Sources/Sentry/**') }} - name: Cache ProfileDataGenerator UI Test Runner App build product id: cache-profiledatagenerator-test-runner-app uses: actions/cache@v3 diff --git a/.github/workflows/saucelabs-UI-tests.yml b/.github/workflows/saucelabs-UI-tests.yml index abf2a2f39d6..cf33f714177 100644 --- a/.github/workflows/saucelabs-UI-tests.yml +++ b/.github/workflows/saucelabs-UI-tests.yml @@ -45,7 +45,7 @@ jobs: path: | DerivedData/Build/Products/Debug-iphoneos/iOS-Swift.app.dSYM DerivedData/Build/Products/Debug-iphoneos/iOS-Swift.app - key: ios-swift-for-ui-testing-cache-key-${{ hashFiles('Samples/iOS-Swift/iOS-Swift/**') }}-Xcode-${{ matrix.xcode }}-${{ hashFiles('Sentry/Sources/**') }} + key: ios-swift-for-ui-testing-cache-key-${{ hashFiles('Samples/iOS-Swift/iOS-Swift/**') }}-Xcode-${{ matrix.xcode }}-${{ hashFiles('Sources/Sentry/**') }} - name: Cache iOS-Swift UI Test Runner App build product id: ios-swift-uitest-runner-cache uses: actions/cache@v3 From b696ae1bcb075245cdaa8e6d55afdc8d5a27eeb5 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Mon, 5 Dec 2022 11:38:17 +0100 Subject: [PATCH 09/10] ci: Various fixes for Codecov (#2485) Run slather only for iOS. Fixes for codecov.yml --- .github/.codecov.yml | 9 +++++---- .github/workflows/test.yml | 18 ++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/.codecov.yml b/.github/.codecov.yml index c55d289c049..677373d8b40 100644 --- a/.github/.codecov.yml +++ b/.github/.codecov.yml @@ -1,9 +1,11 @@ codecov: + branch: 8.0.0 + require_ci_to_pass: yes notify: - after_n_builds: 2 # Wait for both iOS and Mac Catalyst to finish + wait_for_ci: yes coverage: - range: "93...100" + range: 85...100 parsers: gcov: @@ -14,11 +16,10 @@ parsers: macro: no ignore: - - "Sources/SentryCrash" - "Tests/SentryTests" comment: layout: "reach,diff,flags,files,footer" behavior: default require_changes: no - after_n_builds: 2 # Wait for both iOS and Mac Catalyst to finish + after_n_builds: 5 # Wait for all jobs uploading reports diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 63485826bd3..a5f4ed4ce99 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -180,12 +180,6 @@ jobs: # manipulating string in expressions. run: ./scripts/xcode-test.sh ${{matrix.platform}} ${{matrix.test-destination-os}} $GITHUB_REF_NAME - - name: Run Slather - if: success() - run: | - gem install slather - slather coverage -x --output-directory slather/ --scheme Sentry --workspace Sentry.xcworkspace Sentry.xcodeproj - - name: Archiving DerivedData Logs uses: actions/upload-artifact@v3 if: failure() @@ -202,15 +196,19 @@ jobs: path: | raw-test-output.log + # Some tests run only on iOS so we only collect code coverage there. + - name: Run Slather + if: success() && ${{ contains(matrix.platform, 'iOS') }} + run: | + gem install slather + slather coverage -x --output-directory slather/ --scheme Sentry --workspace Sentry.xcworkspace Sentry.xcodeproj + # We can upload all coverage reports, because codecov merges them. # See https://docs.codecov.io/docs/merging-reports # Checkout .codecov.yml to see the config of Codecov - name: Push code coverage to codecov uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3.1.1 - - # SentrySystemEventsBreadcrumbsTest only run on Catalyst and iOS - # so the coverage report shows a reduced coverage. - if: ${{ contains(matrix.platform, 'Mac Catalyst') || contains(matrix.platform, 'iOS') }} + if: ${{ contains(matrix.platform, 'iOS') }} with: fail_ci_if_error: true verbose: true From c6fb5a93534d6da11c0ebc8d60e28a67e5774a16 Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Mon, 5 Dec 2022 11:48:41 +0100 Subject: [PATCH 10/10] chore: Bump minimum Xcode version to 13 (#2483) --- .github/workflows/build.yml | 20 - .github/workflows/saucelabs-UI-tests.yml | 6 +- .github/workflows/test.yml | 22 +- CHANGELOG.md | 1 + Makefile | 11 - .../Carthage-Validation/Framework/Cartfile | 1 - .../Framework.xcodeproj/project.pbxproj | 410 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../Framework/Framework/AppDelegate.swift | 31 -- .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/Contents.json | 98 ----- .../Framework/Assets.xcassets/Contents.json | 6 - .../Base.lproj/LaunchScreen.storyboard | 25 -- .../Framework/Framework/ContentView.swift | 18 - .../Framework/Framework/Info.plist | 62 --- .../Preview Assets.xcassets/Contents.json | 6 - .../Framework/Framework/SceneDelegate.swift | 53 --- .../Framework/input.xcfilelist | 1 - .../Framework/output.xcfilelist | 1 - Samples/Carthage-Validation/README.md | 10 +- develop-docs/README.md | 12 + scripts/carthage-xcode12-workaround.sh | 20 - 23 files changed, 37 insertions(+), 803 deletions(-) delete mode 100644 Samples/Carthage-Validation/Framework/Cartfile delete mode 100644 Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.pbxproj delete mode 100644 Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 Samples/Carthage-Validation/Framework/Framework/AppDelegate.swift delete mode 100644 Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/Contents.json delete mode 100644 Samples/Carthage-Validation/Framework/Framework/Base.lproj/LaunchScreen.storyboard delete mode 100644 Samples/Carthage-Validation/Framework/Framework/ContentView.swift delete mode 100644 Samples/Carthage-Validation/Framework/Framework/Info.plist delete mode 100644 Samples/Carthage-Validation/Framework/Framework/Preview Content/Preview Assets.xcassets/Contents.json delete mode 100644 Samples/Carthage-Validation/Framework/Framework/SceneDelegate.swift delete mode 100644 Samples/Carthage-Validation/Framework/input.xcfilelist delete mode 100644 Samples/Carthage-Validation/Framework/output.xcfilelist delete mode 100755 scripts/carthage-xcode12-workaround.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9b3baf77971..09a586bff21 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -98,26 +98,6 @@ jobs: path: | ${{ github.workspace }}/*.zip - # The framework requires Xcode 12 - build-framework: - name: Build & Validate Framework - runs-on: macos-11 - steps: - - uses: actions/checkout@v3 - - run: ./scripts/ci-select-xcode.sh 12.5.1 - - run: make build-framework - shell: sh - - run: make build-framework-sample - shell: sh - - - name: Archiving Framework.zip - uses: actions/upload-artifact@v3 - with: - name: ${{ github.sha }} - if-no-files-found: error - path: | - ${{ github.workspace }}/*.zip - # Use github.event.pull_request.head.sha instead of github.sha when available as # the github.sha is be the pre merge commit id for PRs. # See https://github.community/t/github-sha-isnt-the-value-expected/17903/17906. diff --git a/.github/workflows/saucelabs-UI-tests.yml b/.github/workflows/saucelabs-UI-tests.yml index cf33f714177..e12421df2c3 100644 --- a/.github/workflows/saucelabs-UI-tests.yml +++ b/.github/workflows/saucelabs-UI-tests.yml @@ -26,12 +26,12 @@ jobs: strategy: matrix: include: - - runs-on: macos-11 - xcode: '12.5.1' - - runs-on: macos-12 xcode: '13.4.1' + - runs-on: macos-12 + xcode: '14.1' + steps: - uses: actions/checkout@v3 - run: ./scripts/ci-select-xcode.sh ${{matrix.xcode}} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a5f4ed4ce99..cc5db69e8d2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -91,8 +91,8 @@ jobs: # iOS 14 - runs-on: macos-11 platform: 'iOS' - xcode: '12.5.1' - test-destination-os: 'latest' + xcode: '13.2.1' + test-destination-os: '14.5' timeout-minutes: 15 # iOS 15 @@ -112,7 +112,7 @@ jobs: # macOS 11 - runs-on: macos-11 platform: 'macOS' - xcode: '12.5.1' + xcode: '13.2.1' test-destination-os: 'latest' timeout-minutes: 15 @@ -132,6 +132,8 @@ jobs: test-destination-os: 'latest' timeout-minutes: 15 + # MetricKit doesn't exist for tvOS, so we can still run unit tests with + # Xcode 12 for it. # tvOS 14 - runs-on: macos-11 platform: 'tvOS' @@ -173,6 +175,14 @@ jobs: sudo ln -s /Applications/Xcode_11.7.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\ 13.7.simruntime xcrun simctl create custom-test-device "iPhone 8" "com.apple.CoreSimulator.SimRuntime.iOS-13-7" + # Workaround with a symlink pointed out in: https://github.com/actions/virtual-environments/issues/551#issuecomment-637344435 + - name: Prepare iOS 14.5 simulator + if: ${{ matrix.platform == 'iOS' && matrix.test-destination-os == '14.5'}} + run: | + sudo mkdir -p /Library/Developer/CoreSimulator/Profiles/Runtimes + sudo ln -s /Applications/Xcode_12.5.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\ 14.5.simruntime + xcrun simctl create custom-test-device "iPhone 8" "com.apple.CoreSimulator.SimRuntime.iOS-14-5" + - name: Running tests # We call a script with the platform so the destination # passed to xcodebuild doesn't end up in the job name, @@ -286,9 +296,9 @@ jobs: xcode: '13.4.1' device: 'iPhone 8 (15.2)' - - runs-on: macos-11 - xcode: '12.5.1' - device: 'iPhone 8 (14.5)' + - runs-on: macos-12 + xcode: '14.1' + device: 'iPhone 8 (16.1)' steps: - uses: actions/checkout@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 83119678ede..c6c409b721c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ This version adds a dependency on Swift. - Rename `SentryOptions.enableFileIOTracking` to `enableFileIOTracing` - Rename `SentryOptions.enableCoreDataTracking` to `enableCoreDataTracing` - SentrySDK.close calls flush, which is a blocking call (#2453) +- Bump minimum Xcode version to 13 (#2483) ## 7.31.3 diff --git a/Makefile b/Makefile index a9f7a395aa2..e79704e8f28 100644 --- a/Makefile +++ b/Makefile @@ -62,17 +62,6 @@ build-xcframework-sample: cd Samples/Carthage-Validation/XCFramework/ && carthage update --use-xcframeworks xcodebuild -project "Samples/Carthage-Validation/XCFramework/XCFramework.xcodeproj" -configuration Release CODE_SIGNING_ALLOWED="NO" build -# Building the .frameworsk.zip only works with Xcode 12, as there is no workaround yet for Xcode 13. -build-framework: - @echo "--> Carthage: creating Sentry framework" - ./scripts/carthage-xcode12-workaround.sh build --no-skip-current - ./scripts/carthage-xcode12-workaround.sh archive Sentry --output Sentry.framework.zip - -build-framework-sample: - ./scripts/create-carthage-json.sh - cd Samples/Carthage-Validation/Framework/ && carthage update - xcodebuild -project "Samples/Carthage-Validation/Framework/Framework.xcodeproj" -configuration Release CODE_SIGNING_ALLOWED="NO" build - ## Build Sentry as a XCFramework that can be used with watchOS and save it to ## the watchOS sample. watchOSLibPath = ./Samples/watchOS-Swift/libs diff --git a/Samples/Carthage-Validation/Framework/Cartfile b/Samples/Carthage-Validation/Framework/Cartfile deleted file mode 100644 index b05656691a6..00000000000 --- a/Samples/Carthage-Validation/Framework/Cartfile +++ /dev/null @@ -1 +0,0 @@ -binary "../Sentry.Carthage.json" ~> 1.0 diff --git a/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.pbxproj b/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.pbxproj deleted file mode 100644 index 92fe2aa4783..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.pbxproj +++ /dev/null @@ -1,410 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 7BA13E57267B851B00DEE308 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA13E56267B851B00DEE308 /* AppDelegate.swift */; }; - 7BA13E59267B851B00DEE308 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA13E58267B851B00DEE308 /* SceneDelegate.swift */; }; - 7BA13E5B267B851B00DEE308 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA13E5A267B851B00DEE308 /* ContentView.swift */; }; - 7BA13E5D267B851D00DEE308 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7BA13E5C267B851D00DEE308 /* Assets.xcassets */; }; - 7BA13E60267B851D00DEE308 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7BA13E5F267B851D00DEE308 /* Preview Assets.xcassets */; }; - 7BA13E63267B851D00DEE308 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7BA13E61267B851D00DEE308 /* LaunchScreen.storyboard */; }; - 7BA13E74267B85A300DEE308 /* Sentry.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7BA13E71267B859500DEE308 /* Sentry.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 7BA13E53267B851B00DEE308 /* Framework.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Framework.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7BA13E56267B851B00DEE308 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7BA13E58267B851B00DEE308 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - 7BA13E5A267B851B00DEE308 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 7BA13E5C267B851D00DEE308 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 7BA13E5F267B851D00DEE308 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 7BA13E62267B851D00DEE308 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 7BA13E64267B851D00DEE308 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7BA13E6B267B856B00DEE308 /* Sentry.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sentry.framework; path = Carthage/Build/iOS/Sentry.framework; sourceTree = ""; }; - 7BA13E70267B859500DEE308 /* 59F5ED1B-0692-3E28-8041-2FF74F5224DF.bcsymbolmap */ = {isa = PBXFileReference; lastKnownFileType = text; path = "59F5ED1B-0692-3E28-8041-2FF74F5224DF.bcsymbolmap"; sourceTree = ""; }; - 7BA13E71267B859500DEE308 /* Sentry.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sentry.framework; sourceTree = ""; }; - 7BA13E72267B859500DEE308 /* Sentry.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; path = Sentry.framework.dSYM; sourceTree = ""; }; - 7BA13E73267B859500DEE308 /* EEC56027-C176-3ABE-8012-00961E008F29.bcsymbolmap */ = {isa = PBXFileReference; lastKnownFileType = text; path = "EEC56027-C176-3ABE-8012-00961E008F29.bcsymbolmap"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 7BA13E50267B851B00DEE308 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7BA13E74267B85A300DEE308 /* Sentry.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 7BA13E4A267B851B00DEE308 = { - isa = PBXGroup; - children = ( - 7BA13E55267B851B00DEE308 /* Framework */, - 7BA13E54267B851B00DEE308 /* Products */, - 7BA13E6A267B856B00DEE308 /* Frameworks */, - ); - sourceTree = ""; - }; - 7BA13E54267B851B00DEE308 /* Products */ = { - isa = PBXGroup; - children = ( - 7BA13E53267B851B00DEE308 /* Framework.app */, - ); - name = Products; - sourceTree = ""; - }; - 7BA13E55267B851B00DEE308 /* Framework */ = { - isa = PBXGroup; - children = ( - 7BA13E56267B851B00DEE308 /* AppDelegate.swift */, - 7BA13E58267B851B00DEE308 /* SceneDelegate.swift */, - 7BA13E5A267B851B00DEE308 /* ContentView.swift */, - 7BA13E5C267B851D00DEE308 /* Assets.xcassets */, - 7BA13E61267B851D00DEE308 /* LaunchScreen.storyboard */, - 7BA13E64267B851D00DEE308 /* Info.plist */, - 7BA13E5E267B851D00DEE308 /* Preview Content */, - ); - path = Framework; - sourceTree = ""; - }; - 7BA13E5E267B851D00DEE308 /* Preview Content */ = { - isa = PBXGroup; - children = ( - 7BA13E5F267B851D00DEE308 /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 7BA13E6A267B856B00DEE308 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7BA13E6F267B859500DEE308 /* iOS */, - 7BA13E6B267B856B00DEE308 /* Sentry.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 7BA13E6F267B859500DEE308 /* iOS */ = { - isa = PBXGroup; - children = ( - 7BA13E70267B859500DEE308 /* 59F5ED1B-0692-3E28-8041-2FF74F5224DF.bcsymbolmap */, - 7BA13E71267B859500DEE308 /* Sentry.framework */, - 7BA13E72267B859500DEE308 /* Sentry.framework.dSYM */, - 7BA13E73267B859500DEE308 /* EEC56027-C176-3ABE-8012-00961E008F29.bcsymbolmap */, - ); - name = iOS; - path = Carthage/Build/iOS; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 7BA13E52267B851B00DEE308 /* Framework */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7BA13E67267B851D00DEE308 /* Build configuration list for PBXNativeTarget "Framework" */; - buildPhases = ( - 7BA13E77267B85CB00DEE308 /* ShellScript */, - 7BA13E4F267B851B00DEE308 /* Sources */, - 7BA13E50267B851B00DEE308 /* Frameworks */, - 7BA13E51267B851B00DEE308 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Framework; - productName = Framework; - productReference = 7BA13E53267B851B00DEE308 /* Framework.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 7BA13E4B267B851B00DEE308 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1250; - LastUpgradeCheck = 1250; - TargetAttributes = { - 7BA13E52267B851B00DEE308 = { - CreatedOnToolsVersion = 12.5; - }; - }; - }; - buildConfigurationList = 7BA13E4E267B851B00DEE308 /* Build configuration list for PBXProject "Framework" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 7BA13E4A267B851B00DEE308; - productRefGroup = 7BA13E54267B851B00DEE308 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 7BA13E52267B851B00DEE308 /* Framework */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 7BA13E51267B851B00DEE308 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7BA13E63267B851D00DEE308 /* LaunchScreen.storyboard in Resources */, - 7BA13E60267B851D00DEE308 /* Preview Assets.xcassets in Resources */, - 7BA13E5D267B851D00DEE308 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 7BA13E77267B85CB00DEE308 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "$(SRCROOT)/input.xcfilelist", - ); - inputPaths = ( - ); - outputFileListPaths = ( - "$(SRCROOT)/output.xcfilelist", - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n/usr/local/bin/carthage copy-frameworks\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 7BA13E4F267B851B00DEE308 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7BA13E57267B851B00DEE308 /* AppDelegate.swift in Sources */, - 7BA13E59267B851B00DEE308 /* SceneDelegate.swift in Sources */, - 7BA13E5B267B851B00DEE308 /* ContentView.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 7BA13E61267B851D00DEE308 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 7BA13E62267B851D00DEE308 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 7BA13E65267B851D00DEE308 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 7BA13E66267B851D00DEE308 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 7BA13E68267B851D00DEE308 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"Framework/Preview Content\""; - DEVELOPMENT_TEAM = 97JCY7859U; - ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.sentry.carthage.Framework; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 7BA13E69267B851D00DEE308 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"Framework/Preview Content\""; - DEVELOPMENT_TEAM = 97JCY7859U; - ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.sentry.carthage.Framework; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 7BA13E4E267B851B00DEE308 /* Build configuration list for PBXProject "Framework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7BA13E65267B851D00DEE308 /* Debug */, - 7BA13E66267B851D00DEE308 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7BA13E67267B851D00DEE308 /* Build configuration list for PBXNativeTarget "Framework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7BA13E68267B851D00DEE308 /* Debug */, - 7BA13E69267B851D00DEE308 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 7BA13E4B267B851B00DEE308 /* Project object */; -} diff --git a/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a6254..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d6..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/Samples/Carthage-Validation/Framework/Framework/AppDelegate.swift b/Samples/Carthage-Validation/Framework/Framework/AppDelegate.swift deleted file mode 100644 index a4620abc2d4..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/AppDelegate.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Sentry -import UIKit - -@main -class AppDelegate: UIResponder, UIApplicationDelegate { - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - - SentrySDK.start { options in - options.dsn = "https://a92d50327ac74b8b9aa4ea80eccfb267@o447951.ingest.sentry.io/5428557" - options.debug = true - } - - return true - } - - // MARK: UISceneSession Lifecycle - - func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { - // Called when a new scene session is being created. - // Use this method to select a configuration to create the new scene with. - return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) - } - - func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { - // Called when the user discards a scene session. - // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. - // Use this method to release any resources that were specific to the discarded scenes, as they will not return. - } - -} diff --git a/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/AccentColor.colorset/Contents.json b/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb878970081..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/AppIcon.appiconset/Contents.json b/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 9221b9bb1a3..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/Contents.json b/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596a7f..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Samples/Carthage-Validation/Framework/Framework/Base.lproj/LaunchScreen.storyboard b/Samples/Carthage-Validation/Framework/Framework/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 865e9329f37..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Samples/Carthage-Validation/Framework/Framework/ContentView.swift b/Samples/Carthage-Validation/Framework/Framework/ContentView.swift deleted file mode 100644 index 6c03b104d2f..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/ContentView.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Sentry -import SwiftUI - -struct ContentView: View { - var body: some View { - VStack { - Button("CaptureMessage") { - SentrySDK.capture(message: "Yeah captured a message") - } - } - } -} - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} diff --git a/Samples/Carthage-Validation/Framework/Framework/Info.plist b/Samples/Carthage-Validation/Framework/Framework/Info.plist deleted file mode 100644 index 2688b32b32f..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/Info.plist +++ /dev/null @@ -1,62 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - - - - - UIApplicationSupportsIndirectInputEvents - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Samples/Carthage-Validation/Framework/Framework/Preview Content/Preview Assets.xcassets/Contents.json b/Samples/Carthage-Validation/Framework/Framework/Preview Content/Preview Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596a7f..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/Preview Content/Preview Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Samples/Carthage-Validation/Framework/Framework/SceneDelegate.swift b/Samples/Carthage-Validation/Framework/Framework/SceneDelegate.swift deleted file mode 100644 index 21d0a4f98d2..00000000000 --- a/Samples/Carthage-Validation/Framework/Framework/SceneDelegate.swift +++ /dev/null @@ -1,53 +0,0 @@ -import SwiftUI -import UIKit - -class SceneDelegate: UIResponder, UIWindowSceneDelegate { - - var window: UIWindow? - - func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. - // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. - // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). - - // Create the SwiftUI view that provides the window contents. - let contentView = ContentView() - - // Use a UIHostingController as window root view controller. - if let windowScene = scene as? UIWindowScene { - let window = UIWindow(windowScene: windowScene) - window.rootViewController = UIHostingController(rootView: contentView) - self.window = window - window.makeKeyAndVisible() - } - } - - func sceneDidDisconnect(_ scene: UIScene) { - // Called as the scene is being released by the system. - // This occurs shortly after the scene enters the background, or when its session is discarded. - // Release any resources associated with this scene that can be re-created the next time the scene connects. - // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). - } - - func sceneDidBecomeActive(_ scene: UIScene) { - // Called when the scene has moved from an inactive state to an active state. - // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - } - - func sceneWillResignActive(_ scene: UIScene) { - // Called when the scene will move from an active state to an inactive state. - // This may occur due to temporary interruptions (ex. an incoming phone call). - } - - func sceneWillEnterForeground(_ scene: UIScene) { - // Called as the scene transitions from the background to the foreground. - // Use this method to undo the changes made on entering the background. - } - - func sceneDidEnterBackground(_ scene: UIScene) { - // Called as the scene transitions from the foreground to the background. - // Use this method to save data, release shared resources, and store enough scene-specific state information - // to restore the scene back to its current state. - } - -} diff --git a/Samples/Carthage-Validation/Framework/input.xcfilelist b/Samples/Carthage-Validation/Framework/input.xcfilelist deleted file mode 100644 index 38c98e5185f..00000000000 --- a/Samples/Carthage-Validation/Framework/input.xcfilelist +++ /dev/null @@ -1 +0,0 @@ -$(SRCROOT)/Carthage/Build/iOS/Sentry.framework diff --git a/Samples/Carthage-Validation/Framework/output.xcfilelist b/Samples/Carthage-Validation/Framework/output.xcfilelist deleted file mode 100644 index d9ab7a67be9..00000000000 --- a/Samples/Carthage-Validation/Framework/output.xcfilelist +++ /dev/null @@ -1 +0,0 @@ -$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Sentry.framework diff --git a/Samples/Carthage-Validation/README.md b/Samples/Carthage-Validation/README.md index a28270fd73f..e1699f20316 100644 --- a/Samples/Carthage-Validation/README.md +++ b/Samples/Carthage-Validation/README.md @@ -3,17 +3,17 @@ This directory contains samples to validate installing the SDK via Carthage. Carthage can resolve a dependency by downloading the source code into `Carthage/Checkouts` or downloading a pre-compiled framework. The library authors can either attach the pre-compiled framework to a GitHub release or use a [binary project specification][1] for binary-only frameworks that don't provide the source code. -Carthage encourages its users [to use XCFrameworks][2] since version 0.37.0, released in January 2021. The SentrySDK also still supports using normal frameworks. +Carthage encourages its users [to use XCFrameworks][2] since version 0.37.0, released in January 2021. Given the above, there are three different ways of installing a dependency via Carthage: 1. pre-compiled XCFramework -2. pre-compiled framework +2. pre-compiled framework (Dropped support for that in 8.0.0) 3. downloading the source code -Since Carthage only downloads the source code if no pre-compiled binaries are available and we upload these binaries for every release, we only have to validate the first two. +Since Carthage only downloads the source code if no pre-compiled binaries are available and we upload these binaries for every release, we only have to validate the first way. + +Take a look at [GitHub Actions](../../.github/workflows/build.yml) to see how the validation works. [1]: https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#binary-project-specification [2]: https://github.com/Carthage/Carthage#getting-started - -Take a look at [GitHub Actions](../../.github/workflows/buildandtest.yml) to see how the validation works. diff --git a/develop-docs/README.md b/develop-docs/README.md index 39bcde0e6fe..b858b1b02cd 100644 --- a/develop-docs/README.md +++ b/develop-docs/README.md @@ -155,3 +155,15 @@ Date November 15, 2022 Contributors: @kevinrenskers, @brustolin and @philipphofmann For the benefit of OOM crashes, we write breadcrumbs to disk; see https://github.com/getsentry/sentry-cocoa/pull/2347. We have decided to do this in the main thread to ensure we're not missing out on any breadcrumbs. It's mainly the last breadcrumb(s) that are important to figure out what is causing an OOM. And since we're only appending to an open file stream, the overhead is acceptable compared to the benefit of having accurate breadcrumbs. + +### Bump min Xcode version to 13 + +With adding the [MetricKit integration](https://github.com/getsentry/sentry-cocoa/issues/1661), we need to bump the min Xcode version to 13, +as MetricKit is unavailable on previous Xcode versions. As Xcode 12 doesn't run on macOS 12, and the current Xcode version is 14, we are OK +with that change. With that change, we also have to drop support for +[building platform-specific framework bundles](https://github.com/Carthage/Carthage/tree/a91d086ceaffef65c4a4a761108f3f32c519940c#building-platform-specific-framework-bundles-default-for-xcode-11-and-below) +with Carthage, which was the default for Xcode 11 and below, because the +[workaround](https://github.com/Carthage/Carthage/blob/a91d086ceaffef65c4a4a761108f3f32c519940c/Documentation/Xcode12Workaround.md) for creating a +platform-specific framework bundles only works with Xcode 12. +Carthage has encouraged its users [to use XCFrameworks](https://github.com/Carthage/Carthage/tree/a91d086ceaffef65c4a4a761108f3f32c519940c#getting-started) +since version 0.37.0, released in January 2021. Therefore, it's acceptable to use XCFrameworks for Carthage users. diff --git a/scripts/carthage-xcode12-workaround.sh b/scripts/carthage-xcode12-workaround.sh deleted file mode 100755 index c963666c296..00000000000 --- a/scripts/carthage-xcode12-workaround.sh +++ /dev/null @@ -1,20 +0,0 @@ -# carthage.sh -# Usage example: ./carthage.sh build --platform iOS -# Copied from: https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md - -set -euo pipefail - -xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX) -trap 'rm -f "$xcconfig"' INT TERM HUP EXIT - -# For Xcode 12 make sure EXCLUDED_ARCHS is set to arm architectures otherwise -# the build will fail on lipo due to duplicate architectures. - -CURRENT_XCODE_VERSION=$(xcodebuild -version | grep "Build version" | cut -d' ' -f3) -echo "EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_1200__BUILD_$CURRENT_XCODE_VERSION = arm64 arm64e armv7 armv7s armv6 armv8" >> $xcconfig - -echo 'EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_1200 = $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_1200__BUILD_$(XCODE_PRODUCT_BUILD_VERSION))' >> $xcconfig -echo 'EXCLUDED_ARCHS = $(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT)__XCODE_$(XCODE_VERSION_MAJOR))' >> $xcconfig - -export XCODE_XCCONFIG_FILE="$xcconfig" -carthage "$@"