Skip to content

Commit 5d5db9e

Browse files
authored
Windows dart ci (#23)
1 parent 49be7f1 commit 5d5db9e

File tree

9 files changed

+132
-22
lines changed

9 files changed

+132
-22
lines changed

pkgs/c_compiler/lib/src/cbuilder/compiler_resolver.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,29 @@ class CompilerResolver {
174174
logger?.finer('No archiver set in config[${BuildConfig.arConfigKey}].');
175175
return null;
176176
}
177+
178+
Future<Uri?> toolchainEnvironmentScript(ToolInstance compiler) async {
179+
final fromConfig = buildConfig.toolchainEnvScript;
180+
if (fromConfig != null) {
181+
logger?.fine('Using toolchainEnvScript from config: $fromConfig');
182+
return fromConfig;
183+
}
184+
185+
final compilerTool = compiler.tool;
186+
assert(compilerTool == cl);
187+
final vcvarsScript =
188+
(await vcvars(compiler).defaultResolver!.resolve(logger: logger)).first;
189+
return vcvarsScript.uri;
190+
}
191+
192+
List<String>? toolchainEnvironmentScriptArguments() {
193+
final fromConfig = buildConfig.toolchainEnvScriptArgs;
194+
if (fromConfig != null) {
195+
logger?.fine('Using toolchainEnvScriptArgs from config: $fromConfig');
196+
return fromConfig;
197+
}
198+
199+
// vcvars above already has x64 or x86 in the script name.
200+
return null;
201+
}
177202
}

pkgs/c_compiler/lib/src/cbuilder/run_cbuilder.dart

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,12 @@ class RunCBuilder {
3636
.length ==
3737
1);
3838

39-
Future<ToolInstance> compiler() async {
40-
final resolver = CompilerResolver(buildConfig: buildConfig, logger: logger);
41-
return await resolver.resolveCompiler();
42-
}
39+
late final _resolver =
40+
CompilerResolver(buildConfig: buildConfig, logger: logger);
4341

44-
Future<Uri> archiver() async {
45-
final resolver = CompilerResolver(buildConfig: buildConfig, logger: logger);
46-
return (await resolver.resolveArchiver()).uri;
47-
}
42+
Future<ToolInstance> compiler() async => await _resolver.resolveCompiler();
43+
44+
Future<Uri> archiver() async => (await _resolver.resolveArchiver()).uri;
4845

