Skip to content

Commit 1b763e3

Browse files
committed
Consider ANDROID_HOME environment variable
1 parent bb1e08a commit 1b763e3

20 files changed

+239
-147
lines changed

pkgs/native_toolchain_c/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.17.3-wip
2+
3+
- Search for NDK in `ANDROID_HOME` and `ANDROID_NDK` environment variables.
4+
15
## 0.17.2
26

37
- Made `CBuilder.run` `Logger` argument optional. It now defaults to a logger

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import '../native_toolchain/recognizer.dart';
1616
import '../tool/tool.dart';
1717
import '../tool/tool_error.dart';
1818
import '../tool/tool_instance.dart';
19+
import '../tool/tool_resolver.dart';
1920
import '../utils/env_from_bat.dart';
2021

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

2931
CompilerResolver({
3032
required this.codeConfig,
3133
required this.logger,
3234
OS? hostOS, // Only visible for testing.
3335
Architecture? hostArchitecture, // Only visible for testing.
3436
}) : hostOS = hostOS ?? OS.current,
35-
hostArchitecture = hostArchitecture ?? Architecture.current;
37+
hostArchitecture = hostArchitecture ?? Architecture.current,
38+
context = ToolResolvingContext(logger: logger);
3639

3740
Future<ToolInstance> resolveCompiler() async {
3841
// First, check if the launcher provided a direct path to the compiler.
@@ -96,17 +99,15 @@ class CompilerResolver {
9699
'Using compiler ${inputCcUri.toFilePath()} '
97100
'from BuildInput.cCompiler.cc.',
98101
);
99-
return (await CompilerRecognizer(
100-
inputCcUri,
101-
).resolve(logger: logger)).first;
102+
return (await CompilerRecognizer(inputCcUri).resolve(context)).first;
102103
}
103104
logger?.finer('No compiler set in BuildInput.cCompiler.cc.');
104105
return null;
105106
}
106107

