Skip to content

[native_assets_cli] Nest c_compiler config #30

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
May 1, 2023
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
26 changes: 14 additions & 12 deletions pkgs/c_compiler/lib/src/cbuilder/compiler_resolver.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ class CompilerResolver {
Future<ToolInstance> resolveCompiler() async {
// First, check if the launcher provided a direct path to the compiler.
var result = await _tryLoadCompilerFromConfig(
BuildConfig.ccConfigKey,
(buildConfig) => buildConfig.cc,
CCompilerConfig.ccConfigKeyFull,
(buildConfig) => buildConfig.cCompiler.cc,
);

// Then, try to detect on the host machine.
Expand Down Expand Up @@ -91,11 +91,12 @@ class CompilerResolver {
if (configCcUri != null) {
assert(await File.fromUri(configCcUri).exists());
logger?.finer('Using compiler ${configCcUri.toFilePath()} '
'from config[${BuildConfig.ccConfigKey}].');
'from config[${CCompilerConfig.ccConfigKeyFull}].');
return (await CompilerRecognizer(configCcUri).resolve(logger: logger))
.first;
}
logger?.finer('No compiler set in config[${BuildConfig.ccConfigKey}].');
logger?.finer(
'No compiler set in config[${CCompilerConfig.ccConfigKeyFull}].');
return null;
}

Expand All @@ -110,8 +111,8 @@ class CompilerResolver {
Future<ToolInstance> resolveArchiver() async {
// First, check if the launcher provided a direct path to the compiler.
var result = await _tryLoadArchiverFromConfig(
BuildConfig.arConfigKey,
(buildConfig) => buildConfig.ar,
CCompilerConfig.arConfigKeyFull,
(buildConfig) => buildConfig.cCompiler.ar,
);

// Then, try to detect on the host machine.
Expand Down Expand Up @@ -167,18 +168,19 @@ class CompilerResolver {
if (configArUri != null) {
assert(await File.fromUri(configArUri).exists());
logger?.finer('Using archiver ${configArUri.toFilePath()} '
'from config[${BuildConfig.arConfigKey}].');
'from config[${CCompilerConfig.arConfigKeyFull}].');
return (await ArchiverRecognizer(configArUri).resolve(logger: logger))
.first;
}
logger?.finer('No archiver set in config[${BuildConfig.arConfigKey}].');
logger?.finer(
'No archiver set in config[${CCompilerConfig.arConfigKeyFull}].');
return null;
}

Future<Uri?> toolchainEnvironmentScript(ToolInstance compiler) async {
final fromConfig = buildConfig.toolchainEnvScript;
final fromConfig = buildConfig.cCompiler.envScript;
if (fromConfig != null) {
logger?.fine('Using toolchainEnvScript from config: $fromConfig');
logger?.fine('Using envScript from config: $fromConfig');
return fromConfig;
}

Expand All @@ -190,9 +192,9 @@ class CompilerResolver {
}

List<String>? toolchainEnvironmentScriptArguments() {
final fromConfig = buildConfig.toolchainEnvScriptArgs;
final fromConfig = buildConfig.cCompiler.envScriptArgs;
if (fromConfig != null) {
logger?.fine('Using toolchainEnvScriptArgs from config: $fromConfig');
logger?.fine('Using envScriptArgs from config: $fromConfig');
return fromConfig;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ void main() {

for (final linkMode in LinkMode.values) {
for (final target in targets) {
test('Cbuilder $linkMode library $target', timeout: Timeout.factor(2),
() async {
test('Cbuilder $linkMode library $target', () async {
await inTempDir((tempUri) async {
final addCUri =
packageUri.resolve('test/cbuilder/testfiles/add/src/add.c');
Expand Down
20 changes: 12 additions & 8 deletions pkgs/c_compiler/test/cbuilder/cbuilder_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,13 @@ void main() {
outDir: tempUri,
packageRoot: tempUri,
target: Target.current,
linkModePreference:
LinkModePreference.dynamic, // Ignored by executables.
cc: cc,
toolchainEnvScript: toolchainEnvScript,
toolchainEnvScriptArgs: toolchainEnvScriptArgs,
// Ignored by executables.
linkModePreference: LinkModePreference.dynamic,
cCompiler: CCompilerConfig(
cc: cc,
envScript: envScript,
envScriptArgs: envScriptArgs,
),
);
final buildOutput = BuildOutput();
final cbuilder = CBuilder.executable(
Expand Down Expand Up @@ -72,9 +74,11 @@ void main() {
packageRoot: tempUri,
target: Target.current,
linkModePreference: LinkModePreference.dynamic,
cc: cc,
toolchainEnvScript: toolchainEnvScript,
toolchainEnvScriptArgs: toolchainEnvScriptArgs,
cCompiler: CCompilerConfig(
cc: cc,
envScript: envScript,
envScriptArgs: envScriptArgs,
),
);
final buildOutput = BuildOutput();

Expand Down
16 changes: 9 additions & 7 deletions pkgs/c_compiler/test/cbuilder/compiler_resolver_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,25 +34,27 @@ void main() {
...await lib.defaultResolver!.resolve(logger: logger),
...await lld.defaultResolver!.resolve(logger: logger),
].first.uri;
final toolchainEnvScript = [
final envScript = [
...await vcvars64.defaultResolver!.resolve(logger: logger)
].firstOrNull?.uri;
final buildConfig = BuildConfig(
outDir: tempUri,
packageRoot: tempUri,
target: Target.current,
linkModePreference: LinkModePreference.dynamic,
ar: ar,
cc: cc,
ld: ld,
toolchainEnvScript: toolchainEnvScript,
cCompiler: CCompilerConfig(
ar: ar,
cc: cc,
ld: ld,
envScript: envScript,
),
);
final resolver =
CompilerResolver(buildConfig: buildConfig, logger: logger);
final compiler = await resolver.resolveCompiler();
final archiver = await resolver.resolveArchiver();
expect(compiler.uri, buildConfig.cc);
expect(archiver.uri, buildConfig.ar);
expect(compiler.uri, buildConfig.cCompiler.cc);
expect(archiver.uri, buildConfig.cCompiler.ar);
});
});

Expand Down
27 changes: 19 additions & 8 deletions pkgs/c_compiler/test/helpers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:async';
import 'dart:io';

import 'package:logging/logging.dart';
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:test/test.dart';

const keepTempKey = 'KEEP_TEMPORARY_DIRECTORIES';
Expand Down Expand Up @@ -87,24 +88,34 @@ extension on Uri {
String get name => pathSegments.where((e) => e != '').last;
}

String unparseKey(String key) => key.replaceAll('.', '__').toUpperCase();

/// Archiver provided by the environment.
final Uri? ar = Platform.environment['AR']?.asFileUri();
final Uri? ar = Platform
.environment[unparseKey(CCompilerConfig.arConfigKeyFull)]
?.asFileUri();

/// Compiler provided by the environment.
final Uri? cc = Platform.environment['CC']?.asFileUri();
final Uri? cc = Platform
.environment[unparseKey(CCompilerConfig.ccConfigKeyFull)]
?.asFileUri();

/// Linker provided by the environment.
final Uri? ld = Platform.environment['LD']?.asFileUri();
final Uri? ld = Platform
.environment[unparseKey(CCompilerConfig.ldConfigKeyFull)]
?.asFileUri();

/// Path to script that sets environment variables for [cc], [ld], and [ar].
///
/// Provided by environment.
final Uri? toolchainEnvScript =
Platform.environment['ToolchainEnvScript']?.asFileUri();
final Uri? envScript = Platform
.environment[unparseKey(CCompilerConfig.envScriptConfigKeyFull)]
?.asFileUri();

/// Arguments for [toolchainEnvScript] provided by environment.
final List<String>? toolchainEnvScriptArgs =
Platform.environment['ToolchainEnvScriptArguments']?.split(' ');
/// Arguments for [envScript] provided by environment.
final List<String>? envScriptArgs = Platform
.environment[unparseKey(CCompilerConfig.envScriptArgsConfigKeyFull)]
?.split(' ');

extension on String {
Uri asFileUri() => Uri.file(this);
Expand Down
Loading