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
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# native_toolchain_cmake

## 0.2.3

- new: support skipping generate if cached
- feat: check for prelrease VS version if no stable version is found
- fix: pass environment variables from vcvars.bat to resolvers to allow finding cmake not in PATH

## 0.2.2

- find all available visual studio versions
Expand Down
2 changes: 1 addition & 1 deletion lib/src/builder/builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ class CMakeBuilder implements Builder {
final tools = await vcvars.defaultResolver!.resolve(logger: logger);
if (tools.isNotEmpty) {
final _vars = await environmentFromBatchFile(tools.first.uri);
logger?.info('Environment variables from $vcvars: $vars');
logger?.info('Environment variables from $vcvars: $_vars');
vars.addAll(_vars);
return vars;
}
Expand Down
30 changes: 21 additions & 9 deletions lib/src/builder/run_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,23 @@ class RunCMakeBuilder {
}) : outDir = outputDir ?? input.outputDirectory,
userConfig = userConfig ?? UserConfig(targetOS: codeConfig.targetOS);

Future<Uri> cmakePath() async {
final cmakeTools = await cmake.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
Future<Uri> cmakePath({Map<String, String>? environment}) async {
final cmakeTools = await cmake.defaultResolver?.resolve(
logger: logger,
userConfig: userConfig,
environment: environment,
);
final path = cmakeTools?.first.uri;
assert(path != null);
return Future.value(path);
}

Future<Uri> ninjaPath() async {
final ninjaTools = await ninja.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
Future<Uri> ninjaPath({Map<String, String>? environment}) async {
final ninjaTools = await ninja.defaultResolver?.resolve(
logger: logger,
userConfig: userConfig,
environment: environment,
);
final path = ninjaTools?.first.uri;
assert(path != null);
return Future.value(path);
Expand All @@ -101,8 +109,12 @@ class RunCMakeBuilder {

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

Future<Uri> androidToolchainCmake() async {
final tool = await androidNdk.defaultResolver?.resolve(logger: logger, userConfig: userConfig);
Future<Uri> androidToolchainCmake({Map<String, String>? environment}) async {
final tool = await androidNdk.defaultResolver?.resolve(
logger: logger,
userConfig: userConfig,
environment: environment,
);
final toolUri = tool?.first.uri.resolve('build/cmake/android.toolchain.cmake');
assert(toolUri != null);
return Future.value(toolUri);
Expand Down Expand Up @@ -185,14 +197,14 @@ class RunCMakeBuilder {
defines.forEach((k, v) => _defines.add('-D$k=${v ?? "1"}'));

if (generator == Generator.ninja) {
final ninjaBinUri = await ninjaPath();
final ninjaBinUri = await ninjaPath(environment: environment);
final ninjaBinDir = File.fromUri(ninjaBinUri).parent.path;
_defines.add('-DCMAKE_PROGRAM_PATH=$ninjaBinDir');
}
final _generator = generator.toArgs();

final results = await runProcess(
executable: await cmakePath(),
executable: await cmakePath(environment: environment),
arguments: [
'--log-level=${logLevel.name}',
'-S',
Expand Down Expand Up @@ -225,7 +237,7 @@ class RunCMakeBuilder {

Future<RunProcessResult> _build({Map<String, String>? environment}) async {
return runProcess(
executable: await cmakePath(),
executable: await cmakePath(environment: environment),
arguments: [
'--build',
outDir.normalizePath().toFilePath(),
Expand Down
11 changes: 9 additions & 2 deletions lib/src/native_toolchain/android_ndk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@ final androidNdkLld = Tool(name: lld.name, defaultResolver: _AndroidNdkResolver(

class _AndroidNdkResolver implements ToolResolver {
@override
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
Future<List<ToolInstance>> resolve({
required Logger? logger,
UserConfig? userConfig,
Map<String, String>? environment,
}) async {
final installLocationResolver = PathVersionResolver(
wrappedResolver: ToolResolvers([
RelativeToolResolver(
Expand All @@ -57,7 +61,10 @@ class _AndroidNdkResolver implements ToolResolver {
]),
);

final ndkInstances = await installLocationResolver.resolve(logger: logger);
final ndkInstances = await installLocationResolver.resolve(
logger: logger,
environment: environment,
);
// sort latest version first
ndkInstances.sort(
(a, b) => switch ((a.version, b.version)) {
Expand Down
10 changes: 7 additions & 3 deletions lib/src/native_toolchain/cmake.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,18 @@ class _CmakeResolver implements ToolResolver {
}

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

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

final combinedCmakeInstances = <ToolInstance>[];
Expand Down
14 changes: 12 additions & 2 deletions lib/src/native_toolchain/msvc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,16 @@ Tool _msvcTool({

class VisualStudioResolver implements ToolResolver {
@override
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
final vswhereInstances = await vswhere.defaultResolver!.resolve(logger: logger, userConfig: userConfig);
Future<List<ToolInstance>> resolve({
required Logger? logger,
UserConfig? userConfig,
Map<String, String>? environment,
}) async {
final vswhereInstances = await vswhere.defaultResolver!.resolve(
logger: logger,
userConfig: userConfig,
environment: environment,
);

final result = <ToolInstance>[];
for (final vswhereInstance in vswhereInstances.take(1)) {
Expand All @@ -260,6 +268,7 @@ class VisualStudioResolver implements ToolResolver {
executable: vswhereInstance.uri,
arguments: arguments,
logger: logger,
environment: environment,
);
var toolInfos = json.decode(vswhereResult.stdout) as List;
// Try again including prerelease versions if no stable versions found.
Expand All @@ -268,6 +277,7 @@ class VisualStudioResolver implements ToolResolver {
executable: vswhereInstance.uri,
arguments: [...arguments, '-prerelease'],
logger: logger,
environment: environment,
);
toolInfos = json.decode(vswhereResult.stdout) as List;
}
Expand Down
10 changes: 7 additions & 3 deletions lib/src/native_toolchain/ninja.dart
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,17 @@ class _NinjaResolver implements ToolResolver {
}

@override
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
Future<List<ToolInstance>> resolve({
required Logger? logger,
UserConfig? userConfig,
Map<String, String>? environment,
}) async {
final androidResolver = _getAndroidResolver(userConfig: userConfig);
final androidNinjaInstances = await androidResolver.resolve(logger: logger);
final androidNinjaInstances = await androidResolver.resolve(logger: logger, environment: environment);
logger?.info('Found Android Ninja: ${androidNinjaInstances.map((e) => e.toString()).join(', ')}');

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

final combinedNinjaInstances = <ToolInstance>[];
Expand Down
18 changes: 15 additions & 3 deletions lib/src/native_toolchain/recognizer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@ class CompilerRecognizer implements ToolResolver {
CompilerRecognizer(this.uri);

@override
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
Future<List<ToolInstance>> resolve({
required Logger? logger,
UserConfig? userConfig,
Map<String, String>? environment,
}) async {
final os = OS.current;
logger?.finer('Trying to recognize $uri.');
final filePath = uri.toFilePath();
Expand Down Expand Up @@ -61,7 +65,11 @@ class LinkerRecognizer implements ToolResolver {
LinkerRecognizer(this.uri);

@override
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
Future<List<ToolInstance>> resolve({
required Logger? logger,
UserConfig? userConfig,
Map<String, String>? environment,
}) async {
final os = OS.current;
logger?.finer('Trying to recognize $uri.');
final filePath = uri.toFilePath();
Expand Down Expand Up @@ -106,7 +114,11 @@ class ArchiverRecognizer implements ToolResolver {
ArchiverRecognizer(this.uri);

@override
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
Future<List<ToolInstance>> resolve({
required Logger? logger,
UserConfig? userConfig,
Map<String, String>? environment,
}) async {
logger?.finer('Trying to recognize $uri.');
final os = OS.current;
final filePath = uri.toFilePath();
Expand Down
20 changes: 17 additions & 3 deletions lib/src/native_toolchain/xcode.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,35 @@ final Tool iPhoneSimulatorSdk = Tool(name: 'iPhoneSimulator SDK', defaultResolve

class XCodeSdkResolver implements ToolResolver {
@override
Future<List<ToolInstance>> resolve({required Logger? logger, UserConfig? userConfig}) async {
final xcrunInstances = await xcrun.defaultResolver!.resolve(logger: logger);
Future<List<ToolInstance>> resolve({
required Logger? logger,
UserConfig? userConfig,
Map<String, String>? environment,
}) async {
final xcrunInstances = await xcrun.defaultResolver!.resolve(logger: logger, environment: environment);

return [
for (final xcrunInstance in xcrunInstances) ...[
...await tryResolveSdk(xcrunInstance: xcrunInstance, sdk: 'macosx', tool: macosxSdk, logger: logger),
...await tryResolveSdk(
xcrunInstance: xcrunInstance,
sdk: 'macosx',
tool: macosxSdk,
logger: logger,
environment: environment,
),
...await tryResolveSdk(
xcrunInstance: xcrunInstance,
sdk: 'iphoneos',
tool: iPhoneOSSdk,
logger: logger,
environment: environment,
),
...await tryResolveSdk(
xcrunInstance: xcrunInstance,
sdk: 'iphonesimulator',
tool: iPhoneSimulatorSdk,
logger: logger,
environment: environment,
),
],
// xcrun --sdk macosx --show-sdk-path)
Expand All @@ -61,11 +73,13 @@ class XCodeSdkResolver implements ToolResolver {
required String sdk,
required Tool tool,
required Logger? logger,
Map<String, String>? environment,
}) async {
final result = await runProcess(
executable: xcrunInstance.uri,
arguments: ['--sdk', sdk, '--show-sdk-path'],
logger: logger,
environment: environment,
);
if (result.exitCode == 1) {
assert(result.stderr.contains('cannot be located'));
Expand Down
Loading