Use -miphonesimulator-version-min when building App.framework for simulator (#84729)

This commit is contained in:
Jenn Magder 2021-06-16 15:54:38 -07:00 committed by GitHub
parent 75e9318d7f
commit 53f5b90209
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 107 additions and 51 deletions

View file

@ -250,24 +250,24 @@ class AOTSnapshotter {
}
final List<String> commonBuildOptions = <String>[
'-arch', targetArch,
'-arch',
targetArch,
if (isIOS)
// When the minimum version is updated, remember to update
// template MinimumOSVersion.
// https://github.com/flutter/flutter/pull/62902
'-miphoneos-version-min=8.0',
if (sdkRoot != null) ...<String>[
'-isysroot',
sdkRoot,
],
];
const String embedBitcodeArg = '-fembed-bitcode';
final String assemblyO = _fileSystem.path.join(outputPath, 'snapshot_assembly.o');
List<String>? isysrootArgs;
if (sdkRoot != null) {
isysrootArgs = <String>['-isysroot', sdkRoot];
}
final RunResult compileResult = await _xcode.cc(<String>[
'-arch', targetArch,
if (isysrootArgs != null) ...isysrootArgs,
...commonBuildOptions,
if (bitcode) embedBitcodeArg,
'-c',
assemblyPath,
@ -289,7 +289,6 @@ class AOTSnapshotter {
'-Xlinker', '-rpath', '-Xlinker', '@loader_path/Frameworks',
'-install_name', '@rpath/App.framework/App',
if (bitcode) embedBitcodeArg,
if (isysrootArgs != null) ...isysrootArgs,
'-o', appLib,
assemblyO,
];

View file

@ -69,8 +69,7 @@ abstract class AotAssemblyBase extends Target {
}
final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType =
environmentTypeFromSdkroot(environment.fileSystem.directory(sdkRoot));
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, environment.fileSystem);
if (environmentType == EnvironmentType.simulator) {
throw Exception(
'release/profile builds are only supported for physical devices. '
@ -222,6 +221,10 @@ class DebugUniversalFramework extends Target {
@override
Future<void> build(Environment environment) async {
if (environment.defines[kSdkRoot] == null) {
throw MissingDefineException(kSdkRoot, name);
}
// Generate a trivial App.framework.
final Set<String> iosArchNames = environment.defines[kIosArchs]
?.split(' ')
@ -292,8 +295,8 @@ abstract class UnpackIOS extends Target {
}
void _copyFramework(Environment environment) {
final Directory sdkRoot = environment.fileSystem.directory(environment.defines[kSdkRoot]);
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot);
final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, environment.fileSystem);
final String basePath = environment.artifacts.getArtifactPath(
Artifact.flutterFramework,
platform: TargetPlatform.ios,
@ -584,7 +587,8 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
throwToolExit('Failed to create App.framework stub at ${outputFile.path}: $e');
}
final Directory tempDir = outputFile.fileSystem.systemTempDirectory
final FileSystem fileSystem = environment.fileSystem;
final Directory tempDir = fileSystem.systemTempDirectory
.createTempSync('flutter_tools_stub_source.');
try {
final File stubSource = tempDir.childFile('debug_app.cc')
@ -593,6 +597,8 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
''');
final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, fileSystem);
await globals.xcode.clang(<String>[
'-x',
'c',
@ -601,7 +607,10 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
'-dynamiclib',
'-fembed-bitcode-marker',
// Keep version in sync with AOTSnapshotter flag
'-miphoneos-version-min=8.0',
if (environmentType == EnvironmentType.physical)
'-miphoneos-version-min=8.0'
else
'-miphonesimulator-version-min=8.0',
'-Xlinker', '-rpath', '-Xlinker', '@executable_path/Frameworks',
'-Xlinker', '-rpath', '-Xlinker', '@loader_path/Frameworks',
'-install_name', '@rpath/App.framework/App',

View file

@ -198,10 +198,10 @@ class Xcode {
}
}
EnvironmentType? environmentTypeFromSdkroot(Directory sdkroot) {
EnvironmentType? environmentTypeFromSdkroot(String sdkroot, FileSystem fileSystem) {
assert(sdkroot != null);
// iPhoneSimulator.sdk or iPhoneOS.sdk
final String sdkName = sdkroot.basename.toLowerCase();
final String sdkName = fileSystem.path.basename(sdkroot).toLowerCase();
if (sdkName.contains('iphone')) {
return sdkName.contains('simulator') ? EnvironmentType.simulator : EnvironmentType.physical;
}

View file

@ -29,6 +29,8 @@ const FakeCommand kARMCheckCommand = FakeCommand(
const List<String> kDefaultClang = <String>[
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/sdk',
'-dynamiclib',
'-Xlinker',
'-rpath',
@ -40,29 +42,6 @@ const List<String> kDefaultClang = <String>[
'@loader_path/Frameworks',
'-install_name',
'@rpath/App.framework/App',
'-isysroot',
'path/to/sdk',
'-o',
'build/foo/App.framework/App',
'build/foo/snapshot_assembly.o',
];
const List<String> kBitcodeClang = <String>[
'-miphoneos-version-min=8.0',
'-dynamiclib',
'-Xlinker',
'-rpath',
'-Xlinker',
'@executable_path/Frameworks',
'-Xlinker',
'-rpath',
'-Xlinker',
'@loader_path/Frameworks',
'-install_name',
'@rpath/App.framework/App',
'-fembed-bitcode',
'-isysroot',
'path/to/sdk',
'-o',
'build/foo/App.framework/App',
'build/foo/snapshot_assembly.o',
@ -266,6 +245,7 @@ void main() {
'cc',
'-arch',
'armv7',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/sdk',
'-fembed-bitcode',
@ -279,7 +259,24 @@ void main() {
'clang',
'-arch',
'armv7',
...kBitcodeClang,
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/sdk',
'-dynamiclib',
'-Xlinker',
'-rpath',
'-Xlinker',
'@executable_path/Frameworks',
'-Xlinker',
'-rpath',
'-Xlinker',
'@loader_path/Frameworks',
'-install_name',
'@rpath/App.framework/App',
'-fembed-bitcode',
'-o',
'build/foo/App.framework/App',
'build/foo/snapshot_assembly.o',
]),
]);
@ -328,6 +325,7 @@ void main() {
'cc',
'-arch',
'armv7',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/sdk',
'-c',
@ -387,6 +385,7 @@ void main() {
'cc',
'-arch',
'armv7',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/sdk',
'-c',
@ -419,7 +418,6 @@ void main() {
expect(processManager, hasNoRemainingExpectations);
});
testWithoutContext('builds iOS armv7 snapshot', () async {
final String outputPath = fileSystem.path.join('build', 'foo');
final String genSnapshotPath = artifacts.getArtifactPath(
@ -445,6 +443,7 @@ void main() {
'cc',
'-arch',
'armv7',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/sdk',
'-c',
@ -500,6 +499,7 @@ void main() {
'cc',
'-arch',
'arm64',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/sdk',
'-c',

View file

@ -475,6 +475,7 @@ void main() {
'cc',
'-arch',
'armv7',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-c',
@ -487,6 +488,7 @@ void main() {
'cc',
'-arch',
'arm64',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-c',
@ -500,6 +502,8 @@ void main() {
'-arch',
'armv7',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-dynamiclib',
'-Xlinker',
'-rpath',
@ -511,8 +515,6 @@ void main() {
'@loader_path/Frameworks',
'-install_name',
'@rpath/App.framework/App',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-o',
'$build/armv7/App.framework/App',
'$build/armv7/snapshot_assembly.o',
@ -523,6 +525,8 @@ void main() {
'-arch',
'arm64',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-dynamiclib',
'-Xlinker',
'-rpath',
@ -534,8 +538,6 @@ void main() {
'@loader_path/Frameworks',
'-install_name',
'@rpath/App.framework/App',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-o',
'$build/arm64/App.framework/App',
'$build/arm64/snapshot_assembly.o',
@ -581,6 +583,7 @@ void main() {
'cc',
'-arch',
'arm64',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
// Contains bitcode flag.
@ -596,6 +599,8 @@ void main() {
'-arch',
'arm64',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-dynamiclib',
'-Xlinker',
'-rpath',
@ -609,8 +614,6 @@ void main() {
'@rpath/App.framework/App',
// Contains bitcode flag.
'-fembed-bitcode',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-o',
'$build/arm64/App.framework/App',
'$build/arm64/snapshot_assembly.o',
@ -656,6 +659,7 @@ void main() {
'cc',
'-arch',
'arm64',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
// Contains bitcode flag.
@ -671,6 +675,8 @@ void main() {
'-arch',
'arm64',
'-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-dynamiclib',
'-Xlinker',
'-rpath',
@ -684,8 +690,6 @@ void main() {
'@rpath/App.framework/App',
// Contains bitcode flag.
'-fembed-bitcode',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-o',
'$build/arm64/App.framework/App',
'$build/arm64/snapshot_assembly.o',

View file

@ -35,7 +35,7 @@ const List<String> _kSharedConfig = <String>[
'-install_name',
'@rpath/App.framework/App',
'-isysroot',
'path/to/sdk',
'path/to/iPhoneOS.sdk',
];
void main() {
@ -69,9 +69,53 @@ void main() {
expect(const AotAssemblyProfile().analyticsName, 'ios_aot');
});
testUsingContext('DebugUniveralFramework creates simulator binary', () async {
environment.defines[kIosArchs] = 'x86_64';
environment.defines[kSdkRoot] = 'path/to/iPhoneSimulator.sdk';
processManager.addCommand(
FakeCommand(command: <String>[
'xcrun',
'clang',
'-x',
'c',
'-arch',
'x86_64',
fileSystem.path.absolute(fileSystem.path.join(
'.tmp_rand0', 'flutter_tools_stub_source.rand0', 'debug_app.cc')),
'-dynamiclib',
'-fembed-bitcode-marker',
'-miphonesimulator-version-min=8.0',
'-Xlinker',
'-rpath',
'-Xlinker',
'@executable_path/Frameworks',
'-Xlinker',
'-rpath',
'-Xlinker',
'@loader_path/Frameworks',
'-install_name',
'@rpath/App.framework/App',
'-isysroot',
'path/to/iPhoneSimulator.sdk',
'-o',
environment.buildDir
.childDirectory('App.framework')
.childFile('App')
.path,
]),
);
await const DebugUniversalFramework().build(environment);
expect(processManager.hasRemainingExpectations, isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
Platform: () => macPlatform,
});
testUsingContext('DebugUniveralFramework creates expected binary with arm64 only arch', () async {
environment.defines[kIosArchs] = 'arm64';
environment.defines[kSdkRoot] = 'path/to/sdk';
environment.defines[kSdkRoot] = 'path/to/iPhoneOS.sdk';
processManager.addCommand(
FakeCommand(command: <String>[
'xcrun',