diff --git a/pkgs/c_compiler/lib/src/cbuilder/cbuilder.dart b/pkgs/c_compiler/lib/src/cbuilder/cbuilder.dart index e8ec2805bf..c19797303b 100644 --- a/pkgs/c_compiler/lib/src/cbuilder/cbuilder.dart +++ b/pkgs/c_compiler/lib/src/cbuilder/cbuilder.dart @@ -97,23 +97,24 @@ class CBuilder implements Builder { final dartBuildFiles = [ for (final source in this.dartBuildFiles) packageRoot.resolve(source), ]; - - final task = RunCBuilder( - buildConfig: buildConfig, - logger: logger, - sources: sources, - dynamicLibrary: - _type == _CBuilderType.library && linkMode == LinkMode.dynamic - ? libUri - : null, - staticLibrary: - _type == _CBuilderType.library && linkMode == LinkMode.static - ? libUri - : null, - executable: _type == _CBuilderType.executable ? exeUri : null, - installName: installName, - ); - await task.run(); + if (!buildConfig.dryRun) { + final task = RunCBuilder( + buildConfig: buildConfig, + logger: logger, + sources: sources, + dynamicLibrary: + _type == _CBuilderType.library && linkMode == LinkMode.dynamic + ? libUri + : null, + staticLibrary: + _type == _CBuilderType.library && linkMode == LinkMode.static + ? libUri + : null, + executable: _type == _CBuilderType.executable ? exeUri : null, + installName: installName, + ); + await task.run(); + } if (assetName != null) { buildOutput.assets.add(Asset( @@ -123,10 +124,12 @@ class CBuilder implements Builder { path: AssetAbsolutePath(libUri), )); } - buildOutput.dependencies.dependencies.addAll([ - ...sources, - ...dartBuildFiles, - ]); + if (!buildConfig.dryRun) { + buildOutput.dependencies.dependencies.addAll([ + ...sources, + ...dartBuildFiles, + ]); + } } } diff --git a/pkgs/c_compiler/test/cbuilder/cbuilder_test.dart b/pkgs/c_compiler/test/cbuilder/cbuilder_test.dart index 42df4e8a42..fa80dafaf3 100644 --- a/pkgs/c_compiler/test/cbuilder/cbuilder_test.dart +++ b/pkgs/c_compiler/test/cbuilder/cbuilder_test.dart @@ -63,46 +63,53 @@ void main() { }); }); - test('Cbuilder dylib', () async { - await inTempDir( - // https://github.com/dart-lang/sdk/issues/40159 - keepTemp: Platform.isWindows, - (tempUri) async { - final addCUri = - packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); - const name = 'add'; + for (final dryRun in [true, false]) { + final testSuffix = dryRun ? ' dry_run' : ''; + test('Cbuilder dylib$testSuffix', () async { + await inTempDir( + // https://github.com/dart-lang/sdk/issues/40159 + keepTemp: Platform.isWindows, + (tempUri) async { + final addCUri = + packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); + const name = 'add'; - final buildConfig = BuildConfig( - outDir: tempUri, - packageRoot: tempUri, - target: Target.current, - linkModePreference: LinkModePreference.dynamic, - cCompiler: CCompilerConfig( - cc: cc, - envScript: envScript, - envScriptArgs: envScriptArgs, - ), - ); - final buildOutput = BuildOutput(); + final buildConfig = BuildConfig( + outDir: tempUri, + packageRoot: tempUri, + target: Target.current, + linkModePreference: LinkModePreference.dynamic, + cCompiler: CCompilerConfig( + cc: cc, + envScript: envScript, + envScriptArgs: envScriptArgs, + ), + dryRun: dryRun, + ); + final buildOutput = BuildOutput(); - final cbuilder = CBuilder.library( - sources: [addCUri.toFilePath()], - name: name, - assetName: name, - ); - await cbuilder.run( - buildConfig: buildConfig, - buildOutput: buildOutput, - logger: logger, - ); + final cbuilder = CBuilder.library( + sources: [addCUri.toFilePath()], + name: name, + assetName: name, + ); + await cbuilder.run( + buildConfig: buildConfig, + buildOutput: buildOutput, + logger: logger, + ); - final dylibUri = tempUri.resolve(Target.current.os.dylibFileName(name)); - expect(await File.fromUri(dylibUri).exists(), true); - final dylib = DynamicLibrary.open(dylibUri.toFilePath()); - final add = dylib.lookupFunction('add'); - expect(add(1, 2), 3); - }, - ); - }); + final dylibUri = + tempUri.resolve(Target.current.os.dylibFileName(name)); + expect(await File.fromUri(dylibUri).exists(), !dryRun); + if (!dryRun) { + final dylib = DynamicLibrary.open(dylibUri.toFilePath()); + final add = dylib.lookupFunction('add'); + expect(add(1, 2), 3); + } + }, + ); + }); + } } diff --git a/pkgs/native_assets_cli/lib/src/model/build_config.dart b/pkgs/native_assets_cli/lib/src/model/build_config.dart index 8e657cc970..db2d9cb497 100644 --- a/pkgs/native_assets_cli/lib/src/model/build_config.dart +++ b/pkgs/native_assets_cli/lib/src/model/build_config.dart @@ -61,6 +61,10 @@ class BuildConfig { CCompilerConfig get cCompiler => _cCompiler; late final CCompilerConfig _cCompiler; + /// Don't run the build, only report the native assets produced. + bool get dryRun => _dryRun ?? false; + late final bool? _dryRun; + /// The underlying config. /// /// Can be used for easier access to values on [dependencyMetadata]. @@ -76,6 +80,7 @@ class BuildConfig { CCompilerConfig? cCompiler, required LinkModePreference linkModePreference, Map? dependencyMetadata, + bool? dryRun, }) { final nonValidated = BuildConfig._() .._outDir = outDir @@ -85,7 +90,8 @@ class BuildConfig { .._targetAndroidNdkApi = targetAndroidNdkApi .._cCompiler = cCompiler ?? CCompilerConfig() .._linkModePreference = linkModePreference - .._dependencyMetadata = dependencyMetadata; + .._dependencyMetadata = dependencyMetadata + .._dryRun = dryRun; final parsedConfigFile = nonValidated.toYaml(); final config = Config(fileParsed: parsedConfigFile); return BuildConfig.fromConfig(config); @@ -94,7 +100,7 @@ class BuildConfig { /// Constructs a checksum for a [BuildConfig] based on the fields /// of a buildconfig that influence the build. /// - /// This can be used for an [outDir]. + /// This can be used for an [outDir], but should not be used for dry-runs. /// /// In particular, it only takes the package name from [packageRoot], /// so that the hash is equal across checkouts and ignores [outDir] itself. @@ -195,6 +201,7 @@ class BuildConfig { static const dependencyMetadataConfigKey = 'dependency_metadata'; static const _versionKey = 'version'; static const targetAndroidNdkApiConfigKey = 'target_android_ndk_api'; + static const dryRunConfigKey = 'dry_run'; List _readFieldsFromConfig() { var targetSet = false; @@ -266,7 +273,8 @@ class BuildConfig { ), ), (config) => - _dependencyMetadata = _readDependencyMetadataFromConfig(config) + _dependencyMetadata = _readDependencyMetadataFromConfig(config), + (config) => _dryRun = config.optionalBool(dryRunConfigKey), ]; } @@ -315,6 +323,7 @@ class BuildConfig { for (final entry in _dependencyMetadata!.entries) entry.key: entry.value.toYaml(), }, + if (dryRun) dryRunConfigKey: dryRun, _versionKey: version.toString(), }.sortOnKey(); } @@ -335,6 +344,7 @@ class BuildConfig { if (other._linkModePreference != _linkModePreference) return false; if (!DeepCollectionEquality() .equals(other._dependencyMetadata, _dependencyMetadata)) return false; + if (other.dryRun != dryRun) return false; return true; } @@ -348,6 +358,7 @@ class BuildConfig { _cCompiler, _linkModePreference, DeepCollectionEquality().hash(_dependencyMetadata), + dryRun, ); @override diff --git a/pkgs/native_assets_cli/test/example/native_add_test.dart b/pkgs/native_assets_cli/test/example/native_add_test.dart index 2792f4516a..b650b1b72f 100644 --- a/pkgs/native_assets_cli/test/example/native_add_test.dart +++ b/pkgs/native_assets_cli/test/example/native_add_test.dart @@ -26,51 +26,60 @@ void main() async { await Directory.fromUri(tempUri).delete(recursive: true); }); - test('native_add build', () async { - final testTempUri = tempUri.resolve('test1/'); - await Directory.fromUri(testTempUri).create(); - final testPackageUri = packageUri.resolve('example/native_add/'); - final dartUri = Uri.file(Platform.resolvedExecutable); + for (final dryRun in [true, false]) { + final testSuffix = dryRun ? ' dry_run' : ''; + test('native_add build$testSuffix', () async { + final testTempUri = tempUri.resolve('test1/'); + await Directory.fromUri(testTempUri).create(); + final testPackageUri = packageUri.resolve('example/native_add/'); + final dartUri = Uri.file(Platform.resolvedExecutable); - final processResult = await Process.run( - dartUri.toFilePath(), - [ - 'build.dart', - '-Dout_dir=${tempUri.toFilePath()}', - '-Dpackage_root=${testPackageUri.toFilePath()}', - '-Dtarget=${Target.current}', - '-Dlink_mode_preference=dynamic', - if (cc != null) '-Dcc=${cc!.toFilePath()}', - if (envScript != null) - '-D${CCompilerConfig.envScriptConfigKeyFull}=' - '${envScript!.toFilePath()}', - if (envScriptArgs != null) - '-D${CCompilerConfig.envScriptArgsConfigKeyFull}=' - '${envScriptArgs!.join(' ')}', - '-Dversion=${BuildConfig.version}', - ], - workingDirectory: testPackageUri.toFilePath(), - ); - if (processResult.exitCode != 0) { - print(processResult.stdout); - print(processResult.stderr); - print(processResult.exitCode); - } - expect(processResult.exitCode, 0); + final processResult = await Process.run( + dartUri.toFilePath(), + [ + 'build.dart', + '-Dout_dir=${tempUri.toFilePath()}', + '-Dpackage_root=${testPackageUri.toFilePath()}', + '-Dtarget=${Target.current}', + '-Dlink_mode_preference=dynamic', + if (cc != null) '-Dcc=${cc!.toFilePath()}', + if (envScript != null) + '-D${CCompilerConfig.envScriptConfigKeyFull}=' + '${envScript!.toFilePath()}', + if (envScriptArgs != null) + '-D${CCompilerConfig.envScriptArgsConfigKeyFull}=' + '${envScriptArgs!.join(' ')}', + '-Dversion=${BuildConfig.version}', + '-Ddry_run=$dryRun', + ], + workingDirectory: testPackageUri.toFilePath(), + ); + if (processResult.exitCode != 0) { + print(processResult.stdout); + print(processResult.stderr); + print(processResult.exitCode); + } + expect(processResult.exitCode, 0); - final buildOutputUri = tempUri.resolve('build_output.yaml'); - final buildOutput = BuildOutput.fromYamlString( - await File.fromUri(buildOutputUri).readAsString()); - final assets = buildOutput.assets; - expect(assets.length, 1); - final dependencies = buildOutput.dependencies; - expect(await assets.allExist(), true); - expect( - dependencies.dependencies, - [ - testPackageUri.resolve('src/native_add.c'), - testPackageUri.resolve('build.dart'), - ], - ); - }); + final buildOutputUri = tempUri.resolve('build_output.yaml'); + final buildOutput = BuildOutput.fromYamlString( + await File.fromUri(buildOutputUri).readAsString()); + final assets = buildOutput.assets; + expect(assets.length, 1); + final dependencies = buildOutput.dependencies; + if (dryRun) { + expect(await assets.single.exists(), false); + expect(dependencies.dependencies, []); + } else { + expect(await assets.allExist(), true); + expect( + dependencies.dependencies, + [ + testPackageUri.resolve('src/native_add.c'), + testPackageUri.resolve('build.dart'), + ], + ); + } + }); + } } diff --git a/pkgs/native_assets_cli/test/model/build_config_test.dart b/pkgs/native_assets_cli/test/model/build_config_test.dart index 780a65c5fb..2c65f44965 100644 --- a/pkgs/native_assets_cli/test/model/build_config_test.dart +++ b/pkgs/native_assets_cli/test/model/build_config_test.dart @@ -91,14 +91,16 @@ void main() async { target: Target.androidArm64, targetAndroidNdkApi: 30, linkModePreference: LinkModePreference.preferStatic, + dryRun: true, ); final config = Config(fileParsed: { + 'dry_run': true, + 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), 'package_root': packageRootUri.toFilePath(), - 'target': 'android_arm64', 'target_android_ndk_api': 30, - 'link_mode_preference': 'prefer-static', + 'target': 'android_arm64', 'version': BuildOutput.version.toString(), });