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
1 change: 1 addition & 0 deletions sqlite3/doc/hook.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ hooks:

The build can be configured further with these additional options:

- `additional_sources`: Additional C sources to compile, each as its own translation unit.
- `additional_includes`: Additional include directories to add to the header search path.
- `additional_flags`: Additional compiler options.
- `additional_lib_directories` and `additional_libraries`: Additional libraries to link.
Expand Down
3 changes: 2 additions & 1 deletion sqlite3/hook/build.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ void main(List<String> args) async {
case CompileSqlite(
:final sourceFile,
:final defines,
:final additionalSources,
:final additionalIncludes,
:final additionalFlags,
:final additionalLibraryDirectories,
Expand Down Expand Up @@ -70,7 +71,7 @@ ${usedSqliteSymbols.map((symbol) => ' $symbol;').join('\n')}
name: 'sqlite3',
packageName: 'sqlite3',
assetName: name,
sources: [sourceFile],
sources: [sourceFile, ...additionalSources],
includes: [p.dirname(sourceFile), ...additionalIncludes],
defines: defines,
flags: [
Expand Down
45 changes: 40 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,13 @@ sealed class SqliteBinary {
userDefines,
input.config.code.targetOS,
),
additionalIncludes:
(userDefines['additional_includes'] as List?)?.cast() ?? const [],
additionalSources: resolvedPaths('additional_sources'),
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 +93,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'];
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 Expand Up @@ -319,6 +350,9 @@ final class CompileSqlite implements SqliteBinary {
/// User-defines for the SQLite compilation.
final CompilerDefines defines;

/// Additional sources to compile, each as its own translation unit.
final List<String> additionalSources;

/// Additional header search paths.
final List<String> additionalIncludes;

Expand All @@ -333,6 +367,7 @@ final class CompileSqlite implements SqliteBinary {
CompileSqlite({
required this.sourceFile,
required this.defines,
required this.additionalSources,
required this.additionalIncludes,
required this.additionalFlags,
required this.additionalLibraryDirectories,
Expand Down
44 changes: 44 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,49 @@ void main() {
);
});

test('resolves relative paths against the pubspec', () async {
await testBuildHook(
userDefines: PackageUserDefines(
workspacePubspec: PackageUserDefinesSource(
defines: {
'source': 'source',
'path': 'native/sqlite3.c',
'additional_sources': ['native/extension.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.additionalSources, [
p.join(d.sandbox, 'native', 'extension.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