Skip to content

Commit 17558d5

Browse files
dcharkesCommit Queue
authored and
Commit Queue
committed
[native assets] Support user-defines from pubspec
Change-Id: I9978bbb3bae0170b76f9419e18f4b18f75dab577 Cq-Include-Trybots: luci.dart.try:pkg-linux-debug-try,pkg-linux-release-arm64-try,pkg-linux-release-try,pkg-mac-release-arm64-try,pkg-win-release-arm64-try,pkg-mac-release-try,pkg-win-release-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/420700 Commit-Queue: Daco Harkes <[email protected]> Reviewed-by: Moritz Sümmermann <[email protected]>
1 parent 8e71bac commit 17558d5

File tree

9 files changed

+169
-9
lines changed

9 files changed

+169
-9
lines changed

pkg/dartdev/lib/src/commands/build.dart

+16
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:front_end/src/api_prototype/compiler_options.dart'
1515
import 'package:native_assets_cli/code_assets_builder.dart';
1616
import 'package:path/path.dart' as path;
1717
import 'package:vm/target_os.dart'; // For possible --target-os values.
18+
import 'package:yaml/yaml.dart';
1819

1920
import '../core.dart';
2021
import '../native_assets.dart';
@@ -134,7 +135,22 @@ class BuildCommand extends DartdevCommand {
134135
final runPackageName = await DartNativeAssetsBuilder.findRootPackageName(
135136
sourceUri,
136137
);
138+
final pubspecUri = await DartNativeAssetsBuilder.findPubspec(sourceUri);
139+
final Map? pubspec;
140+
if (pubspecUri == null) {
141+
pubspec = null;
142+
} else {
143+
pubspec = loadYaml(File.fromUri(pubspecUri).readAsStringSync()) as Map;
144+
final pubspecErrors =
145+
DartNativeAssetsBuilder.validateHooksUserDefinesFromPubspec(pubspec);
146+
if (pubspecErrors.isNotEmpty) {
147+
log.stderr('Errors in pubspec:');
148+
pubspecErrors.forEach(log.stderr);
149+
return 255;
150+
}
151+
}
137152
final builder = DartNativeAssetsBuilder(
153+
pubspec: pubspec,
138154
packageConfigUri: packageConfig!,
139155
runPackageName: runPackageName!,
140156
verbose: verbose,

pkg/dartdev/lib/src/commands/compile.dart

+19
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:native_assets_cli/code_assets_builder.dart'
1515
show Architecture, OS, Target;
1616
import 'package:path/path.dart' as path;
1717
import 'package:vm/target_os.dart';
18+
import 'package:yaml/yaml.dart';
1819

1920
import '../core.dart';
2021
import '../experiments.dart';
@@ -628,7 +629,25 @@ Remove debugging information from the output and save it separately to the speci
628629
Directory.current.uri,
629630
);
630631
if (runPackageName != null) {
632+
final pubspecUri =
633+
await DartNativeAssetsBuilder.findPubspec(Directory.current.uri);
634+
final Map? pubspec;
635+
if (pubspecUri == null) {
636+
pubspec = null;
637+
} else {
638+
pubspec =
639+
loadYaml(File.fromUri(pubspecUri).readAsStringSync()) as Map;
640+
final pubspecErrors =
641+
DartNativeAssetsBuilder.validateHooksUserDefinesFromPubspec(
642+
pubspec);
643+
if (pubspecErrors.isNotEmpty) {
644+
log.stderr('Errors in pubspec:');
645+
pubspecErrors.forEach(log.stderr);
646+
return 255;
647+
}
648+
}
631649
final builder = DartNativeAssetsBuilder(
650+
pubspec: pubspec,
632651
packageConfigUri: packageConfig,
633652
runPackageName: runPackageName,
634653
verbose: verbose,

pkg/dartdev/lib/src/commands/run.dart

+19
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:frontend_server/resident_frontend_server_utils.dart'
1212
show invokeReplaceCachedDill;
1313
import 'package:path/path.dart';
1414
import 'package:pub/pub.dart';
15+
import 'package:yaml/yaml.dart';
1516

1617
import '../core.dart';
1718
import '../experiments.dart';
@@ -380,7 +381,25 @@ class RunCommand extends DartdevCommand {
380381
Directory.current.uri,
381382
);
382383
if (runPackageName != null) {
384+
final pubspecUri =
385+
await DartNativeAssetsBuilder.findPubspec(Directory.current.uri);
386+
final Map? pubspec;
387+
if (pubspecUri == null) {
388+
pubspec = null;
389+
} else {
390+
pubspec =
391+
loadYaml(File.fromUri(pubspecUri).readAsStringSync()) as Map;
392+
final pubspecErrors =
393+
DartNativeAssetsBuilder.validateHooksUserDefinesFromPubspec(
394+
pubspec);
395+
if (pubspecErrors.isNotEmpty) {
396+
log.stderr('Errors in pubspec:');
397+
pubspecErrors.forEach(log.stderr);
398+
return errorExitCode;
399+
}
400+
}
383401
final builder = DartNativeAssetsBuilder(
402+
pubspec: pubspec,
384403
packageConfigUri: packageConfig,
385404
runPackageName: runPackageName,
386405
verbose: verbose,

pkg/dartdev/lib/src/commands/test.dart

+19
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'dart:io';
88
import 'package:args/args.dart';
99
import 'package:dartdev/src/experiments.dart';
1010
import 'package:pub/pub.dart';
11+
import 'package:yaml/yaml.dart';
1112

1213
import '../core.dart';
1314
import '../native_assets.dart';
@@ -55,7 +56,25 @@ Run "${runner!.executableName} help" to see global options.''');
5556
Directory.current.uri,
5657
);
5758
if (runPackageName != null) {
59+
final pubspecUri =
60+
await DartNativeAssetsBuilder.findPubspec(Directory.current.uri);
61+
final Map? pubspec;
62+
if (pubspecUri == null) {
63+
pubspec = null;
64+
} else {
65+
pubspec =
66+
loadYaml(File.fromUri(pubspecUri).readAsStringSync()) as Map;
67+
final pubspecErrors =
68+
DartNativeAssetsBuilder.validateHooksUserDefinesFromPubspec(
69+
pubspec);
70+
if (pubspecErrors.isNotEmpty) {
71+
log.stderr('Errors in pubspec:');
72+
pubspecErrors.forEach(log.stderr);
73+
return DartdevCommand.errorExitCode;
74+
}
75+
}
5876
final builder = DartNativeAssetsBuilder(
77+
pubspec: pubspec,
5978
packageConfigUri: packageConfig,
6079
runPackageName: runPackageName,
6180
verbose: verbose,

pkg/dartdev/lib/src/native_assets.dart

+23-9
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import 'package:yaml/yaml.dart' show loadYaml;
1919
import 'core.dart';
2020

2121
class DartNativeAssetsBuilder {
22+
final Map<Object?, Object?>? pubspec;
2223
final Uri packageConfigUri;
2324
final String runPackageName;
2425
final bool verbose;
@@ -50,21 +51,34 @@ class DartNativeAssetsBuilder {
5051

5152
late final Future<NativeAssetsBuildRunner> _nativeAssetsBuildRunner =
5253
() async {
54+
final Map<String, Map<String, Object?>?> userDefines;
55+
if (pubspec == null) {
56+
userDefines = {};
57+
} else {
58+
userDefines =
59+
NativeAssetsBuildRunner.readHooksUserDefinesFromPubspec(pubspec!);
60+
}
5361
return NativeAssetsBuildRunner(
5462
// This always runs in JIT mode.
5563
dartExecutable: Uri.file(sdk.dart),
5664
logger: _logger,
5765
fileSystem: const LocalFileSystem(),
5866
packageLayout: await _packageLayout,
67+
userDefines: userDefines,
5968
);
6069
}();
6170

62-
DartNativeAssetsBuilder(
63-
{required this.packageConfigUri,
64-
required this.runPackageName,
65-
required this.verbose,
66-
Target? target})
67-
: target = target ?? Target.current;
71+
static List<String> validateHooksUserDefinesFromPubspec(
72+
Map<Object?, Object?> pubspec) =>
73+
NativeAssetsBuildRunner.validateHooksUserDefinesFromPubspec(pubspec);
74+
75+
DartNativeAssetsBuilder({
76+
this.pubspec,
77+
required this.packageConfigUri,
78+
required this.runPackageName,
79+
required this.verbose,
80+
Target? target,
81+
}) : target = target ?? Target.current;
6882

6983
/// Compiles all native assets for host OS in JIT mode.
7084
///
@@ -223,7 +237,7 @@ class DartNativeAssetsBuilder {
223237
// TODO(https://github.com/dart-lang/package_config/issues/126): Use
224238
// package config resolution from package:package_config.
225239
if (packageConfig == null) {
226-
final pubspecMaybe = await _findPubspec(uri);
240+
final pubspecMaybe = await findPubspec(uri);
227241
if (pubspecMaybe != null) {
228242
// Silently run `pub get`, this is what would happen in
229243
// `getExecutableForCommand` later.
@@ -259,7 +273,7 @@ class DartNativeAssetsBuilder {
259273
}
260274
}
261275

262-
static Future<Uri?> _findPubspec(Uri uri) async {
276+
static Future<Uri?> findPubspec(Uri uri) async {
263277
while (true) {
264278
final candidate = uri.resolve('pubspec.yaml');
265279
if (await File.fromUri(candidate).exists()) {
@@ -277,7 +291,7 @@ class DartNativeAssetsBuilder {
277291
///
278292
/// Returns `null` if package cannnot be determined.
279293
static Future<String?> findRootPackageName(Uri uri) async {
280-
final pubspecUri = await _findPubspec(uri);
294+
final pubspecUri = await findPubspec(uri);
281295
if (pubspecUri == null) {
282296
return null;
283297
}

pkg/dartdev/test/native_assets/build_test.dart

+29
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,35 @@ void main(List<String> args) {
327327
});
328328
},
329329
);
330+
331+
test(
332+
'dart build with user defines',
333+
timeout: longTimeout,
334+
() async {
335+
await nativeAssetsTest('user_defines', (packageUri) async {
336+
await runDart(
337+
arguments: [
338+
'--enable-experiment=native-assets',
339+
'build',
340+
'bin/user_defines.dart',
341+
],
342+
workingDirectory: packageUri,
343+
logger: logger,
344+
);
345+
346+
final outputDirectory =
347+
Directory.fromUri(packageUri.resolve('bin/user_defines'));
348+
expect(outputDirectory.existsSync(), true);
349+
350+
final proccessResult = await runProcess(
351+
executable: outputDirectory.uri.resolve('user_defines.exe'),
352+
logger: logger,
353+
throwOnUnexpectedExitCode: true,
354+
);
355+
expect(proccessResult.stdout, contains('Hello world!'));
356+
});
357+
},
358+
);
330359
}
331360

332361
Future<void> _withTempDir(Future<void> Function(Uri tempUri) fun) async {

pkg/dartdev/test/native_assets/helpers.dart

+1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ Future<void> nativeAssetsTest(
191191
'native_dynamic_linking',
192192
'system_library',
193193
'treeshaking_native_libs',
194+
'user_defines',
194195
],
195196
Platform.script.resolve(
196197
'../../../../third_party/pkg/native/pkgs/native_assets_builder/'),

pkg/dartdev/test/native_assets/run_test.dart

+19
Original file line numberDiff line numberDiff line change
@@ -192,4 +192,23 @@ Couldn't resolve native function 'multiply' in 'package:drop_dylib_link/dylib_mu
192192
expect(result.stdout, contains('42'));
193193
});
194194
});
195+
196+
test(
197+
'dart run with user defines',
198+
timeout: longTimeout,
199+
() async {
200+
await nativeAssetsTest('user_defines', (packageUri) async {
201+
final result = await runDart(
202+
arguments: [
203+
'--enable-experiment=native-assets',
204+
'run',
205+
'bin/user_defines.dart',
206+
],
207+
workingDirectory: packageUri,
208+
logger: logger,
209+
);
210+
expect(result.stdout, contains('Hello world!'));
211+
});
212+
},
213+
);
195214
}

pkg/dartdev/test/native_assets/test_test.dart

+24
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,28 @@ void main(List<String> args) async {
123123
);
124124
});
125125
});
126+
test(
127+
'dart test with user defines',
128+
timeout: longTimeout,
129+
() async {
130+
await nativeAssetsTest('user_defines', (packageUri) async {
131+
final result = await runDart(
132+
arguments: [
133+
'--enable-experiment=native-assets',
134+
'test',
135+
],
136+
workingDirectory: packageUri,
137+
logger: logger,
138+
);
139+
expect(
140+
result.stdout,
141+
stringContainsInOrder(
142+
[
143+
'All tests passed!',
144+
],
145+
),
146+
);
147+
});
148+
},
149+
);
126150
}

0 commit comments

Comments
 (0)