包内原生源码:第一版
豫构现在支持在包文件中注册 C 源码,直接调用 clang 编译、llvm-ar 归档,并将归档交给编译器链接。正常包构建不调用包的 Makefile,也不在最终链接时调用运行时 Makefile。
注册与归属
「原生」者「典」【
「源文件」者「列」【『包上下文.c』】也,
「包含目录」者「列」【】也,
】也。
字段均可省略,默认空列。仅接受字符串列,源文件必须以 .c 结尾。路径相对包根,不允许绝对路径、空段、点/双点、重复项、符号链接或穿越子包。豫构自动加入当前工具链的 运行时支持库/原生 头目录。
C 文件可与豫言模块相邻,只编译注册文件,不扫描其余 C;头文件不作为编译源注册。当前按目标声明的包依赖闭包构建各包原生组成,尚不按实际模块使用情况裁剪。注册边界不等于 C 预处理沙箱:可信 C 代码仍可书写其他 include。
包上下文存储已移到 库/构建基础/包上下文.c,由 构建基础。包。豫 注册。通用文件系统功能仍留在运行时,后续逐项归位。
构建与缓存
交互终端中的原生工具调用使用构建监视面板,显示当前 C 预处理、编译、归档或辅助工具命令及耗时。每次原生调用单独计时,结束清除面板;随后编译器显示其完整编译任务图。非终端保留 [原生启动]、[原生完成]、[原生失败] 日志。预处理正文不打印;警告和失败诊断在清除面板后显示,不会被刷新擦除。这不是子进程输出的逐字节流。
照常执行 ./yy豫构 构建 包名。clang 与 llvm-ar 从 PATH 定位,记录实径、版本和可执行文件修改时间;当前固定宿主 C、gnu11、O3、NDEBUG。原生典可声明 「系统依赖」者「列」【『sqlite3』】也,,沿依赖闭包传递为系统链接库参数。不自动安装,不支持 pkg-config 或系统头文件发现,也不开放自定义 C 参数。下面的原生片段须与完整包元数据一同使用。
每次对注册源码执行 clang 预处理,所得文本包括实际头文件展开和源位置。工具身份、完整源路径、固定参数、包含目录与预处理内容组成不可变身份。内容不变时复用对象和归档;预处理失败立即停止,不复用旧对象。改变注释等不影响预处理结果的内容不必重编。
目前不使用 depfile 快速跳过预处理,也不计算工具二进制的内容摘要。手工更换工具而保留版本与修改时间时应清理缓存;这不是不可信环境或跨机器的可复现缓存保证。
产物位于工具链 .yybuild/豫构原生,身份编号复用不可变上下文文本索引。对象名含独立编号,避免不同目录同名源在归档中覆盖。归档身份包含当前对象列表和顺序,撤销注册产生新归档,不留旧成员。对象和归档通过进程锁、临时文件及原子替换发布,失败不发布最终产物。重编/归档时分别打印“编译包内 C”“归档包内 C”。
链接及旧自举
内部 --native-link-inputs 接受版本化绝对归档清单,先链接包归档,再链接不含包上下文兼容实现的核心运行时。当前支持宿主静态链接;动态运行时和 WASI 仍拒绝。编译器与豫构的双种子导出按明确的原生组成导出源码,额外原生组成会报错,不会静默忽略。
核心运行时仍是工具链预构建组件:安装或修改核心后先在工具链目录执行 make 运行时;旧稳定编译器首级自举也会准备它。本轮没有迁移整个核心运行时构建,也未消除完整工具链目录要求。
旧自举桥接及包上下文兼容文件均已删除。核心运行时不再包含任何包的实现;包实现只能由注册的原生组成提供。双种子导出按包名取得构建基础的实际源码,复制进独立的可移植包,不依赖源码仓库目录。
C调用 的豫言值 ABI 不变;任意 C 签名、公开头接口、动态原生库和任意构建钩子尚不支持。
验证
make 豫构测试 已加入原生配置和真实 C 构建测试:同名源、未注册文件、重复构建、头文件与源码修改、撤销注册、缺头、子包边界、符号链接。后续完整方案见原生构建设计。