
llamafile 贡献者指南从补丁式子模块工作流到源码构建与测试【免费下载链接】llamafileDistribute and run LLMs with a single file.项目地址: https://gitcode.com/GitHub_Trending/ll/llamafile导读本文是 llamafile 项目的官方贡献指南源自仓库根目录的 CONTRIBUTING.md面向希望为 llamafile 提交代码、修复缺陷、改进文档或参与构建工作的开发者。读完本文你将掌握llamafile 独特的补丁式子模块开发流程llama.cpp、whisper.cpp、stable-diffusion.cpp的改动必须以.patch形式落地、完整的开发环境搭建与构建验证命令、以及从提交规范到 Pull Request 检查清单的完整协作闭环。llamafile 的目标是用单个可执行文件分发和运行 LLM这一目标直接决定了其源码管理的特殊形态——理解这套补丁工作流是安全为该项目做贡献的前提。为什么 llamafile 采用“补丁式子模块”架构llamafile 不是一个单一代码库它由多个子模块拼合而成。从仓库根目录的 Makefile 可以看到构建系统同时纳入了llama.cpp、whisper.cpp、transcribe.cpp、stable-diffusion.cpp、llamafile/、whisperfile/、transcribefile/、diffusionfile/等多个组件包。其中llama.cpp/、whisper.cpp/、stable-diffusion.cpp/是指向上游特定提交的 Git 子模块。由于这些子模块指向固定的上游 commit如果直接在子模块内提交改动改动会随下次git submodule update而丢失。因此 llamafile 采用如下策略子模块内的任何改动不直接提交而是保存为补丁文件放入对应的*.patches/目录构建时由apply-patches.sh把补丁重新施加到干净的子模块上如果你的改动应该回馈上游请先向上游仓库如 llama.cpp提 PR否则遵循下文“子模块改动工作流”。以llama.cpp.patches/为例其目录结构为详见 llama.cpp.patches/README.mdllama.cpp.patches/ ├── README.md # 补丁索引与用途说明 ├── apply-patches.sh # 将全部补丁施加到 llama.cpp 子模块 ├── fetch-ui-assets.sh # 下载并校验预构建 Web UI 资源 ├── renames.sh # 文件重命名/移动脚本如有 ├── llamafile-files/ # 需复制进 llama.cpp 的新增文件 │ ├── BUILD.mk # 用 cosmocc 构建 llama.cpp 的 Makefile │ ├── README.llamafile # 许可证与修改说明 │ └── common/ │ └── license.cpp # llama.cpp 的许可证文件cmake 构建时生成 └── patches/ # 针对上游源码的补丁文件这些补丁覆盖了 Windows/macOS ABI 兼容GGML_CALL宏、跨模块内存管理free_struct回调、Cosmopolitan libc 兼容、HTTPS/TLS 支持Mbed TLS 后端、TinyBLAS 集成、CPU 性能优化、llamafile 文件加载zip 归档与.llamafile容器等关键主题。补丁文件命名遵循“路径中的斜杠替换为下划线”的约定例如common/arg.cpp的补丁名为common_arg.cpp.patch。开始之前查重与先讨论正式动手前请先完成两件事查重在项目的 issues 中搜索是否存在重复问题检查 open 的 pull requests 看是否已有人在做同样的事如果是缺陷报告先在main分支上验证该问题是否仍然存在。重大改动先开 issue涉及以下类型的改动应先行讨论以避免重复劳动、保持方向一致新的用户可见功能架构性改动改变公共行为或默认值新增依赖重大的构建或打包改动。开发环境搭建前置条件与 Quick Start前置条件开发 llamafile 需要以下工具GNUmake部分系统上叫gmakesha256sum或可用的ccwget或curlunzipGitWindows 贡献者可使用 MSYS2。Quick Start# 1. 在 GitHub 上 Fork 本仓库 # 2. 克隆你的 fork git clone https://github.com/YOUR_USERNAME/llamafile.git cd llamafile # 3. 添加上游远程仓库 git remote add upstream https://github.com/mozilla-ai/llamafile.git # 4. 初始化子模块、应用补丁、下载工具链 make setup # 5. 用 cosmocc 的 make 构建 .cosmocc/4.0.2/bin/make -j8 # 6. 运行默认测试套件 .cosmocc/4.0.2/bin/make check关键点说明make setup会依次完成初始化子模块 → 应用 llamafile 专属补丁 → 下载cosmocc工具链到.cosmocc/。从 Makefile 的实现可以看到setup目标按whisper.cpp、stable-diffusion.cpp、llama.cpp含嵌套子模块、transcribe.cpp、third_party/zipalign的顺序逐个初始化子模块并运行各自的apply-patches.sh最后调用cosmocc目标。构建和测试请始终使用.cosmocc/4.0.2/bin/make而不是系统自带的make。这是因为 llamafile 使用 Cosmopolitan libc 工具链构建可生成跨平台单文件可执行文件系统 make 缺少相应的构建规则环境。cosmocc工具链的完整下载校验可参考 docs/commands/verify-clean.md 中的做法build/download-cosmocc.sh .cosmocc/4.0.2 4.0.2 sha256。两条改动工作流核心代码 vs 子模块代码仓库存在两种截然不同的改动路径务必先判断你的改动落在哪一侧。工作流一核心代码改动直接提交以下目录属于 llamafile 自身的核心代码可以正常编辑、构建、测试、提交llamafile/—— 主程序、TUI/Server/CLI 实现chatbot_*.cpp、args.cpp、compute.cpp等whisperfile/—— 语音转写命令行与服务器whisperfile.cpp、whisper-server.cppdocs/—— 文档tests/—— 测试这类改动遵循常规 Git 流程编辑 → 构建 → 测试 → 提交。相关实现细节如 HTTP 服务器、语法高亮、TinyBLAS 内核可参考 docs/skills/llamafile/development.md 中对llamafile/目录结构的梳理。工作流二子模块改动必须生成为补丁子模块包括llama.cpp/whisper.cpp/stable-diffusion.cpp/如果你在子模块目录内改动了代码还必须把改动保存为补丁文件放入对应的*.patches/目录。在子模块内工作时除本仓库工作流外还需遵循该子模块自身的编码与贡献规范。完整的子模块改动流程以llama.cpp为例# 1. 进入子模块直接就地编辑开发阶段先在子模块内验证 cd llama.cpp # ... 做出你的修改 ... # 2. 生成补丁echo y 回答确认提示子 shell 保证即使失败也恢复工作目录 ( cd llama.cpp echo y | ../tools/generate_patches.sh --output-dir ../llama.cpp.patches )关于generate_patches.sh工具源码见 tools/generate_patches.sh有几点必须明确这是唯一被认可的补丁生产方式严禁用git diff手工拼补丁。docs/commands/generate-patches.md 明确指出该工具会把 diff 路径中的a/、b/重写为以仓库根为基准的路径、剔除易变的index行、按约定命名文件并把新增/未跟踪文件路由到llamafile-files/——裸git diff无法做到这些。输出结构为输出目录/patches/存放被修改文件的.patch文件、输出目录/llamafile-files/存放新增文件含BUILD.mk。该工具只写不删如果某次上游同步导致某个补丁不再需要改动被上游吸收旧.patch仍会留在patches/并被make setup继续应用需要手工git rm并核对最终数量ls llama.cpp.patches/patches | wc -l。务必在就地改动已被验证可用之后再生成补丁干净构建成功、llamafile 运行符合预期否则会把未验证的破坏性改动固化进补丁集。# 3. 从干净状态验证补丁 make reset-repo make setup .cosmocc/4.0.2/bin/make -j8 .cosmocc/4.0.2/bin/make checkmake reset-repo会把所有子模块重置到原始状态删除子模块目录后从 Git 恢复会丢失所有本地改动随后make setup重新初始化子模块并应用补丁从而验证补丁集能否在干净环境往返。更详细的子模块改动走查见 docs/skills/llamafile/development.md。补丁的应用过程apply-patches.sh做了什么从 llama.cpp.patches/apply-patches.sh 的实现看补丁应用顺序为检查子模块 Git 状态是否干净有未提交改动则直接退出避免与补丁冲突将llamafile-files/中的全部文件复制进子模块根目录运行renames.sh执行文件重命名/移动删除不需要的上游文件如Makefile按文件名字母顺序逐一对patches/*.patch执行patch -p1运行fetch-ui-assets.sh下载预构建 Web UI 资源。脚本还支持--tolerant宽松模式在上游 bump升级期间逐条应用能匹配的 hunk、把漂移的 hunk 写成*.rej文件后继续而非中止用于手工调和严格模式make setup默认则在第一个无法干净应用的补丁处立即失败。向子模块新增文件新增文件而非修改走llamafile-files/通道# 创建与子模块路径对应的目录结构 mkdir -p llama.cpp.patches/llamafile-files/src/ # 放入新文件 cp new-utility.cpp llama.cpp.patches/llamafile-files/src/该文件会在make setup时被复制进子模块。同时如果新增的是编译单元还需要在llamafile-files/BUILD.mk的源文件列表中登记例如# llama.cpp.patches/llamafile-files/BUILD.mk LLAMA_SRCS \ llama.cpp/src/llama.cpp \ llama.cpp/src/new-file.cpp # 新增文件在此登记编写测试行为改动必须配套只要改动影响行为就应新增或更新测试新功能必须包含测试缺陷修复在可行时包含回归测试纯文档改动通常无需测试避免在一个 PR 中混入无关改动。除单元测试外仓库还提供基于真实模型的集成测试见 tests/integration/README.md。集成测试覆盖 CLI、TUI、Server、组合模式TUIServer、多模态、工具调用、GPU、沙箱、HTTPS/SSL 等类别可用 pytest 标记-m选择运行# 用预构建的 .llamafile 运行全部集成测试 cd tests/integration ./run_tests.sh --executable ~/path/to/model.llamafile # 用直接构建的二进制 指定模型运行 ./run_tests.sh --executable ./o/llamafile/llamafile --model /path/to/model.gguf # 只跑 CLI 类测试 ./run_tests.sh --executable ~/model.llamafile -m cli # 组合选择与排除 ./run_tests.sh --executable ~/model.llamafile -m server or tui ./run_tests.sh --executable ~/model.llamafile -m not multimodal and not tool_calling常用选项包括--gpu MODEauto/apple/amd/nvidia/disable、--timeout-multiplier N大模型超时倍数、-v详细输出、-x首个失败即停止。查看模型实际输出可用--log-cli-levelINFO或--log-cli-levelDEBUG。注意ssl online类测试需要联网会从 Hugging Face 下载小模型离线环境可用-m not online跳过。文档同步与提交规范更新文档如果你的改动影响开发者或用户的使用方式请同步更新README.md或docs/下的相关文档。特别地在docs/中新增页面时必须同时登记到 docs/SUMMARY.md——该文件手工维护、控制 GitBook 导航。CI 只能捕获 SUMMARY 中指向不存在文件的失效条目却不会发现“新文件从未加入 SUMMARY”的情况。提交信息使用清晰、描述性的提交信息例如git commit -m Fix server startup when model path is missing git commit -m Update contributor guide for patch workflow提交 PR 前的检查清单在提交 Pull Request 之前请确认项目能够干净构建默认测试套件通过子模块改动已转换为补丁文件且补丁能在一个全新克隆上干净应用相关文档已更新改动聚焦、易于评审你准备好解释并长期维护你所改动的代码。推荐用分支而非直接在main上工作常见分支前缀docs/文档、fix/缺陷修复、feature/新功能、build/构建与工具链。干净往返验证verify-clean如果涉及补丁改动提交前的最终验证建议做一次全量干净往返步骤参见 docs/commands/verify-clean.md# 确保工具链可用 if [ ! -d .cosmocc/4.0.2 ]; then build/download-cosmocc.sh .cosmocc/4.0.2 4.0.2 85b8c37a406d862e656ad4ec14be9f6ce474c1b436b9615e91a55208aced3f44 fi MAKE.cosmocc/4.0.2/bin/make $MAKE reset-repo # 丢弃本地改动、重置子模块 $MAKE setup # 拉取子模块 应用补丁 拉取 UI 资源 $MAKE clean # 丢弃过期构建产物 $MAKE -j$(nproc) # 干净构建mac 上可用 -j$(sysctl -n hw.physicalcpu) $MAKE check # 单元测试为什么必须干净构建reset-repo/setup之后子模块源码内容变化但时间戳未必变化增量make可能链接到过期对象文件所以此处务必先make clean再全量构建。注意reset-repo是破坏性操作先rm -rf子模块目录再从 Git 恢复权限受限环境可能被拦截应通过.cosmocc/.../make调用而非裸git clean/reset。一次成功的往返证明补丁集内部自洽但它不覆盖 GPU 运行时后端、非宿主平台、Web UI 与长期稳定性——这些在 docs/skills/llamafile/update_llamacpp.md 中有更完整的交接清单。配套参考文档以下文档与贡献流程直接相关可继续深入README.md —— 项目总览docs/source_installation.md —— 源码安装docs/running_llamafile.md —— 运行方式docs/creating_llamafiles.md —— 制作.llamafiletests/integration/README.md —— 集成测试docs/skills/llamafile/development.md —— 子模块开发走查docs/skills/llamafile/update_llamacpp.md —— 上游同步bump规程docs/commands/generate-patches.md 与 docs/commands/verify-clean.md —— 补丁生成与验证命令【免费下载链接】llamafileDistribute and run LLMs with a single file.项目地址: https://gitcode.com/GitHub_Trending/ll/llamafile创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考