Skip to content

Commit 15173bb

Browse files
committed
change BuildExtraConfig to UserConfig, add UserConfig? userConfig to ToolResolver
1 parent 2b441c6 commit 15173bb

File tree

16 files changed

+368
-502
lines changed

16 files changed

+368
-502
lines changed

lib/src/builder/build_extra_config.dart

Lines changed: 0 additions & 9 deletions
This file was deleted.

lib/src/builder/builder.dart

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ import 'dart:io';
1111
import 'package:code_assets/code_assets.dart';
1212
import 'package:hooks/hooks.dart';
1313
import 'package:logging/logging.dart';
14-
import 'package:native_toolchain_cmake/src/builder/build_extra_config.dart';
15-
import 'package:native_toolchain_cmake/src/utils/env_from_native_config.dart';
1614

1715
import '../native_toolchain/msvc.dart';
1816
import '../utils/env_from_bat.dart';
17+
import '../utils/env_from_native_config.dart';
1918
import '../utils/run_process.dart';
2019
import 'build_mode.dart';
2120
import 'builder_args.dart';
2221
import 'generator.dart';
2322
import 'log_level.dart';
2423
import 'run_builder.dart';
24+
import 'user_config.dart';
2525

2626
/// Specification for building an artifact with a C compiler.
2727
class CMakeBuilder implements Builder {
@@ -202,11 +202,7 @@ class CMakeBuilder implements Builder {
202202
///
203203
/// Completes with an error if the build fails.
204204
@override
205-
Future<void> run({
206-
required BuildInput input,
207-
required BuildOutputBuilder output,
208-
Logger? logger,
209-
}) async {
205+
Future<void> run({required BuildInput input, required BuildOutputBuilder output, Logger? logger}) async {
210206
// do not override user specified output directory if they also set buildLocal to true
211207
if (outDir == null && buildLocal) {
212208
final os = input.config.code.targetOS;
@@ -220,6 +216,25 @@ class CMakeBuilder implements Builder {
220216
}
221217
await Directory.fromUri(outDir ?? input.outputDirectory).create(recursive: true);
222218

219+
var userConfig = UserConfig(
220+
androidHome: input.userDefines["androidHome"] as String?,
221+
cmakeVersion: input.userDefines["cmakeVersion"] as String?,
222+
ninjaVersion: input.userDefines["ninjaVersion"] as String?,
223+
ndkVersion: input.userDefines["ndkVersion"] as String?,
224+
preferAndroidNinja: input.userDefines["preferAndroidNinja"] as bool? ?? false,
225+
preferAndroidCmake: input.userDefines["preferAndroidCmake"] as bool? ?? false,
226+
);
227+
228+
// optional host specific build config
229+
final envFile = input.userDefines["envFile"] as String?;
230+
if (envFile != null) {
231+
final userEnvConfig = await getUserEnvConfig(input: input, envFile: envFile);
232+
final androidHome = userEnvConfig['ANDROID_HOME'];
233+
if (androidHome != null) {
234+
userConfig = userConfig.copyWith(androidHome: androidHome);
235+
}
236+
}
237+
223238
final task = RunCMakeBuilder(
224239
input: input,
225240
outputDir: outDir,
@@ -232,6 +247,7 @@ class CMakeBuilder implements Builder {
232247
targets: targets,
233248
appleArgs: appleArgs,
234249
androidArgs: androidArgs,
250+
userConfig: userConfig,
235251
logLevel: logLevel,
236252
);
237253

@@ -247,25 +263,6 @@ class CMakeBuilder implements Builder {
247263
);
248264
}
249265

250-
// tool versions
251-
final userDefines = input.userDefines;
252-
BuildExtraConfig.cmakeVersion = userDefines["cmakeVersion"] as String?;
253-
BuildExtraConfig.ninjaVersion = userDefines["ninjaVersion"] as String?;
254-
BuildExtraConfig.ndkVersion = userDefines["ndkVersion"] as String?;
255-
256-
// optional host specific build config
257-
final hostBuildConfigFile = userDefines["hostBuildConfigFile"] as String?;
258-
if (hostBuildConfigFile != null) {
259-
final hostBuildConfig = await getHostBuildConfig(
260-
input: input,
261-
hostBuildConfigFile: hostBuildConfigFile,
262-
);
263-
final androidHome = hostBuildConfig['ANDROID_HOME'];
264-
if (androidHome != null) {
265-
BuildExtraConfig.androidHome = androidHome;
266-
}
267-
}
268-
269266
await task.run(environment: envVars);
270267
}
271268

@@ -280,10 +277,7 @@ class CMakeBuilder implements Builder {
280277
// TODO: patch environment variables for cmake
281278
// may be error if system drive is not C:
282279
// https://github.com/dart-lang/native/issues/2077
283-
final vars = {
284-
"WINDIR": r"C:\WINDOWS",
285-
"SYSTEMDRIVE": "C:",
286-
};
280+
final vars = {"WINDIR": r"C:\WINDOWS", "SYSTEMDRIVE": "C:"};
287281

288282
if (targetOS != OS.windows) return {};
289283
targetArchitecture ??= Architecture.current;

lib/src/builder/run_builder.dart

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ import 'package:change_case/change_case.dart';
1313
import 'package:code_assets/code_assets.dart';
1414
import 'package:hooks/hooks.dart';
1515
import 'package:logging/logging.dart';
16-
import 'package:native_toolchain_cmake/src/native_toolchain/ninja.dart';
1716
import 'package:path/path.dart';
1817

1918
import '../native_toolchain/android_ndk.dart';
2019
import '../native_toolchain/cmake.dart';
20+
import '../native_toolchain/ninja.dart';
2121
import '../native_toolchain/xcode.dart';
2222
import '../tool/tool_instance.dart';
2323
import '../utils/package_config_parser.dart';
@@ -26,6 +26,7 @@ import 'build_mode.dart';
2626
import 'builder_args.dart';
2727
import 'generator.dart';
2828
import 'log_level.dart';
29+
import 'user_config.dart';
2930

3031
class RunCMakeBuilder {
3132
final HookInput input;
@@ -55,6 +56,9 @@ class RunCMakeBuilder {
5556
// android ndk
5657
final AndroidBuilderArgs androidArgs;
5758

59+
// user defined configs
60+
final UserConfig userConfig;
61+
5862
/// log level of CMake
5963
final LogLevel logLevel;
6064

@@ -71,24 +75,19 @@ class RunCMakeBuilder {
7175
this.targets,
7276
this.androidArgs = const AndroidBuilderArgs(),
7377
this.appleArgs = const AppleBuilderArgs(),
78+
this.userConfig = const UserConfig(),
7479
this.logLevel = LogLevel.STATUS,
7580
}) : outDir = outputDir ?? input.outputDirectory;
7681

7782
Future<Uri> cmakePath() async {
78-
final cmakeTools = switch (codeConfig.targetOS) {
79-
OS.android => await androidCmake.defaultResolver?.resolve(logger: logger),
80-
_ => await cmake.defaultResolver?.resolve(logger: logger),
81-
};
83+
final cmakeTools = await cmake.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
8284
final path = cmakeTools?.first.uri;
8385
assert(path != null);
8486
return Future.value(path);
8587
}
8688

8789
Future<Uri> ninjaPath() async {
88-
final ninjaTools = switch (codeConfig.targetOS) {
89-
OS.android => await androidNinja.defaultResolver?.resolve(logger: logger),
90-
_ => await ninja.defaultResolver?.resolve(logger: logger),
91-
};
90+
final ninjaTools = await ninja.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
9291
final path = ninjaTools?.first.uri;
9392
assert(path != null);
9493
return Future.value(path);
@@ -99,36 +98,37 @@ class RunCMakeBuilder {
9998
Future<Uri> iosToolchainCmake() async => (await currentPackageRoot()).resolve('cmake/ios.toolchain.cmake');
10099

101100
Future<Uri> androidToolchainCmake() async {
102-
final tool = await androidNdk.defaultResolver?.resolve(logger: logger);
101+
final tool = await androidNdk.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
103102
final toolUri = tool?.first.uri.resolve('build/cmake/android.toolchain.cmake');
104103
assert(toolUri != null);
105104
return Future.value(toolUri);
106105
}
107106

108107
Future<Uri> linuxToolchainCmake() async => switch (codeConfig.targetArchitecture) {
109-
Architecture.x64 => (await currentPackageRoot()).resolve('cmake/x86_64-linux-gnu.toolchain.cmake'),
110-
Architecture.arm64 => (await currentPackageRoot()).resolve('cmake/aarch64-linux-gnu.toolchain.cmake'),
111-
Architecture.riscv64 =>
112-
(await currentPackageRoot()).resolve('cmake/riscv64-linux-gnu.toolchain.cmake'),
113-
_ => throw UnimplementedError('Unsupported architecture: ${codeConfig.targetArchitecture} for Linux'),
114-
};
108+
Architecture.x64 => (await currentPackageRoot()).resolve('cmake/x86_64-linux-gnu.toolchain.cmake'),
109+
Architecture.arm64 => (await currentPackageRoot()).resolve('cmake/aarch64-linux-gnu.toolchain.cmake'),
110+
Architecture.riscv64 => (await currentPackageRoot()).resolve('cmake/riscv64-linux-gnu.toolchain.cmake'),
111+
_ => throw UnimplementedError('Unsupported architecture: ${codeConfig.targetArchitecture} for Linux'),
112+
};
115113

116114
Future<Uri> iosSdk(IOSSdk iosSdk, {required Logger? logger}) async {
117115
if (iosSdk == IOSSdk.iPhoneOS) {
118-
return (await iPhoneOSSdk.defaultResolver!.resolve(logger: logger))
119-
.where((i) => i.tool == iPhoneOSSdk)
120-
.first
121-
.uri;
116+
return (await iPhoneOSSdk.defaultResolver!.resolve(
117+
logger: logger,
118+
userConfig: userConfig,
119+
)).where((i) => i.tool == iPhoneOSSdk).first.uri;
122120
}
123121
assert(iosSdk == IOSSdk.iPhoneSimulator);
124-
return (await iPhoneSimulatorSdk.defaultResolver!.resolve(logger: logger))
125-
.where((i) => i.tool == iPhoneSimulatorSdk)
126-
.first
127-
.uri;
122+
return (await iPhoneSimulatorSdk.defaultResolver!.resolve(
123+
logger: logger,
124+
userConfig: userConfig,
125+
)).where((i) => i.tool == iPhoneSimulatorSdk).first.uri;
128126
}
129127

130-
Future<Uri> macosSdk({required Logger? logger}) async =>
131-
(await macosxSdk.defaultResolver!.resolve(logger: logger)).where((i) => i.tool == macosxSdk).first.uri;
128+
Future<Uri> macosSdk({required Logger? logger}) async => (await macosxSdk.defaultResolver!.resolve(
129+
logger: logger,
130+
userConfig: userConfig,
131+
)).where((i) => i.tool == macosxSdk).first.uri;
132132

133133
Uri androidSysroot(ToolInstance compiler) => compiler.uri.resolve('../sysroot/');
134134

@@ -312,18 +312,10 @@ class RunCMakeBuilder {
312312
Architecture.x64: 'x86_64',
313313
};
314314

315-
static const macosPlatforms = {
316-
Architecture.arm64: 'MAC_ARM64',
317-
Architecture.x64: 'MAC',
318-
};
315+
static const macosPlatforms = {Architecture.arm64: 'MAC_ARM64', Architecture.x64: 'MAC'};
319316

320317
static const iosPlatforms = {
321-
Architecture.arm64: {
322-
IOSSdk.iPhoneOS: 'OS64',
323-
IOSSdk.iPhoneSimulator: 'SIMULATORARM64',
324-
},
325-
Architecture.x64: {
326-
IOSSdk.iPhoneSimulator: 'SIMULATOR64',
327-
},
318+
Architecture.arm64: {IOSSdk.iPhoneOS: 'OS64', IOSSdk.iPhoneSimulator: 'SIMULATORARM64'},
319+
Architecture.x64: {IOSSdk.iPhoneSimulator: 'SIMULATOR64'},
328320
};
329321
}

lib/src/builder/user_config.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) 2025, jasaw and rainyl. All rights reserved. Use of this source code is governed by a
2+
// Apache-2.0 license that can be found in the LICENSE file.
3+
4+
class UserConfig {
5+
final String? androidHome;
6+
final String? cmakeVersion;
7+
final bool preferAndroidCmake;
8+
final String? ninjaVersion;
9+
final bool preferAndroidNinja;
10+
final String? ndkVersion;
11+
12+
const UserConfig({
13+
this.androidHome,
14+
this.cmakeVersion,
15+
this.preferAndroidCmake = false,
16+
this.preferAndroidNinja = false,
17+
this.ninjaVersion,
18+
this.ndkVersion,
19+
});
20+
21+
UserConfig copyWith({
22+
String? androidHome,
23+
String? cmakeVersion,
24+
bool preferAndroidCmake = false,
25+
bool preferAndroidNinja = false,
26+
String? ninjaVersion,
27+
String? ndkVersion,
28+
}) => UserConfig(
29+
androidHome: androidHome ?? this.androidHome,
30+
cmakeVersion: cmakeVersion ?? this.cmakeVersion,
31+
preferAndroidCmake: preferAndroidCmake,
32+
preferAndroidNinja: preferAndroidNinja,
33+
ninjaVersion: ninjaVersion ?? this.ninjaVersion,
34+
ndkVersion: ndkVersion ?? this.ndkVersion,
35+
);
36+
}

0 commit comments

Comments
 (0)