Skip to content
Open
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
5 changes: 5 additions & 0 deletions pkgs/hooks_runner/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## 1.0.1-wip

- Add `ANDROID_NDK`, `ANDROID_NDK_HOME`, `ANDROID_NDK_LATEST_HOME` and
`ANDROID_NDK_ROOT` to the environment variables allowlist.

## 1.0.0

- Stable release.
Expand Down
12 changes: 12 additions & 0 deletions pkgs/hooks_runner/lib/src/build_runner/build_runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -543,8 +543,20 @@ class NativeAssetsBuildRunner {
///
/// This allows environment variables needed to run mainstream compilers.
static bool includeHookEnvironmentVariable(String environmentVariableName) {
// Typically, we'd find the NDK through ANDROID_HOME alone. In some cases
// where users have an NDK in nonstandard locations, these environment
// variables are used as well, e.g. in
// https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md#environment-variables-2
const nonStandardNdkEnvironmentVariables = {
'ANDROID_NDK',
'ANDROID_NDK_HOME',
'ANDROID_NDK_LATEST_HOME',
'ANDROID_NDK_ROOT',
};

const staticVariablesFilter = {
'ANDROID_HOME', // Needed for the NDK.
...nonStandardNdkEnvironmentVariables,
'HOME', // Needed to find tools in default install locations.
'LIBCLANG_PATH', // Needed for Rust's bindgen + clang-sys.
'PATH', // Needed to invoke native tools.
Expand Down
2 changes: 1 addition & 1 deletion pkgs/hooks_runner/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: hooks_runner
description: >-
This package is the backend that invokes build hooks.

version: 1.0.0
version: 1.0.1-wip

repository: https://github.com/dart-lang/native/tree/main/pkgs/hooks_runner

Expand Down
4 changes: 4 additions & 0 deletions pkgs/native_toolchain_c/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.17.4-wip

- Search for NDK in `ANDROID_HOME` and `ANDROID_NDK` environment variables.

## 0.17.3

- Bump `package:hooks` and `package:code_assets`to 1.0.0.
Expand Down
17 changes: 8 additions & 9 deletions pkgs/native_toolchain_c/lib/src/cbuilder/compiler_resolver.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import '../native_toolchain/recognizer.dart';
import '../tool/tool.dart';
import '../tool/tool_error.dart';
import '../tool/tool_instance.dart';
import '../tool/tool_resolver.dart';
import '../utils/env_from_bat.dart';

// TODO(dacoharkes): This should support alternatives.
Expand All @@ -25,14 +26,16 @@ class CompilerResolver {
final Logger? logger;
final OS hostOS;
final Architecture hostArchitecture;
final ToolResolvingContext context;

CompilerResolver({
required this.codeConfig,
required this.logger,
OS? hostOS, // Only visible for testing.
Architecture? hostArchitecture, // Only visible for testing.
}) : hostOS = hostOS ?? OS.current,
hostArchitecture = hostArchitecture ?? Architecture.current;
hostArchitecture = hostArchitecture ?? Architecture.current,
context = ToolResolvingContext(logger: logger);

Future<ToolInstance> resolveCompiler() async {
// First, check if the launcher provided a direct path to the compiler.
Expand Down Expand Up @@ -96,17 +99,15 @@ class CompilerResolver {
'Using compiler ${inputCcUri.toFilePath()} '
'from BuildInput.cCompiler.cc.',
);
return (await CompilerRecognizer(
inputCcUri,
).resolve(logger: logger)).first;
return (await CompilerRecognizer(inputCcUri).resolve(context)).first;
}
logger?.finer('No compiler set in BuildInput.cCompiler.cc.');
return null;
}

Future<ToolInstance?> _tryLoadToolFromNativeToolchain(Tool tool) async {
final resolved = (await tool.defaultResolver!.resolve(
logger: logger,
context,
)).where((i) => i.tool == tool).toList()..sort();
return resolved.isEmpty ? null : resolved.first;
}
Expand Down Expand Up @@ -183,9 +184,7 @@ class CompilerResolver {
'Using archiver ${inputArUri.toFilePath()} '
'from BuildInput.cCompiler.ar.',
);
return (await ArchiverRecognizer(
inputArUri,
).resolve(logger: logger)).first;
return (await ArchiverRecognizer(inputArUri).resolve(context)).first;
}
logger?.finer('No archiver set in BuildInput.cCompiler.ar.');
return null;
Expand Down Expand Up @@ -221,7 +220,7 @@ class CompilerResolver {
}
final vcvarsScript = (await vcvars(
compiler,
).defaultResolver!.resolve(logger: logger)).first;
).defaultResolver!.resolve(context)).first;
return await environmentFromBatchFile(
vcvarsScript.uri,
arguments: [
Expand Down
17 changes: 10 additions & 7 deletions pkgs/native_toolchain_c/lib/src/cbuilder/run_cbuilder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import '../native_toolchain/msvc.dart';
import '../native_toolchain/tool_likeness.dart';
import '../native_toolchain/xcode.dart';
import '../tool/tool_instance.dart';
import '../tool/tool_resolver.dart';
import '../utils/run_process.dart';
import 'compiler_resolver.dart';
import 'language.dart';
Expand Down Expand Up @@ -96,21 +97,21 @@ class RunCBuilder {

Future<Uri> archiver() async => (await _resolver.resolveArchiver()).uri;

Future<Uri> iosSdk(IOSSdk iosSdk, {required Logger? logger}) async {
Future<Uri> iosSdk(IOSSdk iosSdk, ToolResolvingContext context) async {
if (iosSdk == IOSSdk.iPhoneOS) {
return (await iPhoneOSSdk.defaultResolver!.resolve(
logger: logger,
context,
)).where((i) => i.tool == iPhoneOSSdk).first.uri;
}
assert(iosSdk == IOSSdk.iPhoneSimulator);
return (await iPhoneSimulatorSdk.defaultResolver!.resolve(
logger: logger,
context,
)).where((i) => i.tool == iPhoneSimulatorSdk).first.uri;
}

Future<Uri> macosSdk({required Logger? logger}) async =>
Future<Uri> macosSdk(ToolResolvingContext context) async =>
(await macosxSdk.defaultResolver!.resolve(
logger: logger,
context,
)).where((i) => i.tool == macosxSdk).first.uri;

Uri androidSysroot(ToolInstance compiler) =>
Expand Down Expand Up @@ -224,6 +225,8 @@ class RunCBuilder {
Uri? outFile,
Map<String, String> environment,
) async {
final context = ToolResolvingContext(logger: logger);

await runProcess(
executable: toolInstance.uri,
environment: environment,
Expand All @@ -245,11 +248,11 @@ class RunCBuilder {
'-mmacos-version-min=$targetMacOSVersion',
if (codeConfig.targetOS == OS.iOS) ...[
'-isysroot',
(await iosSdk(targetIosSdk!, logger: logger)).toFilePath(),
(await iosSdk(targetIosSdk!, context)).toFilePath(),
],
if (codeConfig.targetOS == OS.macOS) ...[
'-isysroot',
(await macosSdk(logger: logger)).toFilePath(),
(await macosSdk(context)).toFilePath(),
],
if (installName != null) ...[
'-install_name',
Expand Down
32 changes: 25 additions & 7 deletions pkgs/native_toolchain_c/lib/src/native_toolchain/android_ndk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import 'dart:io';

import 'package:code_assets/code_assets.dart';
import 'package:glob/glob.dart';
import 'package:logging/logging.dart';

import '../tool/tool.dart';
Expand All @@ -13,7 +14,7 @@ import '../tool/tool_resolver.dart';
import 'clang.dart';

final androidNdk = Tool(
name: 'Android NDK',
name: _AndroidNdkResolver._toolName,
defaultResolver: _AndroidNdkResolver(),
);

Expand All @@ -36,18 +37,18 @@ final androidNdkLld = Tool(
);

class _AndroidNdkResolver implements ToolResolver {
final installLocationResolver = PathVersionResolver(
static final installLocationResolver = PathVersionResolver(
wrappedResolver: ToolResolvers([
RelativeToolResolver(
toolName: 'Android NDK',
toolName: _toolName,
wrappedResolver: PathToolResolver(
toolName: 'ndk-build',
executableName: Platform.isWindows ? 'ndk-build.cmd' : 'ndk-build',
),
relativePath: Uri(path: ''),
),
InstallLocationResolver(
toolName: 'Android NDK',
toolName: _toolName,
paths: [
if (Platform.isLinux) ...[
'\$HOME/.androidsdkroot/ndk/*/', // Firebase Studio
Expand All @@ -60,17 +61,24 @@ class _AndroidNdkResolver implements ToolResolver {
],
],
),
EnvironmentVariableResolver(
toolName: _toolName,
keys: {
'ANDROID_HOME': Glob('ndk/*/'),
for (final ndkHome in _ndkHomeEnvironmentVariables) ndkHome: null,
},
),
]),
);

@override
Future<List<ToolInstance>> resolve({required Logger? logger}) async {
final ndkInstances = await installLocationResolver.resolve(logger: logger);
Future<List<ToolInstance>> resolve(ToolResolvingContext context) async {
final ndkInstances = await installLocationResolver.resolve(context);

return [
for (final ndkInstance in ndkInstances) ...[
ndkInstance,
...await tryResolveClang(ndkInstance, logger: logger),
...await tryResolveClang(ndkInstance, logger: context.logger),
],
];
}
Expand Down Expand Up @@ -127,4 +135,14 @@ class _AndroidNdkResolver implements ToolResolver {
}
return result;
}

static const _ndkHomeEnvironmentVariables = [
// https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md#environment-variables-2
'ANDROID_NDK',
'ANDROID_NDK_HOME',
'ANDROID_NDK_LATEST_HOME',
'ANDROID_NDK_ROOT',
];

static const _toolName = 'Android NDK';
}
7 changes: 3 additions & 4 deletions pkgs/native_toolchain_c/lib/src/native_toolchain/msvc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -258,10 +258,9 @@ Tool _msvcTool({

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

final result = <ToolInstance>[];
for (final vswhereInstance in vswhereInstances.take(1)) {
Expand Down
10 changes: 6 additions & 4 deletions pkgs/native_toolchain_c/lib/src/native_toolchain/recognizer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.

import 'package:code_assets/code_assets.dart';
import 'package:logging/logging.dart';

import '../tool/tool.dart';
import '../tool/tool_instance.dart';
Expand All @@ -19,7 +18,8 @@ class CompilerRecognizer implements ToolResolver {
CompilerRecognizer(this.uri);

@override
Future<List<ToolInstance>> resolve({required Logger? logger}) async {
Future<List<ToolInstance>> resolve(ToolResolvingContext context) async {
final logger = context.logger;
final os = OS.current;
logger?.finer('Trying to recognize $uri.');
final filePath = uri.toFilePath();
Expand Down Expand Up @@ -64,7 +64,8 @@ class LinkerRecognizer implements ToolResolver {
LinkerRecognizer(this.uri);

@override
Future<List<ToolInstance>> resolve({required Logger? logger}) async {
Future<List<ToolInstance>> resolve(ToolResolvingContext context) async {
final logger = context.logger;
final os = OS.current;
logger?.finer('Trying to recognize $uri.');
final filePath = uri.toFilePath();
Expand Down Expand Up @@ -111,7 +112,8 @@ class ArchiverRecognizer implements ToolResolver {
ArchiverRecognizer(this.uri);

@override
Future<List<ToolInstance>> resolve({required Logger? logger}) async {
Future<List<ToolInstance>> resolve(ToolResolvingContext context) async {
final logger = context.logger;
logger?.finer('Trying to recognize $uri.');
final os = OS.current;
final filePath = uri.toFilePath();
Expand Down
10 changes: 5 additions & 5 deletions pkgs/native_toolchain_c/lib/src/native_toolchain/xcode.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,28 +44,28 @@ final Tool iPhoneSimulatorSdk = Tool(

class XCodeSdkResolver implements ToolResolver {
@override
Future<List<ToolInstance>> resolve({required Logger? logger}) async {
final xcrunInstances = await xcrun.defaultResolver!.resolve(logger: logger);
Future<List<ToolInstance>> resolve(ToolResolvingContext context) async {
final xcrunInstances = await xcrun.defaultResolver!.resolve(context);

return [
for (final xcrunInstance in xcrunInstances) ...[
...await tryResolveSdk(
xcrunInstance: xcrunInstance,
sdk: 'macosx',
tool: macosxSdk,
logger: logger,
logger: context.logger,
),
...await tryResolveSdk(
xcrunInstance: xcrunInstance,
sdk: 'iphoneos',
tool: iPhoneOSSdk,
logger: logger,
logger: context.logger,
),
...await tryResolveSdk(
xcrunInstance: xcrunInstance,
sdk: 'iphonesimulator',
tool: iPhoneSimulatorSdk,
logger: logger,
logger: context.logger,
),
],
// xcrun --sdk macosx --show-sdk-path)
Expand Down
Loading
Loading