Unverified Commit 53f5b902 authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

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

parent 75e9318d
...@@ -250,24 +250,24 @@ class AOTSnapshotter { ...@@ -250,24 +250,24 @@ class AOTSnapshotter {
} }
final List<String> commonBuildOptions = <String>[ final List<String> commonBuildOptions = <String>[
'-arch', targetArch, '-arch',
targetArch,
if (isIOS) if (isIOS)
// When the minimum version is updated, remember to update // When the minimum version is updated, remember to update
// template MinimumOSVersion. // template MinimumOSVersion.
// https://github.com/flutter/flutter/pull/62902 // https://github.com/flutter/flutter/pull/62902
'-miphoneos-version-min=8.0', '-miphoneos-version-min=8.0',
if (sdkRoot != null) ...<String>[
'-isysroot',
sdkRoot,
],
]; ];
const String embedBitcodeArg = '-fembed-bitcode'; const String embedBitcodeArg = '-fembed-bitcode';
final String assemblyO = _fileSystem.path.join(outputPath, 'snapshot_assembly.o'); 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>[ final RunResult compileResult = await _xcode.cc(<String>[
'-arch', targetArch, ...commonBuildOptions,
if (isysrootArgs != null) ...isysrootArgs,
if (bitcode) embedBitcodeArg, if (bitcode) embedBitcodeArg,
'-c', '-c',
assemblyPath, assemblyPath,
...@@ -289,7 +289,6 @@ class AOTSnapshotter { ...@@ -289,7 +289,6 @@ class AOTSnapshotter {
'-Xlinker', '-rpath', '-Xlinker', '@loader_path/Frameworks', '-Xlinker', '-rpath', '-Xlinker', '@loader_path/Frameworks',
'-install_name', '@rpath/App.framework/App', '-install_name', '@rpath/App.framework/App',
if (bitcode) embedBitcodeArg, if (bitcode) embedBitcodeArg,
if (isysrootArgs != null) ...isysrootArgs,
'-o', appLib, '-o', appLib,
assemblyO, assemblyO,
]; ];
......
...@@ -69,8 +69,7 @@ abstract class AotAssemblyBase extends Target { ...@@ -69,8 +69,7 @@ abstract class AotAssemblyBase extends Target {
} }
final String sdkRoot = environment.defines[kSdkRoot]; final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType = final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, environment.fileSystem);
environmentTypeFromSdkroot(environment.fileSystem.directory(sdkRoot));
if (environmentType == EnvironmentType.simulator) { if (environmentType == EnvironmentType.simulator) {
throw Exception( throw Exception(
'release/profile builds are only supported for physical devices. ' 'release/profile builds are only supported for physical devices. '
...@@ -222,6 +221,10 @@ class DebugUniversalFramework extends Target { ...@@ -222,6 +221,10 @@ class DebugUniversalFramework extends Target {
@override @override
Future<void> build(Environment environment) async { Future<void> build(Environment environment) async {
if (environment.defines[kSdkRoot] == null) {
throw MissingDefineException(kSdkRoot, name);
}
// Generate a trivial App.framework. // Generate a trivial App.framework.
final Set<String> iosArchNames = environment.defines[kIosArchs] final Set<String> iosArchNames = environment.defines[kIosArchs]
?.split(' ') ?.split(' ')
...@@ -292,8 +295,8 @@ abstract class UnpackIOS extends Target { ...@@ -292,8 +295,8 @@ abstract class UnpackIOS extends Target {
} }
void _copyFramework(Environment environment) { void _copyFramework(Environment environment) {
final Directory sdkRoot = environment.fileSystem.directory(environment.defines[kSdkRoot]); final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot); final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, environment.fileSystem);
final String basePath = environment.artifacts.getArtifactPath( final String basePath = environment.artifacts.getArtifactPath(
Artifact.flutterFramework, Artifact.flutterFramework,
platform: TargetPlatform.ios, platform: TargetPlatform.ios,
...@@ -584,7 +587,8 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment, ...@@ -584,7 +587,8 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
throwToolExit('Failed to create App.framework stub at ${outputFile.path}: $e'); 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.'); .createTempSync('flutter_tools_stub_source.');
try { try {
final File stubSource = tempDir.childFile('debug_app.cc') final File stubSource = tempDir.childFile('debug_app.cc')
...@@ -593,6 +597,8 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment, ...@@ -593,6 +597,8 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
'''); ''');
final String sdkRoot = environment.defines[kSdkRoot]; final String sdkRoot = environment.defines[kSdkRoot];
final EnvironmentType environmentType = environmentTypeFromSdkroot(sdkRoot, fileSystem);
await globals.xcode.clang(<String>[ await globals.xcode.clang(<String>[
'-x', '-x',
'c', 'c',
...@@ -601,7 +607,10 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment, ...@@ -601,7 +607,10 @@ Future<void> _createStubAppFramework(File outputFile, Environment environment,
'-dynamiclib', '-dynamiclib',
'-fembed-bitcode-marker', '-fembed-bitcode-marker',
// Keep version in sync with AOTSnapshotter flag // 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', '@executable_path/Frameworks',
'-Xlinker', '-rpath', '-Xlinker', '@loader_path/Frameworks', '-Xlinker', '-rpath', '-Xlinker', '@loader_path/Frameworks',
'-install_name', '@rpath/App.framework/App', '-install_name', '@rpath/App.framework/App',
......
...@@ -198,10 +198,10 @@ class Xcode { ...@@ -198,10 +198,10 @@ class Xcode {
} }
} }
EnvironmentType? environmentTypeFromSdkroot(Directory sdkroot) { EnvironmentType? environmentTypeFromSdkroot(String sdkroot, FileSystem fileSystem) {
assert(sdkroot != null); assert(sdkroot != null);
// iPhoneSimulator.sdk or iPhoneOS.sdk // iPhoneSimulator.sdk or iPhoneOS.sdk
final String sdkName = sdkroot.basename.toLowerCase(); final String sdkName = fileSystem.path.basename(sdkroot).toLowerCase();
if (sdkName.contains('iphone')) { if (sdkName.contains('iphone')) {
return sdkName.contains('simulator') ? EnvironmentType.simulator : EnvironmentType.physical; return sdkName.contains('simulator') ? EnvironmentType.simulator : EnvironmentType.physical;
} }
......
...@@ -29,26 +29,8 @@ const FakeCommand kARMCheckCommand = FakeCommand( ...@@ -29,26 +29,8 @@ const FakeCommand kARMCheckCommand = FakeCommand(
const List<String> kDefaultClang = <String>[ const List<String> kDefaultClang = <String>[
'-miphoneos-version-min=8.0', '-miphoneos-version-min=8.0',
'-dynamiclib',
'-Xlinker',
'-rpath',
'-Xlinker',
'@executable_path/Frameworks',
'-Xlinker',
'-rpath',
'-Xlinker',
'@loader_path/Frameworks',
'-install_name',
'@rpath/App.framework/App',
'-isysroot', '-isysroot',
'path/to/sdk', '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', '-dynamiclib',
'-Xlinker', '-Xlinker',
'-rpath', '-rpath',
...@@ -60,9 +42,6 @@ const List<String> kBitcodeClang = <String>[ ...@@ -60,9 +42,6 @@ const List<String> kBitcodeClang = <String>[
'@loader_path/Frameworks', '@loader_path/Frameworks',
'-install_name', '-install_name',
'@rpath/App.framework/App', '@rpath/App.framework/App',
'-fembed-bitcode',
'-isysroot',
'path/to/sdk',
'-o', '-o',
'build/foo/App.framework/App', 'build/foo/App.framework/App',
'build/foo/snapshot_assembly.o', 'build/foo/snapshot_assembly.o',
...@@ -266,6 +245,7 @@ void main() { ...@@ -266,6 +245,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'armv7', 'armv7',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/sdk', 'path/to/sdk',
'-fembed-bitcode', '-fembed-bitcode',
...@@ -279,7 +259,24 @@ void main() { ...@@ -279,7 +259,24 @@ void main() {
'clang', 'clang',
'-arch', '-arch',
'armv7', '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() { ...@@ -328,6 +325,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'armv7', 'armv7',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/sdk', 'path/to/sdk',
'-c', '-c',
...@@ -387,6 +385,7 @@ void main() { ...@@ -387,6 +385,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'armv7', 'armv7',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/sdk', 'path/to/sdk',
'-c', '-c',
...@@ -419,7 +418,6 @@ void main() { ...@@ -419,7 +418,6 @@ void main() {
expect(processManager, hasNoRemainingExpectations); expect(processManager, hasNoRemainingExpectations);
}); });
testWithoutContext('builds iOS armv7 snapshot', () async { testWithoutContext('builds iOS armv7 snapshot', () async {
final String outputPath = fileSystem.path.join('build', 'foo'); final String outputPath = fileSystem.path.join('build', 'foo');
final String genSnapshotPath = artifacts.getArtifactPath( final String genSnapshotPath = artifacts.getArtifactPath(
...@@ -445,6 +443,7 @@ void main() { ...@@ -445,6 +443,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'armv7', 'armv7',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/sdk', 'path/to/sdk',
'-c', '-c',
...@@ -500,6 +499,7 @@ void main() { ...@@ -500,6 +499,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'arm64', 'arm64',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/sdk', 'path/to/sdk',
'-c', '-c',
......
...@@ -475,6 +475,7 @@ void main() { ...@@ -475,6 +475,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'armv7', 'armv7',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/iPhoneOS.sdk', 'path/to/iPhoneOS.sdk',
'-c', '-c',
...@@ -487,6 +488,7 @@ void main() { ...@@ -487,6 +488,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'arm64', 'arm64',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/iPhoneOS.sdk', 'path/to/iPhoneOS.sdk',
'-c', '-c',
...@@ -500,6 +502,8 @@ void main() { ...@@ -500,6 +502,8 @@ void main() {
'-arch', '-arch',
'armv7', 'armv7',
'-miphoneos-version-min=8.0', '-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-dynamiclib', '-dynamiclib',
'-Xlinker', '-Xlinker',
'-rpath', '-rpath',
...@@ -511,8 +515,6 @@ void main() { ...@@ -511,8 +515,6 @@ void main() {
'@loader_path/Frameworks', '@loader_path/Frameworks',
'-install_name', '-install_name',
'@rpath/App.framework/App', '@rpath/App.framework/App',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-o', '-o',
'$build/armv7/App.framework/App', '$build/armv7/App.framework/App',
'$build/armv7/snapshot_assembly.o', '$build/armv7/snapshot_assembly.o',
...@@ -523,6 +525,8 @@ void main() { ...@@ -523,6 +525,8 @@ void main() {
'-arch', '-arch',
'arm64', 'arm64',
'-miphoneos-version-min=8.0', '-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-dynamiclib', '-dynamiclib',
'-Xlinker', '-Xlinker',
'-rpath', '-rpath',
...@@ -534,8 +538,6 @@ void main() { ...@@ -534,8 +538,6 @@ void main() {
'@loader_path/Frameworks', '@loader_path/Frameworks',
'-install_name', '-install_name',
'@rpath/App.framework/App', '@rpath/App.framework/App',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-o', '-o',
'$build/arm64/App.framework/App', '$build/arm64/App.framework/App',
'$build/arm64/snapshot_assembly.o', '$build/arm64/snapshot_assembly.o',
...@@ -581,6 +583,7 @@ void main() { ...@@ -581,6 +583,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'arm64', 'arm64',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/iPhoneOS.sdk', 'path/to/iPhoneOS.sdk',
// Contains bitcode flag. // Contains bitcode flag.
...@@ -596,6 +599,8 @@ void main() { ...@@ -596,6 +599,8 @@ void main() {
'-arch', '-arch',
'arm64', 'arm64',
'-miphoneos-version-min=8.0', '-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-dynamiclib', '-dynamiclib',
'-Xlinker', '-Xlinker',
'-rpath', '-rpath',
...@@ -609,8 +614,6 @@ void main() { ...@@ -609,8 +614,6 @@ void main() {
'@rpath/App.framework/App', '@rpath/App.framework/App',
// Contains bitcode flag. // Contains bitcode flag.
'-fembed-bitcode', '-fembed-bitcode',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-o', '-o',
'$build/arm64/App.framework/App', '$build/arm64/App.framework/App',
'$build/arm64/snapshot_assembly.o', '$build/arm64/snapshot_assembly.o',
...@@ -656,6 +659,7 @@ void main() { ...@@ -656,6 +659,7 @@ void main() {
'cc', 'cc',
'-arch', '-arch',
'arm64', 'arm64',
'-miphoneos-version-min=8.0',
'-isysroot', '-isysroot',
'path/to/iPhoneOS.sdk', 'path/to/iPhoneOS.sdk',
// Contains bitcode flag. // Contains bitcode flag.
...@@ -671,6 +675,8 @@ void main() { ...@@ -671,6 +675,8 @@ void main() {
'-arch', '-arch',
'arm64', 'arm64',
'-miphoneos-version-min=8.0', '-miphoneos-version-min=8.0',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-dynamiclib', '-dynamiclib',
'-Xlinker', '-Xlinker',
'-rpath', '-rpath',
...@@ -684,8 +690,6 @@ void main() { ...@@ -684,8 +690,6 @@ void main() {
'@rpath/App.framework/App', '@rpath/App.framework/App',
// Contains bitcode flag. // Contains bitcode flag.
'-fembed-bitcode', '-fembed-bitcode',
'-isysroot',
'path/to/iPhoneOS.sdk',
'-o', '-o',
'$build/arm64/App.framework/App', '$build/arm64/App.framework/App',
'$build/arm64/snapshot_assembly.o', '$build/arm64/snapshot_assembly.o',
......
...@@ -35,7 +35,7 @@ const List<String> _kSharedConfig = <String>[ ...@@ -35,7 +35,7 @@ const List<String> _kSharedConfig = <String>[
'-install_name', '-install_name',
'@rpath/App.framework/App', '@rpath/App.framework/App',
'-isysroot', '-isysroot',
'path/to/sdk', 'path/to/iPhoneOS.sdk',
]; ];
void main() { void main() {
...@@ -69,9 +69,53 @@ void main() { ...@@ -69,9 +69,53 @@ void main() {
expect(const AotAssemblyProfile().analyticsName, 'ios_aot'); 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 { testUsingContext('DebugUniveralFramework creates expected binary with arm64 only arch', () async {
environment.defines[kIosArchs] = 'arm64'; environment.defines[kIosArchs] = 'arm64';
environment.defines[kSdkRoot] = 'path/to/sdk'; environment.defines[kSdkRoot] = 'path/to/iPhoneOS.sdk';
processManager.addCommand( processManager.addCommand(
FakeCommand(command: <String>[ FakeCommand(command: <String>[
'xcrun', 'xcrun',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment