Source-aware pkg-config metadata parsing and native dependency inspection in MoonBit
Dependencies
| 能力 | 实际用途 |
|---|---|
| 可解释的参数查询 | --explain 把每个 Cflags/Libs 参数追溯到依赖路径、包、字段、文件与行号 |
| 依赖图检查 | 诊断缺失依赖、版本不满足、循环、冲突和公开/私有依赖问题 |
| 稳定集成接口 | 提供结构化 JSON、明确退出码和不丢参数边界的输出 |
| MoonBit 多目标核心 | 同一组逻辑测试覆盖 wasm、wasm-gc、JavaScript 和 native |
| 证据 | 当前结果 |
|---|---|
| 自动化测试 | 59 个逻辑测试 × 4 个目标,全部通过 |
| 全新环境 CI | Ubuntu 上执行格式检查、四目标检查、测试和 CLI 断言 |
| 上游兼容语料 | 11 个未经修改、固定版本与许可证的 pkgconf 3.0.7 官方测试文件 |
| 真实项目模板 | 固定版本、提交和许可证的 zlib 1.3.1 与 libffi 3.4.6 官方 .pc.in 内容 |
| 自动差分对照 | CI 对 22 项参数、顺序、路径策略、虚拟包、变量和退出码行为逐项比较 MoonPkgConfig 与固定的 pkgconf 3.0.7 |
| 原生闭环 | 使用查询得到的 Cflags/Libs 编译 C 静态库和 C++ 调用程序,并运行核对结果 |
moon update
sh scripts/review-demo.sh
moon run --target native cmd/query examples/valid imagekit --cflags --explain
moon run --target native cmd/check examples/invalid
moon test --target all --deny-warn
sh scripts/verify-native-example.sh
sh scripts/compare-pkgconf.sh-I/opt/example/include -DIMAGEKIT=1 -I/opt/example/include/codec -I/opt/example/include/compression
-I/opt/example/include <- imagekit:Cflags [examples/valid/imagekit.pc:13; via imagekit]
-DIMAGEKIT=1 <- imagekit:Cflags [examples/valid/imagekit.pc:13; via imagekit]
-I/opt/example/include/codec <- codec:Cflags [examples/valid/codec.pc:10; via imagekit -> codec]
-I/opt/example/include/compression <- compression:Cflags [examples/valid/compression.pc:10; via imagekit -> compression]moon check --target all
moon test --target all
moon run cmd/demo
moon run --target native cmd/inspect examples/valid/imagekit.pc
moon run --target native cmd/inspect examples/valid/imagekit.pc --json
moon run --target native cmd/inspect examples/invalid/broken.pc
moon run --target native cmd/check examples/valid
moon run --target native cmd/check examples/invalid
moon run --target native cmd/query examples/valid imagekit --cflags --explain
moon run --target native cmd/query examples/valid imagekit --libs
moon run --target native cmd/query examples/valid imagekit --libs --dedupe-paths
moon run --target native cmd/query examples/valid imagekit --libs --static
moon run --target native cmd/query examples/search/first demo --path examples/search/second --cflags
moon run --target native cmd/query examples/valid imagekit --modversion
moon run --target native cmd/query examples/valid imagekit --variable=prefix
moon run --target native cmd/query examples/valid imagekit --cflags --define-variable=prefix=/custom
moon run --target native cmd/query examples/path-policy paths --cflags --sysroot=/sdk
moon run --target native cmd/query examples/path-policy paths --libs --system-library-path=/usr/lib
moon run --target native cmd/query examples/provides bar-new --path testdata/pkgconf-3.0.7 --exists
moon run --target native cmd/query examples/valid imagekit --exists
moon run --target native cmd/query examples/valid imagekit --atleast-version=1.1Name: imagekit [imagekit.pc:4]
Version: 1.2.0 [imagekit.pc:6]
Libs: -L/opt/example/lib -limagekit [imagekit.pc:9]
Cflags: -I/opt/example/include -DIMAGEKIT=1 [imagekit.pc:11]
Requires: codec >= 2.0 [imagekit.pc:7]
Requires.private: compression >= 1.0 [imagekit.pc:8]let doc = @pc.parse(
"prefix=/opt/sdk\nLibs: -L${prefix}/lib -lcodec\n",
source="codec.pc",
)
let libs = doc.field("Libs")pub(all) struct FlagResult {
flags : Array[ResolvedFlag]
diagnostics : Array[Diagnostic]
} derive(Eq, Debug)fn FlagResult::filter_system_search_paths(self : FlagResult, include_paths : Array[String], library_paths : Array[String]) -> FlagResultfn PackageSet::add(self : PackageSet, id : String, document : Document, source? : String) -> Array[Diagnostic]fn PackageSet::check_requirements(self : PackageSet, requirements : Array[Requirement], source? : String) -> Array[Diagnostic]fn PackageSet::dependency_path(self : PackageSet, root : String, target : String, include_private? : Bool) -> Array[String]fn PackageSet::resolve(self : PackageSet, root : String, include_private? : Bool, source? : String) -> Resolutionpub(all) struct Resolution {
order : Array[String]
diagnostics : Array[Diagnostic]
} derive(Eq, Debug)fn compare_versions(left : String, right : String) -> Intfn expand(value : String, variables : Map[String, String], location~ : Location) -> Result[String, Diagnostic]Install
Download zipSource-aware pkg-config metadata parsing and native dependency inspection in MoonBit
Dependencies