4946
Future<Uri> iosSdk(IOSSdk iosSdk, {Logger? logger}) async {
5047
if (iosSdk == IOSSdk.iPhoneOs) {
@@ -76,13 +73,7 @@ class RunCBuilder {
7673
return;
7774
}
7875
assert(compilerTool == cl);
79-
final vcvarsScript =
80-
(await vcvars(compiler_).defaultResolver!.resolve(logger: logger))
81-
.first;
82-
await runCl(
83-
compiler: compiler_.uri,
84-
vcvars: vcvarsScript.uri,
85-
);
76+
await runCl(compiler: compiler_);
8677
}
8778

8879
Future<void> runClangLike({required Uri compiler}) async {
@@ -146,19 +137,19 @@ class RunCBuilder {
146137
}
147138
}
148139

149-
Future<void> runCl({
150-
required Uri compiler,
151-
required Uri vcvars,
152-
}) async {
140+
Future<void> runCl({required ToolInstance compiler}) async {
141+
final vcvars = (await _resolver.toolchainEnvironmentScript(compiler))!;
142+
final vcvarsArgs = _resolver.toolchainEnvironmentScriptArguments();
143+
final environment = await envFromBat(vcvars, arguments: vcvarsArgs ?? []);
144+
153145
final isStaticLib = staticLibrary != null;
154146
Uri? archiver_;
155147
if (isStaticLib) {
156148
archiver_ = await archiver();
157149
}
158150

159-
final environment = await envFromBat(vcvars);
160151
final result = await runProcess(
161-
executable: compiler,
152+
executable: compiler.uri,
162153
arguments: [
163154
if (executable != null) ...[
164155
...sources.map((e) => e.toFilePath()),

pkgs/c_compiler/test/cbuilder/cbuilder_test.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ void main() {
3131
target: Target.current,
3232
packaging: PackagingPreference.dynamic, // Ignored by executables.
3333
cc: cc,
34+
toolchainEnvScript: toolchainEnvScript,
35+
toolchainEnvScriptArgs: toolchainEnvScriptArgs,
3436
);
3537
final buildOutput = BuildOutput();
3638
final cbuilder = CBuilder.executable(
@@ -70,6 +72,8 @@ void main() {
7072
target: Target.current,
7173
packaging: PackagingPreference.dynamic,
7274
cc: cc,
75+
toolchainEnvScript: toolchainEnvScript,
76+
toolchainEnvScriptArgs: toolchainEnvScriptArgs,
7377
);
7478
final buildOutput = BuildOutput();
7579

pkgs/c_compiler/test/cbuilder/compiler_resolver_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:c_compiler/c_compiler.dart';
99
import 'package:c_compiler/src/cbuilder/compiler_resolver.dart';
1010
import 'package:c_compiler/src/native_toolchain/msvc.dart';
1111
import 'package:c_compiler/src/tool/tool_error.dart';
12+
import 'package:collection/collection.dart';
1213
import 'package:native_assets_cli/native_assets_cli.dart';
1314
import 'package:test/test.dart';
1415

@@ -32,6 +33,9 @@ void main() {
3233
...await lib.defaultResolver!.resolve(logger: logger),
3334
...await lld.defaultResolver!.resolve(logger: logger),
3435
].first.uri;
36+
final toolchainEnvScript = [
37+
...await vcvars64.defaultResolver!.resolve(logger: logger)
38+
].firstOrNull?.uri;
3539
final buildConfig = BuildConfig(
3640
outDir: tempUri,
3741
packageRoot: tempUri,
@@ -40,6 +44,7 @@ void main() {
4044
ar: ar,
4145
cc: cc,
4246
ld: ld,
47+
toolchainEnvScript: toolchainEnvScript,
4348
);
4449
final resolver =
4550
CompilerResolver(buildConfig: buildConfig, logger: logger);

pkgs/c_compiler/test/helpers.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ final Uri? cc = Platform.environment['CC']?.asFileUri();
9696
/// Linker provided by the environment.
9797
final Uri? ld = Platform.environment['LD']?.asFileUri();
9898

99+
/// Path to script that sets environment variables for [cc], [ld], and [ar].
100+
///
101+
/// Provided by environment.
102+
final Uri? toolchainEnvScript =
103+
Platform.environment['ToolchainEnvScript']?.asFileUri();
104+
105+
/// Arguments for [toolchainEnvScript] provided by environment.
106+
final List<String>? toolchainEnvScriptArgs =
107+
Platform.environment['ToolchainEnvScriptArguments']?.split(' ');
108+
99109
extension on String {
100110
Uri asFileUri() => Uri.file(this);
101111
}

pkgs/native_assets_cli/lib/src/model/build_config.dart

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ class BuildConfig {
4747
Uri? get ar => _ar;
4848
late final Uri? _ar;
4949

50+
/// Path to script that sets environment variables for [cc], [ld], and [ar].
51+
Uri? get toolchainEnvScript => _toolchainEnvScript;
52+
late final Uri? _toolchainEnvScript;
53+
54+
/// Arguments for [toolchainEnvScript].
55+
List<String>? get toolchainEnvScriptArgs => _toolchainEnvScriptArgs;
56+
late final List<String>? _toolchainEnvScriptArgs;
57+
5058
/// Preferred packaging method for library.
5159
PackagingPreference get packaging => _packaging;
5260
late final PackagingPreference _packaging;
@@ -73,6 +81,8 @@ class BuildConfig {
7381
Uri? ar,
7482
Uri? cc,
7583
Uri? ld,
84+
Uri? toolchainEnvScript,
85+
List<String>? toolchainEnvScriptArgs,
7686
required PackagingPreference packaging,
7787
Map<String, Metadata>? dependencyMetadata,
7888
}) {
@@ -84,6 +94,8 @@ class BuildConfig {
8494
.._ar = ar
8595
.._cc = cc
8696
.._ld = ld
97+
.._toolchainEnvScript = toolchainEnvScript
98+
.._toolchainEnvScriptArgs = toolchainEnvScriptArgs
8799
.._packaging = packaging
88100
.._dependencyMetadata = dependencyMetadata;
89101
final parsedConfigFile = nonValidated.toYaml();
@@ -143,10 +155,14 @@ class BuildConfig {
143155
static const arConfigKey = 'ar';
144156
static const ccConfigKey = 'cc';
145157
static const ldConfigKey = 'ld';
158+
static const toolchainEnvScriptConfigKey = 'toolchain_env_script';
159+
static const toolchainEnvScriptArgsConfigKey =
160+
'toolchain_env_script_arguments';
146161
static const dependencyMetadataConfigKey = 'dependency_metadata';
147162

148163
List<void Function(Config)> _readFieldsFromConfig() {
149164
var targetSet = false;
165+
var ccSet = false;
150166
return [
151167
(config) => _config = config,
152168
(config) => _outDir = config.path(outDirConfigKey),
@@ -169,8 +185,19 @@ class BuildConfig {
169185
)
170186
: null,
171187
(config) => _ar = config.optionalPath(arConfigKey, mustExist: true),
172-
(config) => _cc = config.optionalPath(ccConfigKey, mustExist: true),
188+
(config) {
189+
_cc = config.optionalPath(ccConfigKey, mustExist: true);
190+
ccSet = true;
191+
},
173192
(config) => _ld = config.optionalPath(ldConfigKey, mustExist: true),
193+
(config) => _toolchainEnvScript =
194+
(ccSet && cc != null && cc!.toFilePath().endsWith('cl.exe'))
195+
? config.path(toolchainEnvScriptConfigKey, mustExist: true)
196+
: null,
197+
(config) => _toolchainEnvScriptArgs = config.optionalStringList(
198+
toolchainEnvScriptArgsConfigKey,
199+
splitEnvironmentPattern: ' ',
200+
),
174201
(config) => _packaging = PackagingPreference.fromString(
175202
config.string(
176203
PackagingPreference.configKey,
@@ -218,6 +245,10 @@ class BuildConfig {
218245
if (_ar != null) arConfigKey: _ar!.toFilePath(),
219246
if (_cc != null) ccConfigKey: _cc!.toFilePath(),
220247
if (_ld != null) ldConfigKey: _ld!.toFilePath(),
248+
if (_toolchainEnvScript != null)
249+
toolchainEnvScriptConfigKey: _toolchainEnvScript!.toFilePath(),
250+
if (_toolchainEnvScriptArgs != null)
251+
toolchainEnvScriptArgsConfigKey: _toolchainEnvScriptArgs!,
221252
PackagingPreference.configKey: _packaging.toString(),
222253
if (_dependencyMetadata != null)
223254
dependencyMetadataConfigKey: {
@@ -240,6 +271,9 @@ class BuildConfig {
240271
if (other._ar != _ar) return false;
241272
if (other._cc != _cc) return false;
242273
if (other._ld != _ld) return false;
274+
if (other.toolchainEnvScript != toolchainEnvScript) return false;
275+
if (!ListEquality<String>().equals(
276+
other.toolchainEnvScriptArgs, toolchainEnvScriptArgs)) return false;
243277
if (other._packaging != _packaging) return false;
244278
if (!DeepCollectionEquality()
245279
.equals(other._dependencyMetadata, _dependencyMetadata)) return false;
@@ -255,6 +289,8 @@ class BuildConfig {
255289
_ar,
256290
_cc,
257291
_ld,
292+
_toolchainEnvScript,
293+
ListEquality<String>().hash(toolchainEnvScriptArgs),
258294
_packaging,
259295
DeepCollectionEquality().hash(_dependencyMetadata),
260296
);

pkgs/native_assets_cli/test/example/native_add_test.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ void main() async {
3535
'-Dtarget=${Target.current}',
3636
'-Dpackaging=dynamic',
3737
if (cc != null) '-Dcc=${cc!.toFilePath()}',
38+
if (toolchainEnvScript != null)
39+
'-D${BuildConfig.toolchainEnvScriptConfigKey}='
40+
'${toolchainEnvScript!.toFilePath()}',
41+
if (toolchainEnvScriptArgs != null)
42+
'-D${BuildConfig.toolchainEnvScriptArgsConfigKey}='
43+
'${toolchainEnvScriptArgs!.join(' ')}',
3844
],
3945
workingDirectory: testPackageUri.toFilePath(),
4046
);

pkgs/native_assets_cli/test/helpers.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ final Uri? cc = Platform.environment['CC']?.asFileUri();
5656
/// Linker provided by the environment.
5757
final Uri? ld = Platform.environment['LD']?.asFileUri();
5858

59+
/// Path to script that sets environment variables for [cc], [ld], and [ar].
60+
///
61+
/// Provided by environment.
62+
final Uri? toolchainEnvScript =
63+
Platform.environment['ToolchainEnvScript']?.asFileUri();
64+
65+
/// Arguments for [toolchainEnvScript] provided by environment.
66+
final List<String>? toolchainEnvScriptArgs =
67+
Platform.environment['ToolchainEnvScriptArguments']?.split(' ');
68+
5969
extension on String {
6070
Uri asFileUri() => Uri.file(this);
6171
}

pkgs/native_assets_cli/test/model/build_config_test.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ void main() async {
1313
late Uri fakeClang;
1414
late Uri fakeLd;
1515
late Uri fakeAr;
16+
late Uri fakeCl;
17+
late Uri fakeVcVars;
1618

1719
setUp(() async {
1820
tempUri = (await Directory.systemTemp.createTemp()).uri;
@@ -22,6 +24,10 @@ void main() async {
2224
await File.fromUri(fakeLd).create();
2325
fakeAr = tempUri.resolve('fake_ar');
2426
await File.fromUri(fakeAr).create();
27+
fakeCl = tempUri.resolve('cl.exe');
28+
await File.fromUri(fakeCl).create();
29+
fakeVcVars = tempUri.resolve('vcvarsall.bat');
30+
await File.fromUri(fakeVcVars).create();
2531
});
2632

2733
tearDown(() async {
@@ -275,4 +281,21 @@ target_ios_sdk: iphoneos''';
275281
'value',
276282
);
277283
});
284+
285+
test('toolchainEnvScript', () {
286+
final buildConfig1 = BuildConfig(
287+
outDir: tempUri.resolve('out1/'),
288+
packageRoot: tempUri.resolve('packageRoot/'),
289+
target: Target.windowsX64,
290+
cc: fakeCl,
291+
toolchainEnvScript: fakeVcVars,
292+
toolchainEnvScriptArgs: ['x64'],
293+
packaging: PackagingPreference.dynamic,
294+
);
295+
296+
final configFile = buildConfig1.toYaml();
297+
final config = Config(fileParsed: configFile);
298+
final fromConfig = BuildConfig.fromConfig(config);
299+
expect(fromConfig, equals(buildConfig1));
300+
});
278301
}

0 commit comments

Comments
 (0)