豫构包系统

本版供包格式检查。配置是普通 。豫 文件中的静态数据,只调用 parser,不执行配置代码。

完整包描述

日志。包。豫 所在目录就是日志包的根目录:

「名称」者『日志』也。
「所有者」者『豫言』也。
「版本」者『0.1.0』也。
「简介」者『提供日志功能。』也。
「说明」者「典」【
  「汉语」者『包说明.汉语.md』也,
  「文言」者『包说明.文言.md』也,
】也。
「类型」者「典」【
  「种类」者『可执行文件』也,
  「入口」者『入口』也,
  「文件名」者『yy日志』也,
】也。
「依赖」者「列」【
  『标准库』,
  「典」【「所有者」者『他人』也,「包」者『终端』也,】,
】也。
「原生」者「典」【
  「源文件」者「列」【『原生/日志.c』】也,
  「包含目录」者「列」【『原生/包含』】也,
  「系统依赖」者「列」【『sqlite3』】也,
】也。

名称、所有者、版本、简介、说明、类型为必填项;其余按需要声明。未知字段及重复字段报错。名称必须与包文件名一致,不允许改名后保留旧声明。

所有者与版本

发现和依赖

解析目标包的依赖图后,豫构将项目内包描述文件的跳转信息写入 .yybuild/豫构语言服务/<包文件相对路径去掉。豫>.语言服务.json,沿用普通源码的语言服务 JSON 格式。入口字符串(或路径段列表中的每一段)指向包内源文件;依赖字符串及依赖典中的包名、所有者指向解析所得的本地包描述文件,外部包目录中的依赖使用其绝对路径。重新运行豫构会更新这些记录,编辑器使用既有的通用跳转定义功能读取。

从启动时的 pwd 递归收集包文件,再解析候选包元数据形成身份索引。本地目录不决定所有者;两个不同所有者的同名包可共存。元数据损坏的候选包会报错,不再承诺无关包完全不解析。每目录仅允许一个包文件。

外部包集合由 --外部包目录 指定,第一层必须为所有者名目录;包配置的所有者必须与之相同。外部集合若位于项目内,在本地扫描时排除它。扫描跳过符号链接、缓存、Git 及 *_v0 目录。

依赖简写 『标准库』 只选声明包同一所有者的标准库;跨所有者使用含“所有者”“包”的典,不尝试其他所有者。命令行选择目标包时,省略 --所有者 仅在短名唯一时成立。

模块导入仍只写短包名,例如 寻观「日志」之「输出」之书。。可见范围为自身与直接依赖,短名冲突即报错。循环、重复和缺失依赖均报错。

库和程序

类型是带数据枚举,使用典表达。库写作 「类型」者「典」【「种类」者『库』也,】也。,不能携带入口或文件名;可执行文件分支必须同时提供入口与文件名。内部解码为不同构造器,不保存独立布尔开关和无意义的可选字段。顶层旧的库、程序、入口字段均报错。

可执行文件名不是路径,须以 yy 开头或以 .exe 结尾。入口是包内模块名或非空路径段列,不含扩展名;命令行 --输出 可以覆盖产物路径。普通依赖只能指向库,可执行文件包不可被依赖。

默认构建库会编译其普通模块,排除测试文件与子包,不链接程序,不需要总集充当入口,也不接受可执行输出路径。类型检查库遵循同一模块范围。显式文件或模块命令仍可构建测试、示例,不改变包的声明类型。

需要共享实现的程序拆成两个独立包。例如共享实现位于 库/编译器核心/,类型为库;豫言编译器/ 是依赖核心库的可执行文件包,原有自举入口路径不变。配置使用对象、字符串和数组,未新增任何序列头;种类也接受静态符号,但示例统一采用字符串以便映射 JSON。

所有模块路径都从包根解析,同包导入也必须带包名。单段导入固定指向 总集。豫,不存在就报错,不自动合并源码。子包构成边界,不能通过父包模块路径访问其内部。

说明文档

简介用于发现与检查展示;正文存放在包内两个 Markdown 文件中,路径在“说明”中登记,文件名分别以 .汉语.md.文言.md 结尾。包检查验证文件存在、归属本包且不通过符号链接或子包越界。

说明应包含用途、包身份、库接口或程序用法、原生要求及维护提示。正文不参与编译,也不执行 Markdown 内的命令。本版不实现通用包分发归档;以后归档必须纳入已登记说明,不能声称现在已有该打包功能。

原生组成

包内 C 源文件与包含目录显式登记并验证边界,C 源码不交给 Make。系统依赖当前是系统库名列表,按最终依赖闭包传递为独立 -l名称 参数,由链接器搜索;缺失库则链接失败,不自动安装。

此版不支持 pkg-config、系统依赖版本约束、平台条件、自定义 C 参数或系统头文件路径发现。需要非默认头文件搜索路径的绑定尚不能完整声明,不应伪装成已支持。平台运行时仍单独由 Make 准备。额外系统库不允许进入双种子导出,避免导出时遗漏依赖。

命令与升级

./yy豫构 发现
./yy豫构 检查 豫构 --所有者 豫言
./yy豫构 构建 豫构
./yy豫构 类型检查 豫言编译器
./yy豫构 构建 豫构 -j 8 -- --do-not-load-cache
./yy豫构 -h

编译器参数放在 -- 后。监视面板区分待依赖、待槽位与运行中任务。

本版包字段与旧稳定豫构不兼容;升级须安装支持本格式的双种子,不能拿旧资产解析新包文件。当前检查版本不自动上传或替换远端发布,正式推广前必须更新稳定种子资产及其固定摘要。