Source-aware pkg-config metadata parsing and native dependency inspection in MoonBit
Dependencies
| 能力 | 实际用途 |
|---|---|
| 可解释的参数查询 | --explain 把每个 Cflags/Libs 参数追溯到依赖路径、包、字段、文件与行号 |
| 依赖图检查 | 诊断缺失依赖、版本不满足、循环、冲突和公开/私有依赖问题 |
| 稳定集成接口 | 提供结构化 JSON、明确退出码和不丢参数边界的输出 |
| MoonBit 多目标核心 | 同一组逻辑测试覆盖 wasm、wasm-gc、JavaScript 和 native |
| 证据 | 当前结果 |
|---|---|
| 自动化测试 | 0.3.1源码89个逻辑测试 × 4 个目标,全部通过;0.3.0发行源码为81项 |
| 全新环境 CI | Ubuntu 上执行格式检查、四目标检查、测试和 CLI 断言;Windows 上构建真实 MSVC zlib 并运行 MoonBit FFI |
| 上游兼容语料 | 11 个未经修改、固定版本与许可证的 pkgconf 3.0.7 官方测试文件 |
| 真实项目模板 | zlib、libffi、libuv、libpng、PCRE2、Expat 六项目的固定版本模板、提交及许可证哈希;配置副本按独立预期检查参数和来源 |
| 自动差分对照 | 原38项加120项真实模板查询、4项静态编译字段顺序,共162项固定 pkgconf 3.0.7 对照 |
| 输入边界 | 固定种子的64个有效参数输入及94个截断/异常输入,检查参数边界、JSON、退出码、来源、确定性及超时 |
| 原生闭环 | 使用查询得到的 Cflags/Libs 编译 C 静态库和 C++ 调用程序,并运行核对结果 |
| 真实 MoonBit FFI | 从 zlib 1.3.1 安装生成的 .pc 查询参数,在 Ubuntu 与 Windows MSVC 构建 MoonBit 程序并验证 CRC-32、压缩/解压和错误返回 |
| 真实私有依赖 | libpng 1.6.59 → zlib 1.3.1 跨目录查询、普通/静态参数区分、缺失依赖诊断与 MoonBit PNG 像素往返验证 |
| 大图与边界 | 四种1,000包图、5,000包长链解析/目录检查、缺失依赖图及展开边界;保留耗时和峰值内存记录 |
| 打包消费者 | 从实际发行归档提取源码,独立项目验证参数分类、路径索引、深图及静态编译字段,四目标执行公开接口测试 |
| 发布包实际使用 | 独立消费者使用 MoonCakes 0.2.0 计算真实 zlib 构建参数,演示缺失依赖、版本错误及修复,再构建文件压缩工具并检查双向互操作 |
| 可复用接入模板 | 直接依赖 MoonCakes 0.3.0,在仓库之外以同一规划器和适配代码构建 zlib、Expat 应用,分别验证缺失/版本错误、修复及真实执行 |
| 损坏依赖定位 | 0.3.1包含8项新增核心回归与22个文件加载 CLI 场景,原始文件错误不再变成缺包提示,覆盖私有模式、目录优先级、虚拟包和共享失败依赖 |
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/valid imagekit --cflags-only-I --json
moon run --target native cmd/query examples/valid imagekit --libs-only-l --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")| 分类模式 | 输出内容 |
|---|---|
| --cflags-only-I | -I 头文件搜索参数 |
| --cflags-only-other | 其余编译参数,包括宏、-isystem 及其路径 |
| --libs-only-L | -L 库搜索参数 |
| --libs-only-l | -l 库参数,支持 --static 加入私有库 |
| --libs-only-other | 其余链接参数,包括 framework、线程选项及 GNU 链接器分组 |
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_all(self : PackageSet, include_private? : Bool, unavailable? : Map[String, Array[Diagnostic]]) -> Array[Diagnostic]fn PackageSet::check_requirements(self : PackageSet, requirements : Array[Requirement], source? : String) -> Array[Diagnostic]fn PackageSet::collect_cflags(self : PackageSet, root : String, static_linking? : Bool, unavailable? : Map[String, Array[Diagnostic]]) -> FlagResultfn PackageSet::collect_libs(self : PackageSet, root : String, static_linking? : Bool, unavailable? : Map[String, Array[Diagnostic]]) -> FlagResultfn PackageSet::dependency_path(self : PackageSet, root : String, target : String, include_private? : Bool, unavailable? : Map[String, Array[Diagnostic]]) -> Array[String]fn PackageSet::dependency_paths(self : PackageSet, root : String, include_private? : Bool, unavailable? : Map[String, Array[Diagnostic]]) -> DependencyPathsfn PackageSet::resolve(self : PackageSet, root : String, include_private? : Bool, source? : String, unavailable? : Map[String, Array[Diagnostic]]) -> 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