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
40 changes: 35 additions & 5 deletions sqlite3/lib/src/hook/compile/description.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import '../utils.dart';
sealed class SqliteBinary {
static SqliteBinary forBuild(BuildInput input) {
final userDefines = input.userDefines;
final userDefinesBase = _userDefinesBase(input);

PrecompiledFromGithubAssets fromGitHub(LibraryType type) {
final pattern =
Expand All @@ -26,6 +27,20 @@ sealed class SqliteBinary {
return PrecompiledFromGithubAssets(type, urlPattern: pattern);
}

List<String> resolvedPaths(String key) {
final List<String> entries =
(userDefines[key] as List?)?.cast() ?? const [];
if (userDefinesBase == null) return entries;

return [
for (final entry in entries)
if (p.isAbsolute(entry))
entry
else
userDefinesBase.resolve(entry).toFilePath(),
];
}

switch (userDefines['source']) {
case null:
case 'sqlite3':
Expand Down Expand Up @@ -58,13 +73,12 @@ sealed class SqliteBinary {
userDefines,
input.config.code.targetOS,
),
additionalIncludes:
(userDefines['additional_includes'] as List?)?.cast() ?? const [],
additionalIncludes: resolvedPaths('additional_includes'),
additionalFlags:
(userDefines['additional_flags'] as List?)?.cast() ?? const [],
additionalLibraryDirectories:
(userDefines['additional_lib_directories'] as List?)?.cast() ??
const [],
additionalLibraryDirectories: resolvedPaths(
'additional_lib_directories',
),
additionalLibraries:
(userDefines['additional_libraries'] as List?)?.cast() ??
const [],
Expand All @@ -78,6 +92,22 @@ sealed class SqliteBinary {
);
}
}

/// The `pubspec.yaml` the user-defines were read from.
///
/// Relative paths are resolved against this file, matching what
/// [HookInputUserDefines.path] does for `path`. That method only resolves a
/// single string, so list-valued options need the base itself.
static Uri? _userDefinesBase(BuildInput input) {
final userDefines = input.json['user_defines'];

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like there is no better way to do this at the moment, but us crawling through undocumented JSON structures doesn't seem great. I've opened dart-lang/native#3515 to ask for a proper API.

if (userDefines is! Map) return null;

final source = userDefines['workspace_pubspec'];
if (source is! Map) return null;

final basePath = source['base_path'];
return basePath is String ? Uri.file(basePath) : null;
}
}

/// A [SqliteBinary] not built or downloaded by the hook.
Expand Down
40 changes: 40 additions & 0 deletions sqlite3/test/hook/description_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ library;

import 'package:code_assets/code_assets.dart';
import 'package:hooks/hooks.dart';
import 'package:path/path.dart' as p;
import 'package:sqlite3/src/hook/asset_hashes.dart';
import 'package:sqlite3/src/hook/compile/description.dart';
import 'package:test/test.dart';
Expand Down Expand Up @@ -39,6 +40,45 @@ void main() {
);
});

test('resolves relative paths against the pubspec', () async {
await testBuildHook(
userDefines: PackageUserDefines(
workspacePubspec: PackageUserDefinesSource(
defines: {
'source': 'source',
'path': 'native/sqlite3.c',
'additional_includes': ['native/include', '/absolute/include'],
'additional_lib_directories': ['native/lib'],
},
basePath: Uri.file(p.join(d.sandbox, 'pubspec.yaml')),
),
),
mainMethod: (args) {
return build(args, (input, outputs) async {
final config = SqliteBinary.forBuild(input) as CompileSqlite;

expect(config.sourceFile, p.join(d.sandbox, 'native', 'sqlite3.c'));
expect(config.additionalIncludes, [
p.join(d.sandbox, 'native', 'include'),
'/absolute/include',
]);
expect(config.additionalLibraryDirectories, [
p.join(d.sandbox, 'native', 'lib'),
]);
});
},
check: (_, _) {},
extensions: [
CodeAssetExtension(
targetArchitecture: Architecture.arm64,
targetOS: OS.macOS,
linkModePreference: LinkModePreference.dynamic,
macOS: MacOSCodeConfig(targetVersion: 13),
),
],
);
});

test('can use custom download url', () async {
await testBuildHook(
mainMethod: (args) {
Expand Down