107108
Future<ToolInstance?> _tryLoadToolFromNativeToolchain(Tool tool) async {
108109
final resolved = (await tool.defaultResolver!.resolve(
109-
logger: logger,
110+
context,
110111
)).where((i) => i.tool == tool).toList()..sort();
111112
return resolved.isEmpty ? null : resolved.first;
112113
}
@@ -183,9 +184,7 @@ class CompilerResolver {
183184
'Using archiver ${inputArUri.toFilePath()} '
184185
'from BuildInput.cCompiler.ar.',
185186
);
186-
return (await ArchiverRecognizer(
187-
inputArUri,
188-
).resolve(logger: logger)).first;
187+
return (await ArchiverRecognizer(inputArUri).resolve(context)).first;
189188
}
190189
logger?.finer('No archiver set in BuildInput.cCompiler.ar.');
191190
return null;
@@ -221,7 +220,7 @@ class CompilerResolver {
221220
}
222221
final vcvarsScript = (await vcvars(
223222
compiler,
224-
).defaultResolver!.resolve(logger: logger)).first;
223+
).defaultResolver!.resolve(context)).first;
225224
return await environmentFromBatchFile(
226225
vcvarsScript.uri,
227226
arguments: [

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import '../native_toolchain/msvc.dart';
1212
import '../native_toolchain/tool_likeness.dart';
1313
import '../native_toolchain/xcode.dart';
1414
import '../tool/tool_instance.dart';
15+
import '../tool/tool_resolver.dart';
1516
import '../utils/run_process.dart';
1617
import 'compiler_resolver.dart';
1718
import 'language.dart';
@@ -96,21 +97,21 @@ class RunCBuilder {
9697

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

99-
Future<Uri> iosSdk(IOSSdk iosSdk, {required Logger? logger}) async {
100+
Future<Uri> iosSdk(IOSSdk iosSdk, ToolResolvingContext context) async {
100101
if (iosSdk == IOSSdk.iPhoneOS) {
101102
return (await iPhoneOSSdk.defaultResolver!.resolve(
102-
logger: logger,
103+
context,
103104
)).where((i) => i.tool == iPhoneOSSdk).first.uri;
104105
}
105106
assert(iosSdk == IOSSdk.iPhoneSimulator);
106107
return (await iPhoneSimulatorSdk.defaultResolver!.resolve(
107-
logger: logger,
108+
context,
108109
)).where((i) => i.tool == iPhoneSimulatorSdk).first.uri;
109110
}
110111

111-
Future<Uri> macosSdk({required Logger? logger}) async =>
112+
Future<Uri> macosSdk(ToolResolvingContext context) async =>
112113
(await macosxSdk.defaultResolver!.resolve(
113-
logger: logger,
114+
context,
114115
)).where((i) => i.tool == macosxSdk).first.uri;
115116

116117
Uri androidSysroot(ToolInstance compiler) =>
@@ -224,6 +225,8 @@ class RunCBuilder {
224225
Uri? outFile,
225226
Map<String, String> environment,
226227
) async {
228+
final context = ToolResolvingContext(logger: logger);
229+
227230
await runProcess(
228231
executable: toolInstance.uri,
229232
environment: environment,
@@ -245,11 +248,11 @@ class RunCBuilder {
245248
'-mmacos-version-min=$targetMacOSVersion',
246249
if (codeConfig.targetOS == OS.iOS) ...[
247250
'-isysroot',
248-
(await iosSdk(targetIosSdk!, logger: logger)).toFilePath(),
251+
(await iosSdk(targetIosSdk!, context)).toFilePath(),
249252
],
250253
if (codeConfig.targetOS == OS.macOS) ...[
251254
'-isysroot',
252-
(await macosSdk(logger: logger)).toFilePath(),
255+
(await macosSdk(context)).toFilePath(),
253256
],
254257
if (installName != null) ...[
255258
'-install_name',

pkgs/native_toolchain_c/lib/src/native_toolchain/android_ndk.dart

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:io';
66

77
import 'package:code_assets/code_assets.dart';
88
import 'package:logging/logging.dart';
9+
import 'package:path/path.dart' as p;
910

1011
import '../tool/tool.dart';
1112
import '../tool/tool_instance.dart';
@@ -36,41 +37,51 @@ final androidNdkLld = Tool(
3637
);
3738

3839
class _AndroidNdkResolver implements ToolResolver {
39-
final installLocationResolver = PathVersionResolver(
40-
wrappedResolver: ToolResolvers([
41-
RelativeToolResolver(
42-
toolName: 'Android NDK',
43-
wrappedResolver: PathToolResolver(
44-
toolName: 'ndk-build',
45-
executableName: Platform.isWindows ? 'ndk-build.cmd' : 'ndk-build',
46-
),
47-
relativePath: Uri(path: ''),
48-
),
49-
InstallLocationResolver(
50-
toolName: 'Android NDK',
51-
paths: [
52-
if (Platform.isLinux) ...[
53-
'\$HOME/.androidsdkroot/ndk/*/', // Firebase Studio
54-
'\$HOME/Android/Sdk/ndk/*/',
55-
'\$HOME/Android/Sdk/ndk-bundle/',
56-
],
57-
if (Platform.isMacOS) ...['\$HOME/Library/Android/sdk/ndk/*/'],
58-
if (Platform.isWindows) ...[
59-
'\$HOME/AppData/Local/Android/Sdk/ndk/*/',
60-
],
61-
],
62-
),
63-
]),
64-
);
40+
ToolResolver installLocationResolver(ToolResolvingContext context) =>
41+
PathVersionResolver(
42+
wrappedResolver: ToolResolvers([
43+
RelativeToolResolver(
44+
toolName: 'Android NDK',
45+
wrappedResolver: PathToolResolver(
46+
toolName: 'ndk-build',
47+
executableName: Platform.isWindows
48+
? 'ndk-build.cmd'
49+
: 'ndk-build',
50+
),
51+
relativePath: Uri(path: ''),
52+
),
53+
InstallLocationResolver(
54+
toolName: 'Android NDK',
55+
paths: [
56+
if (context.environment['ANDROID_HOME'] case final androidHome?)
57+
p.join(androidHome, 'ndk/*/'),
58+
for (final ndkHomeKey in _ndkHomeEnvironmentVariables)
59+
if (context.environment[ndkHomeKey] case final home?) home,
60+
61+
if (Platform.isLinux) ...[
62+
'\$HOME/.androidsdkroot/ndk/*/', // Firebase Studio
63+
'\$HOME/Android/Sdk/ndk/*/',
64+
'\$HOME/Android/Sdk/ndk-bundle/',
65+
],
66+
if (Platform.isMacOS) ...['\$HOME/Library/Android/sdk/ndk/*/'],
67+
if (Platform.isWindows) ...[
68+
'\$HOME/AppData/Local/Android/Sdk/ndk/*/',
69+
],
70+
],
71+
),
72+
]),
73+
);
6574

6675
@override
67-
Future<List<ToolInstance>> resolve({required Logger? logger}) async {
68-
final ndkInstances = await installLocationResolver.resolve(logger: logger);
76+
Future<List<ToolInstance>> resolve(ToolResolvingContext context) async {
77+
final ndkInstances = await installLocationResolver(
78+
context,
79+
).resolve(context);
6980

7081
return [
7182
for (final ndkInstance in ndkInstances) ...[
7283
ndkInstance,
73-
...await tryResolveClang(ndkInstance, logger: logger),
84+
...await tryResolveClang(ndkInstance, logger: context.logger),
7485
],
7586
];
7687
}
@@ -127,4 +138,12 @@ class _AndroidNdkResolver implements ToolResolver {
127138
}
128139
return result;
129140
}
141+
142+
static const _ndkHomeEnvironmentVariables = [
143+
// https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md#environment-variables-2
144+
'ANDROID_NDK',
145+
'ANDROID_NDK_HOME',
146+
'ANDROID_NDK_LATEST_HOME',
147+
'ANDROID_NDK_ROOT',
148+
];
130149
}

pkgs/native_toolchain_c/lib/src/native_toolchain/msvc.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,9 @@ Tool _msvcTool({
258258

259259
class VisualStudioResolver implements ToolResolver {
260260
@override
261-
Future<List<ToolInstance>> resolve({required Logger? logger}) async {
262-
final vswhereInstances = await vswhere.defaultResolver!.resolve(
263-
logger: logger,
264-
);
261+
Future<List<ToolInstance>> resolve(ToolResolvingContext context) async {
262+
final vswhereInstances = await vswhere.defaultResolver!.resolve(context);
263+
final logger = context.logger;
265264

266265
final result = <ToolInstance>[];
267266
for (final vswhereInstance in vswhereInstances.take(1)) {

pkgs/native_toolchain_c/lib/src/native_toolchain/recognizer.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:code_assets/code_assets.dart';
6-
import 'package:logging/logging.dart';
76

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

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

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

113114
@override
114-
Future<List<ToolInstance>> resolve({required Logger? logger}) async {
115+
Future<List<ToolInstance>> resolve(ToolResolvingContext context) async {
116+
final logger = context.logger;
115117
logger?.finer('Trying to recognize $uri.');
116118
final os = OS.current;
117119
final filePath = uri.toFilePath();

pkgs/native_toolchain_c/lib/src/native_toolchain/xcode.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,28 @@ final Tool iPhoneSimulatorSdk = Tool(
4444

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

5050
return [
5151
for (final xcrunInstance in xcrunInstances) ...[
5252
...await tryResolveSdk(
5353
xcrunInstance: xcrunInstance,
5454
sdk: 'macosx',
5555
tool: macosxSdk,
56-
logger: logger,
56+
logger: context.logger,
5757
),
5858
...await tryResolveSdk(
5959
xcrunInstance: xcrunInstance,
6060
sdk: 'iphoneos',
6161
tool: iPhoneOSSdk,
62-
logger: logger,
62+
logger: context.logger,
6363
),
6464
...await tryResolveSdk(
6565
xcrunInstance: xcrunInstance,
6666
sdk: 'iphonesimulator',
6767
tool: iPhoneSimulatorSdk,
68-
logger: logger,
68+
logger: context.logger,
6969
),
7070
],
7171
// xcrun --sdk macosx --show-sdk-path)

0 commit comments

Comments
 (0)