Skip to content

Commit

Permalink
Create static plugin frameworks build ios-framework --static (#104576)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmagman committed May 25, 2022
1 parent 78a0d3d commit f3e567c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 5 deletions.
37 changes: 32 additions & 5 deletions dev/devicelab/bin/tasks/build_ios_framework_module_test.dart
Expand Up @@ -194,6 +194,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
'App',
);

await _checkDylib(appFrameworkPath);
await _checkBitcode(appFrameworkPath, mode);

final String aotSymbols = await _dylibSymbols(appFrameworkPath);
Expand Down Expand Up @@ -292,6 +293,8 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
'connectivity.framework',
'connectivity',
);

await _checkDylib(pluginFrameworkPath);
await _checkBitcode(pluginFrameworkPath, mode);
if (!await _linksOnFlutter(pluginFrameworkPath)) {
throw TaskResult.failure('$pluginFrameworkPath does not link on Flutter');
Expand Down Expand Up @@ -375,6 +378,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
'FlutterPluginRegistrant.framework',
'FlutterPluginRegistrant',
);
await _checkStatic(registrantFrameworkPath);
await _checkBitcode(registrantFrameworkPath, mode);

checkFileExists(path.join(
Expand All @@ -399,7 +403,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
}

// This builds all build modes' frameworks by default
section('Build podspec');
section('Build podspec and static plugins');

const String cocoapodsOutputDirectoryName = 'flutter-frameworks-cocoapods';

Expand All @@ -411,6 +415,7 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
'--cocoapods',
'--force', // Allow podspec creation on master.
'--output=$cocoapodsOutputDirectoryName',
'--static',
],
);
});
Expand All @@ -422,11 +427,13 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
mode,
'Flutter.podspec',
));

checkDirectoryExists(path.join(
await _checkDylib(path.join(
cocoapodsOutputPath,
mode,
'App.xcframework',
'ios-arm64',
'App.framework',
'App',
));

if (Directory(path.join(
Expand All @@ -439,16 +446,22 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
'Unexpected FlutterPluginRegistrant.xcframework.');
}

checkDirectoryExists(path.join(
await _checkStatic(path.join(
cocoapodsOutputPath,
mode,
'package_info.xcframework',
'ios-arm64',
'package_info.framework',
'package_info',
));

checkDirectoryExists(path.join(
await _checkStatic(path.join(
cocoapodsOutputPath,
mode,
'connectivity.xcframework',
'ios-arm64',
'connectivity.framework',
'connectivity',
));

checkDirectoryExists(path.join(
Expand All @@ -475,6 +488,20 @@ Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = fals
}
}

Future<void> _checkDylib(String pathToLibrary) async {
final String binaryFileType = await fileType(pathToLibrary);
if (!binaryFileType.contains('dynamically linked')) {
throw TaskResult.failure('$pathToLibrary is not a dylib, found: $binaryFileType');
}
}

Future<void> _checkStatic(String pathToLibrary) async {
final String binaryFileType = await fileType(pathToLibrary);
if (!binaryFileType.contains('current ar archive random library')) {
throw TaskResult.failure('$pathToLibrary is not a static library, found: $binaryFileType');
}
}

Future<void> _checkBitcode(String frameworkPath, String mode) async {
checkFileExists(frameworkPath);

Expand Down
Expand Up @@ -80,6 +80,9 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
..addFlag('cocoapods',
help: 'Produce a Flutter.podspec instead of an engine Flutter.xcframework (recommended if host app uses CocoaPods).',
)
..addFlag('static',
help: 'Build plugins as static frameworks. Link on, but do not embed these frameworks in the existing Xcode project.',
)
..addOption('output',
abbr: 'o',
valueHelp: 'path/to/directory/',
Expand Down Expand Up @@ -428,6 +431,8 @@ end
'BITCODE_GENERATION_MODE=$bitcodeGenerationMode',
'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures.
'BUILD_LIBRARY_FOR_DISTRIBUTION=YES',
if (boolArg('static') ?? false)
'MACH_O_TYPE=staticlib',
];

RunResult buildPluginsResult = await globals.processUtils.run(
Expand All @@ -453,6 +458,8 @@ end
'ENABLE_BITCODE=YES', // Support host apps with bitcode enabled.
'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures.
'BUILD_LIBRARY_FOR_DISTRIBUTION=YES',
if (boolArg('static') ?? false)
'MACH_O_TYPE=staticlib',
];

buildPluginsResult = await globals.processUtils.run(
Expand Down

0 comments on commit f3e567c

Please sign in to comment.