Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 24 additions & 21 deletions pkgs/c_compiler/lib/src/cbuilder/cbuilder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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,
]);
}
}
}

Expand Down
85 changes: 46 additions & 39 deletions pkgs/c_compiler/test/cbuilder/cbuilder_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<Int32 Function(Int32, Int32),
int Function(int, int)>('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<Int32 Function(Int32, Int32),
int Function(int, int)>('add');
expect(add(1, 2), 3);
}
},
);
});
}
}
17 changes: 14 additions & 3 deletions pkgs/native_assets_cli/lib/src/model/build_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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].
Expand All @@ -76,6 +80,7 @@ class BuildConfig {
CCompilerConfig? cCompiler,
required LinkModePreference linkModePreference,
Map<String, Metadata>? dependencyMetadata,
bool? dryRun,
}) {
final nonValidated = BuildConfig._()
.._outDir = outDir
Expand All @@ -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);
Expand All @@ -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.
Expand Down Expand Up @@ -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<void Function(Config)> _readFieldsFromConfig() {
var targetSet = false;
Expand Down Expand Up @@ -266,7 +273,8 @@ class BuildConfig {
),
),
(config) =>
_dependencyMetadata = _readDependencyMetadataFromConfig(config)
_dependencyMetadata = _readDependencyMetadataFromConfig(config),
(config) => _dryRun = config.optionalBool(dryRunConfigKey),
];
}

Expand Down Expand Up @@ -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();
}
Expand All @@ -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;
}

Expand All @@ -348,6 +358,7 @@ class BuildConfig {
_cCompiler,
_linkModePreference,
DeepCollectionEquality().hash(_dependencyMetadata),
dryRun,
);

@override
Expand Down
99 changes: 54 additions & 45 deletions pkgs/native_assets_cli/test/example/native_add_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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, <Uri>[]);
} else {
expect(await assets.allExist(), true);
expect(
dependencies.dependencies,
[
testPackageUri.resolve('src/native_add.c'),
testPackageUri.resolve('build.dart'),
],
);
}
});
}
}
6 changes: 4 additions & 2 deletions pkgs/native_assets_cli/test/model/build_config_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
});

Expand Down