@invarn/cibuild 2.9.2 → 2.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +97 -12
- package/dist/src/yaml/steps/android.d.ts.map +1 -1
- package/dist/src/yaml/steps/android.js +11 -3
- package/dist/src/yaml/steps/capture-injection.d.ts +30 -0
- package/dist/src/yaml/steps/capture-injection.d.ts.map +1 -0
- package/dist/src/yaml/steps/capture-injection.js +88 -0
- package/dist/src/yaml/steps/capture-injection.test.d.ts +2 -0
- package/dist/src/yaml/steps/capture-injection.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/capture-injection.test.js +163 -0
- package/dist/src/yaml/steps/cocoapods-deployment-floor.d.ts +42 -0
- package/dist/src/yaml/steps/cocoapods-deployment-floor.d.ts.map +1 -0
- package/dist/src/yaml/steps/cocoapods-deployment-floor.js +140 -0
- package/dist/src/yaml/steps/cocoapods-deployment-floor.test.d.ts +11 -0
- package/dist/src/yaml/steps/cocoapods-deployment-floor.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/cocoapods-deployment-floor.test.js +176 -0
- package/dist/src/yaml/steps/gradle-memory.d.ts +1 -1
- package/dist/src/yaml/steps/gradle-memory.d.ts.map +1 -1
- package/dist/src/yaml/steps/gradle-memory.js +78 -3
- package/dist/src/yaml/steps/gradle-memory.test.js +48 -1
- package/dist/src/yaml/steps/ios-deps.d.ts.map +1 -1
- package/dist/src/yaml/steps/ios-deps.js +2 -0
- package/dist/src/yaml/steps/xcode-derived-data.test.js +47 -4
- package/dist/src/yaml/steps/xcode-simulator-archs.d.ts +53 -0
- package/dist/src/yaml/steps/xcode-simulator-archs.d.ts.map +1 -0
- package/dist/src/yaml/steps/xcode-simulator-archs.js +98 -0
- package/dist/src/yaml/steps/xcode-simulator-archs.test.d.ts +21 -0
- package/dist/src/yaml/steps/xcode-simulator-archs.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/xcode-simulator-archs.test.js +155 -0
- package/dist/src/yaml/steps/xcode.d.ts.map +1 -1
- package/dist/src/yaml/steps/xcode.js +43 -4
- package/package.json +1 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The simulator architecture, chosen at run time.
|
|
3
|
+
*
|
|
4
|
+
* A pipeline pins `ARCHS=arm64` on its simulator builds: a *generic* simulator
|
|
5
|
+
* destination otherwise exports `ARCHS='arm64 x86_64'`, and anything that maps
|
|
6
|
+
* ARCHS onto a second toolchain meets an architecture nothing on the runner
|
|
7
|
+
* builds. But a project can exclude arm64 from the simulator
|
|
8
|
+
* (`EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64`, an Intel-era workaround),
|
|
9
|
+
* and then the pin leaves nothing to build: "None of the architectures in
|
|
10
|
+
* ARCHS (arm64) are valid", and CocoaPods' `[CP] Embed Pods Frameworks` dies
|
|
11
|
+
* on `ARCHS[@]: unbound variable`.
|
|
12
|
+
*
|
|
13
|
+
* Invarn switches to x86_64 at pipeline creation when the exclusion is in the
|
|
14
|
+
* repository (the pbxproj or the Podfile). A pod can also carry it, in its
|
|
15
|
+
* podspec's `user_target_xcconfig`, which CocoaPods writes into the app's
|
|
16
|
+
* `Pods-…debug.xcconfig` — and that exists only after `pod install`
|
|
17
|
+
* (ExistOrLive/GithubClient: WoodPeckeriOS 1.4.3, nightly-baseline issue 54).
|
|
18
|
+
* So the step asks Xcode, right before it builds, for the effective settings:
|
|
19
|
+
* `-showBuildSettings` reads the pbxproj, every xcconfig and the pods at once.
|
|
20
|
+
*
|
|
21
|
+
* Only an `ARCHS=arm64` pin is checked. An `ARCHS=x86_64` chosen at creation
|
|
22
|
+
* is left as it is, and options without a pin have nothing to decide.
|
|
23
|
+
*/
|
|
24
|
+
const ARM64_PIN = /(^|\s)ARCHS=arm64(?=\s|$)/;
|
|
25
|
+
/** The variable the build line reads its simulator architecture from. */
|
|
26
|
+
export const SIMULATOR_ARCHS_VAR = 'CIBUILD_SIMULATOR_ARCHS';
|
|
27
|
+
/** Whether `xcodebuild_options` pins the simulator build to arm64. */
|
|
28
|
+
export function pinsSimulatorArm64(xcodebuildOptions) {
|
|
29
|
+
return ARM64_PIN.test(xcodebuildOptions);
|
|
30
|
+
}
|
|
31
|
+
/** The options with the arm64 pin replaced by the run-time choice. */
|
|
32
|
+
export function withRuntimeSimulatorArchs(xcodebuildOptions) {
|
|
33
|
+
return xcodebuildOptions.replace(ARM64_PIN, (_m, lead) => `${lead}ARCHS="$${SIMULATOR_ARCHS_VAR}"`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reads `xcodebuild -showBuildSettings -json` on stdin and prints one line
|
|
37
|
+
* naming the target that excludes arm64, or nothing. The application target
|
|
38
|
+
* decides when the scheme lists one; a framework the scheme also lists is not
|
|
39
|
+
* what is being built for the simulator. Output it cannot read is no
|
|
40
|
+
* evidence: it prints nothing and exits 0, and the build keeps arm64.
|
|
41
|
+
*/
|
|
42
|
+
export const ARM64_EXCLUSION_READER_SOURCE = String.raw `
|
|
43
|
+
var input = '';
|
|
44
|
+
process.stdin.setEncoding('utf8');
|
|
45
|
+
process.stdin.on('data', function (d) { input += d; });
|
|
46
|
+
process.stdin.on('end', function () {
|
|
47
|
+
var entries;
|
|
48
|
+
try { entries = JSON.parse(input); } catch (err) { return; }
|
|
49
|
+
if (!Array.isArray(entries)) return;
|
|
50
|
+
var apps = entries.filter(function (e) {
|
|
51
|
+
return e && e.buildSettings && e.buildSettings.PRODUCT_TYPE === 'com.apple.product-type.application';
|
|
52
|
+
});
|
|
53
|
+
var judged = apps.length > 0 ? apps : entries;
|
|
54
|
+
for (var i = 0; i < judged.length; i++) {
|
|
55
|
+
var e = judged[i];
|
|
56
|
+
var excluded = String((e && e.buildSettings && e.buildSettings.EXCLUDED_ARCHS) || '').trim();
|
|
57
|
+
if (excluded.split(/\s+/).indexOf('arm64') >= 0) {
|
|
58
|
+
process.stdout.write('target ' + e.target + ' sets EXCLUDED_ARCHS = ' + excluded + '\n');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
`;
|
|
64
|
+
/**
|
|
65
|
+
* The lines that set `$CIBUILD_SIMULATOR_ARCHS`: arm64, or x86_64 when the
|
|
66
|
+
* project's effective simulator settings exclude arm64, saying so in the log.
|
|
67
|
+
* They expect `$PROJECT_TYPE` and `$DERIVED_DATA_PATH` to be set, and go after
|
|
68
|
+
* package resolution, so the settings are read from the graph the build uses.
|
|
69
|
+
*/
|
|
70
|
+
export function simulatorArchsLines(opts) {
|
|
71
|
+
let ask = 'xcodebuild -showBuildSettings -json';
|
|
72
|
+
ask += ` "$PROJECT_TYPE" '${opts.projectPath}'`;
|
|
73
|
+
ask += ` -scheme '${opts.scheme}'`;
|
|
74
|
+
if (opts.configuration)
|
|
75
|
+
ask += ` -configuration '${opts.configuration}'`;
|
|
76
|
+
ask += ` -destination '${opts.destination}'`;
|
|
77
|
+
ask += ' -derivedDataPath "$DERIVED_DATA_PATH"';
|
|
78
|
+
if (opts.xcconfig)
|
|
79
|
+
ask += ' -xcconfig "$XCCONFIG_FILE"';
|
|
80
|
+
return [
|
|
81
|
+
'# The simulator architecture, read after pod install: a pod can exclude',
|
|
82
|
+
'# arm64 through its user_target_xcconfig, which no file in the repository',
|
|
83
|
+
'# says until CocoaPods has run. See xcode-simulator-archs.ts.',
|
|
84
|
+
`${SIMULATOR_ARCHS_VAR}=arm64`,
|
|
85
|
+
'ARCHS_READER="$(mktemp -t cibuild-sim-archs).cjs"',
|
|
86
|
+
`cat > "$ARCHS_READER" << 'CIBUILD_SIM_ARCHS_EOF'`,
|
|
87
|
+
ARM64_EXCLUSION_READER_SOURCE.trim(),
|
|
88
|
+
'CIBUILD_SIM_ARCHS_EOF',
|
|
89
|
+
`ARM64_EXCLUDED_BY=$(${ask} 2>/dev/null | node "$ARCHS_READER" 2>/dev/null || true)`,
|
|
90
|
+
'rm -f "$ARCHS_READER"',
|
|
91
|
+
'if [ -n "$ARM64_EXCLUDED_BY" ]; then',
|
|
92
|
+
` ${SIMULATOR_ARCHS_VAR}=x86_64`,
|
|
93
|
+
' echo "Building the simulator app as x86_64, not arm64: $ARM64_EXCLUDED_BY in the project\'s effective simulator settings (after pod install)"',
|
|
94
|
+
'fi',
|
|
95
|
+
'',
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=xcode-simulator-archs.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simulator build pinned to arm64, on a project whose effective settings
|
|
3
|
+
* exclude arm64 from the simulator, builds x86_64 instead — decided at run
|
|
4
|
+
* time, after `pod install`, from what Xcode itself reports.
|
|
5
|
+
*
|
|
6
|
+
* The witness (nightly-baseline issue 54): ExistOrLive/GithubClient @ 7969212a.
|
|
7
|
+
* Its pod WoodPeckeriOS 1.4.3 ships `user_target_xcconfig:
|
|
8
|
+
* { "EXCLUDED_ARCHS[sdk=iphonesimulator*]": "arm64" }`, which CocoaPods writes
|
|
9
|
+
* into the app's `Pods-…debug.xcconfig`. The pipeline pinned `ARCHS=arm64`, so
|
|
10
|
+
* nothing was left to build and `[CP] Embed Pods Frameworks` died on
|
|
11
|
+
* `ARCHS[@]: unbound variable` (bld_b91e230368d6505e97ec9b75). Nothing in the
|
|
12
|
+
* repository says so before `pod install` has run.
|
|
13
|
+
*
|
|
14
|
+
* Measured on a clone, Xcode 26.4, 2026-10-01: after `pod install`,
|
|
15
|
+
* `xcodebuild -showBuildSettings -json … -destination 'generic/platform=iOS
|
|
16
|
+
* Simulator'` reported, for target ZLGitHubClient
|
|
17
|
+
* (com.apple.product-type.application), `EXCLUDED_ARCHS = "arm64"`, in 3 s;
|
|
18
|
+
* and `ARCHS=x86_64` compiled the app's sources.
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=xcode-simulator-archs.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode-simulator-archs.test.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/xcode-simulator-archs.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simulator build pinned to arm64, on a project whose effective settings
|
|
3
|
+
* exclude arm64 from the simulator, builds x86_64 instead — decided at run
|
|
4
|
+
* time, after `pod install`, from what Xcode itself reports.
|
|
5
|
+
*
|
|
6
|
+
* The witness (nightly-baseline issue 54): ExistOrLive/GithubClient @ 7969212a.
|
|
7
|
+
* Its pod WoodPeckeriOS 1.4.3 ships `user_target_xcconfig:
|
|
8
|
+
* { "EXCLUDED_ARCHS[sdk=iphonesimulator*]": "arm64" }`, which CocoaPods writes
|
|
9
|
+
* into the app's `Pods-…debug.xcconfig`. The pipeline pinned `ARCHS=arm64`, so
|
|
10
|
+
* nothing was left to build and `[CP] Embed Pods Frameworks` died on
|
|
11
|
+
* `ARCHS[@]: unbound variable` (bld_b91e230368d6505e97ec9b75). Nothing in the
|
|
12
|
+
* repository says so before `pod install` has run.
|
|
13
|
+
*
|
|
14
|
+
* Measured on a clone, Xcode 26.4, 2026-10-01: after `pod install`,
|
|
15
|
+
* `xcodebuild -showBuildSettings -json … -destination 'generic/platform=iOS
|
|
16
|
+
* Simulator'` reported, for target ZLGitHubClient
|
|
17
|
+
* (com.apple.product-type.application), `EXCLUDED_ARCHS = "arm64"`, in 3 s;
|
|
18
|
+
* and `ARCHS=x86_64` compiled the app's sources.
|
|
19
|
+
*/
|
|
20
|
+
import { describe, test, expect } from '@jest/globals';
|
|
21
|
+
import { execFileSync } from 'node:child_process';
|
|
22
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
23
|
+
import { tmpdir } from 'node:os';
|
|
24
|
+
import { join } from 'node:path';
|
|
25
|
+
import { ARM64_EXCLUSION_READER_SOURCE, pinsSimulatorArm64, withRuntimeSimulatorArchs, } from './xcode-simulator-archs.js';
|
|
26
|
+
import { XcodeBuildForSimulatorStepExecutor, XcodeBuildForTestStepExecutor, } from './xcode.js';
|
|
27
|
+
import { testConfig } from './test-config.js';
|
|
28
|
+
/** What `-showBuildSettings -json` printed for GithubClient, cut to the fields read. */
|
|
29
|
+
const githubClient = [
|
|
30
|
+
{
|
|
31
|
+
action: 'build',
|
|
32
|
+
target: 'ZLGitHubClient',
|
|
33
|
+
buildSettings: {
|
|
34
|
+
PRODUCT_TYPE: 'com.apple.product-type.application',
|
|
35
|
+
EXCLUDED_ARCHS: 'arm64',
|
|
36
|
+
ARCHS: 'x86_64',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
const read = (settings) => {
|
|
41
|
+
const dir = mkdtempSync(join(tmpdir(), 'sim-archs-'));
|
|
42
|
+
try {
|
|
43
|
+
const reader = join(dir, 'reader.cjs');
|
|
44
|
+
writeFileSync(reader, ARM64_EXCLUSION_READER_SOURCE);
|
|
45
|
+
return execFileSync('node', [reader], {
|
|
46
|
+
input: typeof settings === 'string' ? settings : JSON.stringify(settings),
|
|
47
|
+
encoding: 'utf8',
|
|
48
|
+
}).trim();
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
rmSync(dir, { recursive: true, force: true });
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
describe('the arm64 exclusion reader', () => {
|
|
55
|
+
test('names the app target that excludes arm64, and its setting', () => {
|
|
56
|
+
expect(read(githubClient)).toBe('target ZLGitHubClient sets EXCLUDED_ARCHS = arm64');
|
|
57
|
+
});
|
|
58
|
+
test('says nothing when arm64 is not excluded', () => {
|
|
59
|
+
expect(read([{ ...githubClient[0], buildSettings: { PRODUCT_TYPE: 'com.apple.product-type.application', EXCLUDED_ARCHS: '' } }])).toBe('');
|
|
60
|
+
expect(read([{ ...githubClient[0], buildSettings: { PRODUCT_TYPE: 'com.apple.product-type.application' } }])).toBe('');
|
|
61
|
+
});
|
|
62
|
+
test('reads arm64 as a word, not a substring', () => {
|
|
63
|
+
const s = (v) => [{ ...githubClient[0], buildSettings: { PRODUCT_TYPE: 'com.apple.product-type.application', EXCLUDED_ARCHS: v } }];
|
|
64
|
+
expect(read(s('i386 arm64'))).toBe('target ZLGitHubClient sets EXCLUDED_ARCHS = i386 arm64');
|
|
65
|
+
expect(read(s('arm64e'))).toBe('');
|
|
66
|
+
});
|
|
67
|
+
test('judges the application target, not a library the scheme also lists', () => {
|
|
68
|
+
const settings = [
|
|
69
|
+
{ target: 'SomeKit', buildSettings: { PRODUCT_TYPE: 'com.apple.product-type.framework', EXCLUDED_ARCHS: 'arm64' } },
|
|
70
|
+
{ target: 'App', buildSettings: { PRODUCT_TYPE: 'com.apple.product-type.application', EXCLUDED_ARCHS: '' } },
|
|
71
|
+
];
|
|
72
|
+
expect(read(settings)).toBe('');
|
|
73
|
+
});
|
|
74
|
+
test('with no application target listed, any target that excludes arm64 counts', () => {
|
|
75
|
+
expect(read([{ target: 'Lib', buildSettings: { EXCLUDED_ARCHS: 'arm64' } }])).toBe('target Lib sets EXCLUDED_ARCHS = arm64');
|
|
76
|
+
});
|
|
77
|
+
test('unreadable output is no evidence: says nothing, exits 0', () => {
|
|
78
|
+
expect(read('')).toBe('');
|
|
79
|
+
expect(read('xcodebuild: error: not json')).toBe('');
|
|
80
|
+
expect(read({ not: 'an array' })).toBe('');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('pinsSimulatorArm64 / withRuntimeSimulatorArchs', () => {
|
|
84
|
+
const template = "-skipMacroValidation -skipPackagePluginValidation 'OTHER_CFLAGS=$(inherited) -Wno-error=parentheses' ARCHS=arm64";
|
|
85
|
+
test('the template line pins arm64', () => {
|
|
86
|
+
expect(pinsSimulatorArm64(template)).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
test('an x86_64 already chosen at creation (issue 10) is not touched', () => {
|
|
89
|
+
const chosen = template.replace('ARCHS=arm64', 'ARCHS=x86_64');
|
|
90
|
+
expect(pinsSimulatorArm64(chosen)).toBe(false);
|
|
91
|
+
expect(withRuntimeSimulatorArchs(chosen)).toBe(chosen);
|
|
92
|
+
});
|
|
93
|
+
test('only a whole ARCHS=arm64 token counts', () => {
|
|
94
|
+
expect(pinsSimulatorArm64('VALID_ARCHS=arm64')).toBe(false);
|
|
95
|
+
expect(pinsSimulatorArm64('ARCHS=arm64e')).toBe(false);
|
|
96
|
+
expect(pinsSimulatorArm64('ARCHS=arm64 -quiet')).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
test('the pin becomes the run-time variable, the rest of the line unchanged', () => {
|
|
99
|
+
expect(withRuntimeSimulatorArchs(template)).toBe("-skipMacroValidation -skipPackagePluginValidation 'OTHER_CFLAGS=$(inherited) -Wno-error=parentheses' ARCHS=\"$CIBUILD_SIMULATOR_ARCHS\"");
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
const steps = [
|
|
103
|
+
['xcode-build-for-simulator', () => new XcodeBuildForSimulatorStepExecutor(), 'xcodebuild build "$PROJECT_TYPE"'],
|
|
104
|
+
['xcode-build-for-test', () => new XcodeBuildForTestStepExecutor(), 'xcodebuild build-for-testing'],
|
|
105
|
+
];
|
|
106
|
+
describe.each(steps)('%s reads the exclusion at run time', (_name, make, buildMarker) => {
|
|
107
|
+
const script = async (xcodebuild_options) => (await make().execute({
|
|
108
|
+
project_path: 'ZLGitHubClient/ZLGitHubClient.xcworkspace',
|
|
109
|
+
scheme: 'ZLGitHubClient',
|
|
110
|
+
configuration: 'Debug',
|
|
111
|
+
destination: 'generic/platform=iOS Simulator',
|
|
112
|
+
xcodebuild_options,
|
|
113
|
+
}, {}, testConfig)).script;
|
|
114
|
+
const pinned = "'OTHER_CFLAGS=$(inherited) -Wno-error=parentheses' ARCHS=arm64";
|
|
115
|
+
test('asks Xcode for the effective settings, after resolution and before the build', async () => {
|
|
116
|
+
const s = await script(pinned);
|
|
117
|
+
const ask = s.indexOf('xcodebuild -showBuildSettings -json');
|
|
118
|
+
expect(ask).toBeGreaterThan(s.indexOf('xcodebuild -resolvePackageDependencies'));
|
|
119
|
+
expect(ask).toBeLessThan(s.indexOf(buildMarker));
|
|
120
|
+
const line = s.split('\n').find((l) => l.includes('-showBuildSettings'));
|
|
121
|
+
expect(line).toContain("-scheme 'ZLGitHubClient'");
|
|
122
|
+
expect(line).toContain("-configuration 'Debug'");
|
|
123
|
+
expect(line).toContain("-destination 'generic/platform=iOS Simulator'");
|
|
124
|
+
});
|
|
125
|
+
test('builds with the run-time choice, arm64 unless the project excludes it', async () => {
|
|
126
|
+
const s = await script(pinned);
|
|
127
|
+
expect(s).toContain('CIBUILD_SIMULATOR_ARCHS=arm64');
|
|
128
|
+
expect(s).toContain('CIBUILD_SIMULATOR_ARCHS=x86_64');
|
|
129
|
+
const build = s.split('\n').find((l) => l.startsWith(buildMarker.split(' "')[0]) && !l.includes('-showBuildSettings') && !l.includes('-resolvePackageDependencies'));
|
|
130
|
+
expect(build).toContain('ARCHS="$CIBUILD_SIMULATOR_ARCHS"');
|
|
131
|
+
expect(build).not.toContain('ARCHS=arm64');
|
|
132
|
+
});
|
|
133
|
+
test('says so in the log, as the creation-time switch does', async () => {
|
|
134
|
+
expect(await script(pinned)).toContain('Building the simulator app as x86_64, not arm64: ');
|
|
135
|
+
});
|
|
136
|
+
test('without an arm64 pin there is nothing to check', async () => {
|
|
137
|
+
for (const opts of ['', pinned.replace('arm64', 'x86_64')]) {
|
|
138
|
+
const s = await script(opts);
|
|
139
|
+
expect(s).not.toContain('-showBuildSettings');
|
|
140
|
+
expect(s).not.toContain('CIBUILD_SIMULATOR_ARCHS');
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
test('the emitted script is valid bash', async () => {
|
|
144
|
+
const dir = mkdtempSync(join(tmpdir(), 'sim-archs-sh-'));
|
|
145
|
+
try {
|
|
146
|
+
const f = join(dir, 's.sh');
|
|
147
|
+
writeFileSync(f, await script(pinned));
|
|
148
|
+
expect(() => execFileSync('bash', ['-n', f])).not.toThrow();
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
rmSync(dir, { recursive: true, force: true });
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=xcode-simulator-archs.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xcode.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/xcode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"xcode.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/xcode.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { existsSync } from 'node:fs';
|
|
|
5
5
|
import { BaseStepExecutor } from './base.js';
|
|
6
6
|
import { resolveDestinationInput } from './xcode-destination.js';
|
|
7
7
|
import { APP_PRODUCT_RESOLVER_SOURCE } from './xcode-app-product.js';
|
|
8
|
+
import { pinsSimulatorArm64, simulatorArchsLines, withRuntimeSimulatorArchs } from './xcode-simulator-archs.js';
|
|
8
9
|
import { refusedFetchHelpers, retryOnRefusedFetch } from './git-fetch-retry.js';
|
|
9
10
|
/**
|
|
10
11
|
* Where derived data goes: outside the source tree, keyed by the output dir.
|
|
@@ -23,12 +24,30 @@ import { refusedFetchHelpers, retryOnRefusedFetch } from './git-fetch-retry.js';
|
|
|
23
24
|
* name the same output_dir still share derived data (the iOS template relies
|
|
24
25
|
* on that to avoid compiling the app twice) and two that name different ones
|
|
25
26
|
* stay apart, as they did before.
|
|
27
|
+
*
|
|
28
|
+
* **Never under /tmp** (nightly-baseline 58). analogcode/Swift-Radio-Pro's
|
|
29
|
+
* LNPopupController builds its header search paths by deleting
|
|
30
|
+
* `Context.packageDirectory` from the paths FileManager lists, and under /tmp
|
|
31
|
+
* the two disagree by `/private`: xcodebuild folds `/private/tmp` back to
|
|
32
|
+
* `/tmp` however the path is given, and FileManager does not, so every header
|
|
33
|
+
* path came out eight characters short ("troller/…"). Resolving the path did
|
|
34
|
+
* not help, for that reason. The guest's scratch root is
|
|
35
|
+
* `/tmp/cibuild-work-<id>`, so there derived data goes to the build user's
|
|
36
|
+
* real home instead. Measured on runner-mac-01 2026-10-03: the same build
|
|
37
|
+
* fails under /tmp and succeeds under the home, in a fresh VM each. Not
|
|
38
|
+
* /var/folders (TMPDIR): it built correctly there too. SwiftPM caches a
|
|
39
|
+
* manifest's evaluation, relative paths and all, so the first evaluation in a
|
|
40
|
+
* VM decides — another reason the root must be right from the first build.
|
|
26
41
|
*/
|
|
27
42
|
function derivedDataPathLines() {
|
|
28
43
|
return [
|
|
29
|
-
'# Derived data outside the source tree, keyed by the output dir',
|
|
30
|
-
'
|
|
44
|
+
'# Derived data outside the source tree, keyed by the output dir, and never under /tmp',
|
|
45
|
+
'cibuild_dd_root="${CIBUILD_SCRATCH:-${TMPDIR:-/tmp}}"',
|
|
46
|
+
'case "$(cd "$cibuild_dd_root" 2>/dev/null && pwd -P)" in /private/tmp|/private/tmp/*) cibuild_dd_root="${CIBUILD_USER_HOME:-$HOME}/Library/Developer/cibuild" ;; esac',
|
|
47
|
+
'DERIVED_DATA_PATH="$cibuild_dd_root/cibuild-derived-data/$(printf \'%s\' "$OUTPUT_DIR" | cksum | cut -d\' \' -f1)"',
|
|
31
48
|
'mkdir -p "$DERIVED_DATA_PATH"',
|
|
49
|
+
'# Its real path: /tmp and TMPDIR are symlinks on macOS, and a package that builds paths by text arithmetic breaks on them',
|
|
50
|
+
'DERIVED_DATA_PATH="$(cd "$DERIVED_DATA_PATH" && pwd -P)"',
|
|
32
51
|
'echo "Derived data: $DERIVED_DATA_PATH"',
|
|
33
52
|
];
|
|
34
53
|
}
|
|
@@ -863,6 +882,16 @@ export class XcodeBuildForTestStepExecutor extends BaseStepExecutor {
|
|
|
863
882
|
` -scheme '${escapedScheme}'` +
|
|
864
883
|
' -derivedDataPath "$DERIVED_DATA_PATH"',
|
|
865
884
|
}));
|
|
885
|
+
const pinsArm64 = pinsSimulatorArm64(xcodebuildOptions);
|
|
886
|
+
if (pinsArm64) {
|
|
887
|
+
commands.push(...simulatorArchsLines({
|
|
888
|
+
projectPath: escapedPath,
|
|
889
|
+
scheme: escapedScheme,
|
|
890
|
+
configuration: this.escapeBash(configuration),
|
|
891
|
+
destination: this.escapeBash(destination),
|
|
892
|
+
xcconfig: Boolean(xcconfigContent.trim()),
|
|
893
|
+
}));
|
|
894
|
+
}
|
|
866
895
|
// Build command
|
|
867
896
|
let cmd = 'xcodebuild build-for-testing';
|
|
868
897
|
cmd += ` "$PROJECT_TYPE" '${escapedPath}'`;
|
|
@@ -877,7 +906,7 @@ export class XcodeBuildForTestStepExecutor extends BaseStepExecutor {
|
|
|
877
906
|
cmd += ' -xcconfig "$XCCONFIG_FILE"';
|
|
878
907
|
}
|
|
879
908
|
if (xcodebuildOptions) {
|
|
880
|
-
cmd += ` ${xcodebuildOptions}`;
|
|
909
|
+
cmd += ` ${pinsArm64 ? withRuntimeSimulatorArchs(xcodebuildOptions) : xcodebuildOptions}`;
|
|
881
910
|
}
|
|
882
911
|
commands.push(cmd);
|
|
883
912
|
commands.push('');
|
|
@@ -1071,6 +1100,16 @@ export class XcodeBuildForSimulatorStepExecutor extends BaseStepExecutor {
|
|
|
1071
1100
|
` -scheme '${escapedScheme}'` +
|
|
1072
1101
|
' -derivedDataPath "$DERIVED_DATA_PATH"',
|
|
1073
1102
|
}));
|
|
1103
|
+
const pinsArm64 = pinsSimulatorArm64(xcodebuildOptions);
|
|
1104
|
+
if (pinsArm64) {
|
|
1105
|
+
commands.push(...simulatorArchsLines({
|
|
1106
|
+
projectPath: escapedPath,
|
|
1107
|
+
scheme: escapedScheme,
|
|
1108
|
+
configuration: configuration ? this.escapeBash(configuration) : '',
|
|
1109
|
+
destination: this.escapeBash(destination),
|
|
1110
|
+
xcconfig: true,
|
|
1111
|
+
}));
|
|
1112
|
+
}
|
|
1074
1113
|
// Build command
|
|
1075
1114
|
let cmd = 'xcodebuild';
|
|
1076
1115
|
if (performClean === 'yes') {
|
|
@@ -1119,7 +1158,7 @@ export class XcodeBuildForSimulatorStepExecutor extends BaseStepExecutor {
|
|
|
1119
1158
|
cmd += ` -derivedDataPath "$DERIVED_DATA_PATH"`;
|
|
1120
1159
|
cmd += ' -xcconfig "$XCCONFIG_FILE"';
|
|
1121
1160
|
if (xcodebuildOptions) {
|
|
1122
|
-
cmd += ` ${xcodebuildOptions}`;
|
|
1161
|
+
cmd += ` ${pinsArm64 ? withRuntimeSimulatorArchs(xcodebuildOptions) : xcodebuildOptions}`;
|
|
1123
1162
|
}
|
|
1124
1163
|
commands.push(cmd);
|
|
1125
1164
|
commands.push('');
|