Skip to content

Commit 74e2d8f

Browse files
Gold872rainyl
andauthored
Pass environment through cmake executable resolve (#28)
* Pass environment through cmake executable resolve * Don't run commands in shell * bump version to 0.2.3, update changelog --------- Co-authored-by: rainy liu <[email protected]>
1 parent 64e33d2 commit 74e2d8f

File tree

12 files changed

+173
-48
lines changed

12 files changed

+173
-48
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# native_toolchain_cmake
22

3+
## 0.2.3
4+
5+
- new: support skipping generate if cached
6+
- feat: check for prelrease VS version if no stable version is found
7+
- fix: pass environment variables from vcvars.bat to resolvers to allow finding cmake not in PATH
8+
39
## 0.2.2
410

511
- find all available visual studio versions

lib/src/builder/builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ class CMakeBuilder implements Builder {
349349
final tools = await vcvars.defaultResolver!.resolve(logger: logger);
350350
if (tools.isNotEmpty) {
351351
final _vars = await environmentFromBatchFile(tools.first.uri);
352-
logger?.info('Environment variables from $vcvars: $vars');
352+
logger?.info('Environment variables from $vcvars: $_vars');
353353
vars.addAll(_vars);
354354
return vars;
355355
}

lib/src/builder/run_builder.dart

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,23 @@ class RunCMakeBuilder {
8383
}) : outDir = outputDir ?? input.outputDirectory,
8484
userConfig = userConfig ?? UserConfig(targetOS: codeConfig.targetOS);
8585

86-
Future<Uri> cmakePath() async {
87-
final cmakeTools = await cmake.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
86+
Future<Uri> cmakePath({Map<String, String>? environment}) async {
87+
final cmakeTools = await cmake.defaultResolver?.resolve(
88+
logger: logger,
89+
userConfig: userConfig,
90+
environment: environment,
91+
);
8892
final path = cmakeTools?.first.uri;
8993
assert(path != null);
9094
return Future.value(path);
9195
}
9296

93-
Future<Uri> ninjaPath() async {
94-
final ninjaTools = await ninja.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
97+
Future<Uri> ninjaPath({Map<String, String>? environment}) async {
98+
final ninjaTools = await ninja.defaultResolver?.resolve(
99+
logger: logger,
100+
userConfig: userConfig,
101+
environment: environment,
102+
);
95103
final path = ninjaTools?.first.uri;
96104
assert(path != null);
97105
return Future.value(path);
@@ -101,8 +109,12 @@ class RunCMakeBuilder {
101109

102110
Future<Uri> iosToolchainCmake() async => (await currentPackageRoot()).resolve('cmake/ios.toolchain.cmake');
103111

104-
Future<Uri> androidToolchainCmake() async {
105-
final tool = await androidNdk.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
112+
Future<Uri> androidToolchainCmake({Map<String, String>? environment}) async {
113+
final tool = await androidNdk.defaultResolver?.resolve(
114+
logger: logger,
115+
userConfig: userConfig,
116+
environment: environment,
117+
);
106118
final toolUri = tool?.first.uri.resolve('build/cmake/android.toolchain.cmake');
107119
assert(toolUri != null);
108120
return Future.value(toolUri);
@@ -185,14 +197,14 @@ class RunCMakeBuilder {
185197
defines.forEach((k, v) => _defines.add('-D$k=${v ?? "1"}'));
186198

187199
if (generator == Generator.ninja) {
188-
final ninjaBinUri = await ninjaPath();
200+
final ninjaBinUri = await ninjaPath(environment: environment);
189201
final ninjaBinDir = File.fromUri(ninjaBinUri).parent.path;
190202
_defines.add('-DCMAKE_PROGRAM_PATH=$ninjaBinDir');
191203
}
192204
final _generator = generator.toArgs();
193205

194206
final results = await runProcess(
195-
executable: await cmakePath(),
207+
executable: await cmakePath(environment: environment),
196208
arguments: [
197209
'--log-level=${logLevel.name}',
198210
'-S',
@@ -225,7 +237,7 @@ class RunCMakeBuilder {
225237

226238
Future<RunProcessResult> _build({Map<String, String>? environment}) async {
227239
return runProcess(
228-
executable: await cmakePath(),
240+
executable: await cmakePath(environment: environment),
229241
arguments: [
230242
'--build',
231243
outDir.normalizePath().toFilePath(),

lib/src/native_toolchain/android_ndk.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ final androidNdkLld = Tool(name: lld.name, defaultResolver: _AndroidNdkResolver(
3131

3232
class _AndroidNdkResolver implements ToolResolver {
3333
@override
34-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
34+
Future<List<ToolInstance>> resolve({
35+
required Logger? logger,
36+
UserConfig? userConfig,
37+
Map<String, String>? environment,
38+
}) async {
3539
final installLocationResolver = PathVersionResolver(
3640
wrappedResolver: ToolResolvers([
3741
RelativeToolResolver(
@@ -57,7 +61,10 @@ class _AndroidNdkResolver implements ToolResolver {
5761
]),
5862
);
5963

60-
final ndkInstances = await installLocationResolver.resolve(logger: logger);
64+
final ndkInstances = await installLocationResolver.resolve(
65+
logger: logger,
66+
environment: environment,
67+
);
6168
// sort latest version first
6269
ndkInstances.sort(
6370
(a, b) => switch ((a.version, b.version)) {

lib/src/native_toolchain/cmake.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,18 @@ class _CmakeResolver implements ToolResolver {
4646
}
4747

4848
@override
49-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
49+
Future<List<ToolInstance>> resolve({
50+
required Logger? logger,
51+
UserConfig? userConfig,
52+
Map<String, String>? environment,
53+
}) async {
5054
// here, we always try to find android cmake first and filter out unsatisfied versions
5155
final androidResolver = _getAndroidResolver(userConfig: userConfig);
52-
final androidCmakeInstances = await androidResolver.resolve(logger: logger);
56+
final androidCmakeInstances = await androidResolver.resolve(logger: logger, environment: environment);
5357
logger?.info('Found Android CMake: ${androidCmakeInstances.map((e) => e.toString()).join(', ')}');
5458

5559
final systemResolver = _getSystemResolver();
56-
final systemCmakeInstances = await systemResolver.resolve(logger: logger);
60+
final systemCmakeInstances = await systemResolver.resolve(logger: logger, environment: environment);
5761
logger?.info('Found System CMake: ${systemCmakeInstances.map((e) => e.toString()).join(', ')}');
5862

5963
final combinedCmakeInstances = <ToolInstance>[];

lib/src/native_toolchain/msvc.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,16 @@ Tool _msvcTool({
250250

251251
class VisualStudioResolver implements ToolResolver {
252252
@override
253-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
254-
final vswhereInstances = await vswhere.defaultResolver!.resolve(logger: logger, userConfig: userConfig);
253+
Future<List<ToolInstance>> resolve({
254+
required Logger? logger,
255+
UserConfig? userConfig,
256+
Map<String, String>? environment,
257+
}) async {
258+
final vswhereInstances = await vswhere.defaultResolver!.resolve(
259+
logger: logger,
260+
userConfig: userConfig,
261+
environment: environment,
262+
);
255263

256264
final result = <ToolInstance>[];
257265
for (final vswhereInstance in vswhereInstances.take(1)) {
@@ -260,6 +268,7 @@ class VisualStudioResolver implements ToolResolver {
260268
executable: vswhereInstance.uri,
261269
arguments: arguments,
262270
logger: logger,
271+
environment: environment,
263272
);
264273
var toolInfos = json.decode(vswhereResult.stdout) as List;
265274
// Try again including prerelease versions if no stable versions found.
@@ -268,6 +277,7 @@ class VisualStudioResolver implements ToolResolver {
268277
executable: vswhereInstance.uri,
269278
arguments: [...arguments, '-prerelease'],
270279
logger: logger,
280+
environment: environment,
271281
);
272282
toolInfos = json.decode(vswhereResult.stdout) as List;
273283
}

lib/src/native_toolchain/ninja.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,17 @@ class _NinjaResolver implements ToolResolver {
4545
}
4646

4747
@override
48-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
48+
Future<List<ToolInstance>> resolve({
49+
required Logger? logger,
50+
UserConfig? userConfig,
51+
Map<String, String>? environment,
52+
}) async {
4953
final androidResolver = _getAndroidResolver(userConfig: userConfig);
50-
final androidNinjaInstances = await androidResolver.resolve(logger: logger);
54+
final androidNinjaInstances = await androidResolver.resolve(logger: logger, environment: environment);
5155
logger?.info('Found Android Ninja: ${androidNinjaInstances.map((e) => e.toString()).join(', ')}');
5256

5357
final systemResolver = _getSystemResolver();
54-
final systemNinjaInstances = await systemResolver.resolve(logger: logger);
58+
final systemNinjaInstances = await systemResolver.resolve(logger: logger, environment: environment);
5559
logger?.info('Found System Ninja: ${systemNinjaInstances.map((e) => e.toString()).join(', ')}');
5660

5761
final combinedNinjaInstances = <ToolInstance>[];

lib/src/native_toolchain/recognizer.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ class CompilerRecognizer implements ToolResolver {
2020
CompilerRecognizer(this.uri);
2121

2222
@override
23-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
23+
Future<List<ToolInstance>> resolve({
24+
required Logger? logger,
25+
UserConfig? userConfig,
26+
Map<String, String>? environment,
27+
}) async {
2428
final os = OS.current;
2529
logger?.finer('Trying to recognize $uri.');
2630
final filePath = uri.toFilePath();
@@ -61,7 +65,11 @@ class LinkerRecognizer implements ToolResolver {
6165
LinkerRecognizer(this.uri);
6266

6367
@override
64-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
68+
Future<List<ToolInstance>> resolve({
69+
required Logger? logger,
70+
UserConfig? userConfig,
71+
Map<String, String>? environment,
72+
}) async {
6573
final os = OS.current;
6674
logger?.finer('Trying to recognize $uri.');
6775
final filePath = uri.toFilePath();
@@ -106,7 +114,11 @@ class ArchiverRecognizer implements ToolResolver {
106114
ArchiverRecognizer(this.uri);
107115

108116
@override
109-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
117+
Future<List<ToolInstance>> resolve({
118+
required Logger? logger,
119+
UserConfig? userConfig,
120+
Map<String, String>? environment,
121+
}) async {
110122
logger?.finer('Trying to recognize $uri.');
111123
final os = OS.current;
112124
final filePath = uri.toFilePath();

lib/src/native_toolchain/xcode.dart

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,35 @@ final Tool iPhoneSimulatorSdk = Tool(name: 'iPhoneSimulator SDK', defaultResolve
3333

3434
class XCodeSdkResolver implements ToolResolver {
3535
@override
36-
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
37-
final xcrunInstances = await xcrun.defaultResolver!.resolve(logger: logger);
36+
Future<List<ToolInstance>> resolve({
37+
required Logger? logger,
38+
UserConfig? userConfig,
39+
Map<String, String>? environment,
40+
}) async {
41+
final xcrunInstances = await xcrun.defaultResolver!.resolve(logger: logger, environment: environment);
3842

3943
return [
4044
for (final xcrunInstance in xcrunInstances) ...[
41-
...await tryResolveSdk(xcrunInstance: xcrunInstance, sdk: 'macosx', tool: macosxSdk, logger: logger),
45+
...await tryResolveSdk(
46+
xcrunInstance: xcrunInstance,
47+
sdk: 'macosx',
48+
tool: macosxSdk,
49+
logger: logger,
50+
environment: environment,
51+
),
4252
...await tryResolveSdk(
4353
xcrunInstance: xcrunInstance,
4454
sdk: 'iphoneos',
4555
tool: iPhoneOSSdk,
4656
logger: logger,
57+
environment: environment,
4758
),
4859
...await tryResolveSdk(
4960
xcrunInstance: xcrunInstance,
5061
sdk: 'iphonesimulator',
5162
tool: iPhoneSimulatorSdk,
5263
logger: logger,
64+
environment: environment,
5365
),
5466
],
5567
// xcrun --sdk macosx --show-sdk-path)
@@ -61,11 +73,13 @@ class XCodeSdkResolver implements ToolResolver {
6173
required String sdk,
6274
required Tool tool,
6375
required Logger? logger,
76+
Map<String, String>? environment,
6477
}) async {
6578
final result = await runProcess(
6679
executable: xcrunInstance.uri,
6780
arguments: ['--sdk', sdk, '--show-sdk-path'],
6881
logger: logger,
82+
environment: environment,
6983
);
7084
if (result.exitCode == 1) {
7185
assert(result.stderr.contains('cannot be located'));

0 commit comments

Comments
 (0)