Neovim 从源码构建完全指南:构建类型、捆绑依赖管理与多平台交叉编译(BUILD.md 深度解读)
【免费下载链接】neovimVim-fork focused on extensibility and usability项目地址: https://gitcode.com/GitHub_Trending/ne/neovim
本文基于 Neovim 仓库根目录的 BUILD.md 展开,完整覆盖从安装构建前置依赖、选择构建类型、配置 CMake 选项,到 Windows 多环境构建、本地化构建、离线/静态/捆绑依赖管理,再到 Zig 构建系统与交叉编译(含 WebAssembly 目标)的全流程。读完后,你可以在任意主流 Linux 发行版、macOS、Windows、FreeBSD/OpenBSD/Haiku 上从源码构建出可用的nvim可执行文件,并能读懂仓库构建系统的 CMake 底层实现,为二次开发和问题排查打下基础。
重要提示:升级到新版本前,务必先查阅版本变更说明中关于破坏性改动的部分,可参考 runtime/doc/news.txt。
快速开始(Quick Start)
最简路径只需五步(适用于 Unix 类系统):
- 在你的系统上安装构建前置依赖。
- 克隆仓库:
git clone https://gitcode.com/GitHub_Trending/ne/neovim cd neovim- 如果希望构建稳定版(stable release),同时执行
git checkout stable。
- 如果希望构建稳定版(stable release),同时执行
make CMAKE_BUILD_TYPE=RelWithDebInfo- 如需安装到自定义位置,设置
CMAKE_INSTALL_PREFIX,参见 INSTALL.md。 - 在 BSD 系统上,请将
make换成gmake。 - 在 Windows 上构建,见下文Windows 构建一节,推荐 MSVC(Visual Studio)。
- 如需安装到自定义位置,设置
sudo make install- 默认安装位置为
/usr/local。 - 在 Debian/Ubuntu 上,可以改用
cd build && cpack -G DEB && sudo dpkg -i nvim-linux-<arch>.deb(<arch>为x86_64或arm64)来构建并安装 DEB 包,便于后续干净地卸载文件。注意:这是 Nvim 构建中不受支持的"尽力而为"特性。
- 默认安装位置为
关键说明:
- 从仓库根目录运行
make会自动下载并构建所有需要的依赖,最终把nvim可执行文件放到build/bin。 - 第三方依赖(libuv、LuaJIT 等)会被自动下载到
.deps/目录。 - 构建完成后无需安装即可直接运行:
VIMRUNTIME=runtime ./build/bin/nvim。 - 如果你计划开发 Neovim,建议安装 Ninja 以获得更快的构建速度,安装后构建系统会自动启用它。
- 安装 ccache 可加速 Neovim 的重编译,它会默认被使用;如需禁用,执行
CCACHE_DISABLE=true make。
从源码结构看,"make 自动选 Ninja" 这一行为来自根目录 Makefile:当command -v ninja成功时,CMAKE_GENERATOR默认被设为Ninja,否则回退到Unix Makefiles;这也是文档中"装了 Ninja 就不要再加-j参数"的原因。
运行测试
构建后运行测试套件,参见 test/README.md。
构建类型(Build Type)
确认已安装前置依赖后,可以通过其他构建目标继续构建。_build type_决定编译器优化等级与调试信息量:
Release:完整编译优化、无调试信息。可期望获得最佳性能,发行版打包者常用。Debug:完整调试信息、较少优化。开发调试(GDB/LLDB 输出有意义)时使用。若不指定CMAKE_BUILD_TYPE,默认就是 Debug——这一点可从 CMakeLists.txt 中的set_default_buildtype(Debug)得到印证。RelWithDebInfo(Release With Debug Info):启用大量优化,并加入足够调试信息,使 Neovim 崩溃时仍能拿到 backtrace。
因此发布构建只需:
make CMAKE_BUILD_TYPE=Release(若安装了ninja,不要加-j参数,构建会自动并行。)
编译完成后,nvim可执行文件位于build/bin。验证构建类型:
./build/bin/nvim --version | grep ^Build一个源码级细节:RelWithDebInfo 构建有意保留断言。CMakeLists.txt 会把RelWithDebInfo标志中的-DNDEBUG替换为-DRELDEBUG,注释明确写着 "Wewantassertions in RelWithDebInfo build-type",因此该构建类型既保留优化性能,又可在崩溃时通过断言信息定位问题。
安装位置与缓存失效
把可执行文件安装到指定位置:
make CMAKE_INSTALL_PREFIX=$HOME/local/nvim installCMake 会把大量信息缓存到build/CMakeCache.txt。如果你想更改CMAKE_BUILD_TYPE或CMAKE_INSTALL_PREFIX,请先执行rm -rf build。在 Git 提交新增或删除文件(包括runtime中的文件)后重新构建时,同样需要先清掉缓存——拿不准时执行make distclean(它基本上是rm -rf build .deps的快捷方式)。
从源码看有两点佐证:
- Makefile 中的
distclean目标会删除.deps、build、.zig-cache、zig-out并调用clean。 - Makefile 定义了
checkprefix目标:当传入的CMAKE_INSTALL_PREFIX与 CMake 缓存值不一致时,自动删除build/.ran-cmake标记并强制重跑 CMake 配置,避免安装到错误目录。
PUC Lua 构建
默认使用 LuaJIT 作为 Lua 引擎。若要改用 "PUC Lua":
make CMAKE_EXTRA_FLAGS="-DPREFER_LUA=ON" DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_LUAJIT=OFF -DUSE_BUNDLED_LUA=ON"引擎选择逻辑体现在 cmake.deps/CMakeLists.txt:USE_BUNDLED_LUAJIT优先,其次USE_BUNDLED_LUA,否则调用find_package在系统中寻找 LuaJIT 或 Lua 5.1,都找不到则直接FATAL_ERROR。
查看构建选项(Build Options)
列出本项目定义的全部 CMake 选项:
cmake -B build -LH其中与依赖管理最相关的一组选项定义在 cmake.deps/CMakeLists.txt,默认全部跟随USE_BUNDLED(默认ON):
| CMake 选项 | 控制对象 | 默认值 |
|---|---|---|
USE_BUNDLED | 总开关:使用捆绑依赖 | ON |
USE_BUNDLED_LIBUV | libuv | 跟随USE_BUNDLED |
USE_BUNDLED_LUA | PUC Lua(默认仅用于测试,需显式开启) | OFF |
USE_BUNDLED_LUAJIT | LuaJIT | 跟随USE_BUNDLED |
USE_BUNDLED_LUV | luv | 跟随USE_BUNDLED |
USE_BUNDLED_TS | tree-sitter 运行时 | 跟随USE_BUNDLED |
USE_BUNDLED_TS_PARSERS | tree-sitter 解析器 | 跟随USE_BUNDLED |
USE_BUNDLED_UNIBILIUM | unibilium | 跟随USE_BUNDLED |
USE_BUNDLED_UTF8PROC | utf8proc | 跟随USE_BUNDLED |
USE_BUNDLED_GETTEXT/USE_BUNDLED_LIBICONV | gettext / libiconv | 仅 MSVC 平台默认ON,其余OFF |
ENABLE_WASMTIME | wasmtime(tree-sitter WASM 支持) | OFF |
USE_EXISTING_SRC_DIR | 跳过依赖源码下载,使用已有源码目录(离线构建用) | OFF |
每个被启用的选项会 include 对应的构建模块,例如USE_BUNDLED_LUAJIT→ BuildLuajit.cmake、USE_BUNDLED_TS→ BuildTreesitter.cmake。顶层 CMakeLists.txt 还定义了ENABLE_LTO(非 MinGW 平台默认ON)、ENABLE_LIBINTL(ON)、ENABLE_UNIBILIUM(ON)、ENABLE_WASMTIME(OFF)等主程序侧开关,以及ENABLE_ASAN_UBSAN/ENABLE_MSAN/ENABLE_TSAN三类互斥的 sanitizer 选项。
Windows 构建
Windows / MSVC
MSVC(Visual Studio)是 Windows 上推荐的构建方式。
- 安装 Visual Studio(2017 或更新版本),勾选Desktop development with C++工作负载。
- 32 位 Windows 上需要处理 Ninja 二进制格式不兼容的问题(Visual Studio 反馈社区有对应工单)。
- 用 Visual Studio 打开 Neovim 项目文件夹。
- Visual Studio 应能检测到 CMake 文件并自动开始构建。
- 选择
nvim.exe (bin\nvim.exe)目标并按 F5 运行。- 若构建失败,可能是在你切换到
x86-Release之前,Visual Studio 已用x64-{Debug,Release}发起了构建。处理方式:右键 CMakeLists.txt →Delete Cache,再右键 →Generate Cache。 - 若看到来自
ntdll的 "access violation",可忽略并继续。
- 若构建失败,可能是在你切换到
- 若出现
uv.dll not found之类的错误,先尝试nvim.exe (Install)目标,然后切回nvim.exe (bin\nvim.exe)。
源码层面有个便利设计:CMakeLists.txt 检测到CLION_IDE或VisualStudioEdition环境变量时,会自动代你构建捆绑依赖(execute_process调用cmake.deps),这正是"Visual Studio 打开即自动构建"的底层原因。
Windows / MSVC PowerShell
如果希望从命令行直接调用cmake:
- 确保 Visual Studio 环境变量已加载,任选其一:
- 使用Visual Studio Developer Command Prompt或Developer PowerShell;
- 在 PowerShell 中通过 Pscx 模块调用
Import-VisualStudioVars; - 在命令提示符中执行:
VsDevCmd.bat -arch=x64
这一步是为了让
luarocks能找到 Visual Studio 安装,避免回退到 MinGW 并报'mingw32-gcc' is not recognized as an internal or external command之类的错误。 - 在 "Developer PowerShell" 或 "Developer Command Prompt" 中:
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=Release cmake --build .deps --config Release cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=Release cmake --build build --config Release- 想要调试构建,省略
--config Release。 - 想用 "Visual Studio" 生成器,省略
-G Ninja。
- 想要调试构建,省略
Windows / CLion
- 安装 CLion。
- 用 CLion 打开 Neovim 项目。
- 选择Build → Build All in 'Release'。
Windows / Cygwin
自上游 PR #36417 之后,Cygwin 构建可能简单到:
make && make install若失败,替代方案:
- 按常规方式安装所有依赖。
- Cygport 仓库包含所有 Cygwin 发行版中不可用依赖的 Cygport 文件(如
APKBUILD、PKGBUILD),并描述了构建所需的特殊命令或参数;除非提供了自定义命令,Cygport 只会在干净一致的方式下调用autogen/cmake、make、make install等。 - 社区项目 neovim-cygwin 基于 Cygwin 2.9.0 构建;更新的
libuv可能需要更少的打补丁。Cygwin 2.10.0 中部分 SSP 行为变化,也可能影响 Neovim 的构建。
- Cygport 仓库包含所有 Cygwin 发行版中不可用依赖的 Cygport 文件(如
- 不使用捆绑依赖构建(treesitter 解析器除外):
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_BUNDLED=OFF -DUSE_BUNDLED_TS=ON cmake --build .deps cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build build
Windows / MSYS2 / MinGW
- 在 MSYS2 shell 中安装这些包:
pacman -S \ mingw-w64-ucrt-x86_64-gcc \ mingw-w64-x86_64-{cmake,make,ninja,diffutils} - 在 Windows 命令提示符(
cmd.exe)中设置PATH并构建:set PATH=c:\msys64\ucrt64\bin;c:\msys64\usr\bin;%PATH% - 两个选项任选:
- 使用
cmake+Ninja生成器:cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build .deps cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build build若因权限限制无法用
ninja install安装,可以改装到你有写权限的目录:cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build .deps cmake -B build -G Ninja -D CMAKE_INSTALL_PREFIX=C:\nvim -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build build - 或者使用
mingw32-make:mingw32-make deps mingw32-make CMAKE_BUILD_TYPE=RelWithDebInfo :: 也可指定自定义前缀 :: (默认为 C:\Program Files (x86)\nvim) :: mingw32-make CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_INSTALL_PREFIX=C:\nvim mingw32-make install
- 使用
Windows WSL
在 Windows Subsystem for Linux(WSL)中构建 Ubuntu/Debian 的 Linux 二进制:
# 安装构建前置依赖 sudo apt-get install ninja-build gettext cmake build-essential # 在 WSL 中构建 linux 二进制 make CMAKE_BUILD_TYPE=RelWithDebInfo # 在 WSL 中安装 linux 二进制(<arch> 为 x86_64 或 arm64) cd build && cpack -G DEB && sudo dpkg -i nvim-linux-<arch>.deb # 验证安装 nvim --version && which nvim # 应为 /usr/bin/nvim 的 debug 构建注意:如果构建期间遇到链接错误或 segfault,可能是 PATH 中的 Windows 库在捣乱。使用干净的 PATH 避免冲突:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" make CMAKE_BUILD_TYPE=RelWithDebInfo本地化(Localization)
构建本地化
翻译默认关闭。通过 CMake 标志ENABLE_TRANSLATIONS=ON开启构建:
make CMAKE_EXTRA_FLAGS="-DENABLE_TRANSLATIONS=ON"这会在build/src/nvim/po生成.mo文件。
- 若看到
msgfmt: command not found,需要安装gettext。多数系统上包名就叫gettext。
翻译源文件位于 src/nvim/po 目录(.po文件)。
检查本地化
检查$LANG的翻译:运行make -C build check-po-$LANG。例如:
cmake --build build --target check-po-de cmake --build build --target check-po-pt_BRcheck-po-$LANG会在./build/src/nvim/po/check-${LANG}.log生成详细报告(该报告由nvim生成,而非msgfmt)。
更新本地化
用最新字符串更新src/nvim/po/$LANG.po:
cmake --build build --target update-po-$LANG- 注意:更新后请运行
src/nvim/po/cleanup.vim。
编译器选项
查看头文件包含链,使用-H选项(源自 issue #918):
echo '#include "./src/nvim/buffer.h"' | \ > clang -I.deps/usr/include -Isrc -std=c99 -P -E -H - 2>&1 >/dev/null | \ > grep -v /usr/grep -v /usr/用于过滤系统头文件。- 也可以加
-save-temps来查看展开后的宏或注释形式的汇编。
自定义 Makefile(local.mk)
你可以通过在仓库根目录创建local.mk来本地化定制构建流程——它被主 Makefile 顶部的-include local.mk引用,且列入.gitignore,因此可跨分支使用。local.mk中的新目标会覆盖默认 make 目标。
一个示例local.mk:添加了一个强制重建的目标,但不覆盖默认目标:
all: rebuild: rm -rf build make更完整的可定制项可参考 contrib/local.mk.example,其中注释说明了各类常用覆盖:
CMAKE_EXTRA_FLAGS += -DCMAKE_INSTALL_PREFIX=/usr/local/nvim-latest修改安装前缀;CMAKE_BUILD_TYPE := Debug设置构建类型(默认 Debug);- 非 Debug 构建默认开启 IPO(含 LTO),链接耗时较长,可
CMAKE_EXTRA_FLAGS += -DENABLE_LTO=OFF关闭——对应 CMakeLists.txt 中的ENABLE_LTO选项; DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAJIT=OFF等逐项切换到系统依赖,或-DUSE_BUNDLED=OFF一次性全部关闭;- 日志级别:Debug 构建使用全部日志级别;Release/RelWithDebInfo 只有 WARNING/ERROR,除非加
-DNVIM_LOG_DEBUG。
第三方依赖(Third-party Dependencies)
依赖的精确清单与版本可以参考 Debian 源包(neovim)或 Homebrew formula。仓库内有一份机器可读的依赖清单 cmake.deps/deps.txt,每个依赖都带 URL 与 SHA-256 校验和,当前锁定的主要版本包括:libuv v1.52.1、LuaJIT(固定 commit 快照)、PUC Lua 5.1.5、unibilium v2.1.4、luv 1.52.1-0、utf8proc v2.11.3、tree-sitter v0.27.0 及 c/lua/vim/vimdoc/query/markdown 等内置解析器、wasmtime v48.0.1。
用 CMake 构建捆绑依赖:
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build .deps默认情况下库和头文件被放到.deps/usr。随后构建 Neovim:
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build build不使用"捆绑"依赖构建
- 手动安装依赖:
- libuv、libluv、libutf8proc、luajit、lua-lpeg、tree-sitter、tree-sitter-c、tree-sitter-lua、tree-sitter-markdown、tree-sitter-query、tree-sitter-vim、tree-sitter-vimdoc、unibilium。
- 运行 CMake:
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build build如果并非所有依赖都能从软件源获得,可以只部分使用捆绑依赖(
ninja示例):cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_BUNDLED=OFF -DUSE_BUNDLED_TS=ON cmake --build .deps cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo cmake --build build - 运行
make、ninja或你告诉 CMake 生成的构建工具。- 强烈推荐使用
ninja。
- 强烈推荐使用
- 如果 tree-sitter 解析器不是捆绑的,它们需要出现在运行时的
parser/目录中(例如/usr/share/nvim/runtime/parser/)。
离线构建(Build offline)
在库过旧或缺失、且无网络的系统上,你可能想用捆绑依赖构建。支持方式如下:
- 在联网机器上,采用以下任一方式把依赖源码以构建可用的形式放入
.deps:- 获取官方 deps 仓库(neovim/deps 的
src/分支,它是.deps/build/src/的自动更新"清理后"快照)到.deps/build/src/; - 或者运行
make deps生成.deps/,再按 CI 构建流程中给出的清理命令清理它。
- 获取官方 deps 仓库(neovim/deps 的
- 把准备好的
.deps拷贝到隔离机器(无网络)。 - 在隔离机器上启用
USE_EXISTING_SRC_DIR构建:make deps DEPS_CMAKE_FLAGS=-DUSE_EXISTING_SRC_DIR=ON make
USE_EXISTING_SRC_DIR选项在 cmake.deps/CMakeLists.txt 中定义为 "Skip download of deps sources in case of existing source directory",默认OFF。
不使用 unibilium 构建
unibilium 是唯一采用 LGPLv3 许可的依赖(仓库中没有 GPLv3-only 依赖)。它用于运行时加载 terminfo 数据库;如果内置的常见终端定义够用,可以禁用它。若要避免该依赖(转而依赖内置 terminfo 定义),构建时:
make CMAKE_EXTRA_FLAGS="-DENABLE_UNIBILIUM=0" DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_UNIBILIUM=0"运行时可通过has('terminfo') == 1确认 unibilium 是否被包含(未包含时该函数为假)。
指定部分"捆绑"依赖
例如同时构建"部分捆绑 + 部分非捆绑"的混合配置:
make DEPS_CMAKE_FLAGS="-DUSE_BUNDLED=OFF -DUSE_BUNDLED_LUV=ON -DUSE_BUNDLED_TS=ON -DUSE_BUNDLED_LIBUV=ON"注意 Makefile 对旧写法做了防护:BUNDLED_CMAKE_FLAG、BUNDLED_LUA_CMAKE_FLAG已移除,直接报错提示改用DEPS_CMAKE_FLAGS;另外USE_BUNDLED作为 Make 变量传入时,会被自动前缀成-DUSE_BUNDLED=...合并进DEPS_CMAKE_FLAGS。
构建静态二进制(Linux)
- 使用 musl C 的 Linux 发行版(glibc 不支持静态链接)。下文以 Alpine Linux 为例,任何带 musl 的发行版均可。
- 传
STATIC_BUILD变量执行 make:make CMAKE_EXTRA_FLAGS="-DSTATIC_BUILD=1"
不在 Alpine 上时,可以用容器构建:
podman run \ --rm \ -it \ -v "$PWD:/workdir" \ -w /workdir \ alpine:latest \ sh -c 'apk add build-base cmake coreutils curl gettext-tiny-dev git linux-headers && make CMAKE_EXTRA_FLAGS="-DSTATIC_BUILD=1"'build/bin/nvim中产出的二进制会把所有依赖静态链接:
build/bin/nvim: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=..., with debug_info, not stripped构建前置依赖(Build Prerequisites)
通用要求:
- Clang 或 GCC 4.9+;
- CMake 3.16+(需带 TLS/SSL 支持构建)。可选:从 cmake.org 获取最新版 CMake(提供 shell 安装脚本,适用于多数 Linux 系统;运行后确保
cmake二进制在你的$PATH中,以便 Nvim 构建能找到它)。
CMake 最低版本 3.16 的要求可在 CMakeLists.txt 的cmake_minimum_required(VERSION 3.16)中得到确认。
以下按平台列出具体前置依赖。
Ubuntu / Debian
sudo apt-get install ninja-build gettext cmake curl build-essential gitRHEL / Fedora
sudo dnf -y install ninja-build cmake gcc make gettext curl glibc-gconv-extra gitopenSUSE
sudo zypper install ninja cmake gcc-c++ gettext-tools curl gitArch Linux
sudo pacman -S base-devel cmake ninja curl gitAlpine Linux
apk add build-base cmake coreutils curl gettext-tiny-dev gitVoid Linux
xbps-install base-devel cmake curl gitNixOS / Nix
自 NixOS 18.03 起,Neovim 二进制位于neovim-unwrappedNix 包中(neovim包只是设置 Ruby/Python 支持等运行时选项的 wrapper):
cd path/to/neovim/src进入nix-shell拉取 Neovim 依赖:
nix-shell '<nixpkgs>' -A neovim-unwrapped配置并构建:
rm -rf build && cmakeConfigurePhase buildPhase测试默认不可用(存在未修复的失败)。可在 overlay 中启用:
neovim-dev = (super.pkgs.neovim-unwrapped.override { doCheck=true; }).overrideAttrs(oa:{ cmakeBuildType="debug"; nativeBuildInputs = oa.nativeBuildInputs ++ [ self.pkgs.valgrind ]; shellHook = '' export NVIM_PYTHON_LOG_LEVEL=DEBUG export NVIM_LOG_FILE=/tmp/log export VALGRIND_LOG="$PWD/valgrind.log" ''; });然后把neovim-unwrapped替换为neovim-dev:
nix-shell '<nixpkgs>' -A neovim-dev社区 flake(nix-community/neovim-nightly-overlay)提供三个包:
neovim:运行 nightly;neovim-debug:带调试符号运行;neovim-developer:获取开发 Neovim 所需的全部工具。
因此可以用nix run github:nix-community/neovim-nightly-overlay运行 Neovim nightly;类似地用nix run github:nix-community/neovim-nightly-overlay#neovim-developer进入开发环境。
要使用特定版本的 Neovim,可传--override-input neovim-src .使用当前目录,或指定具体 SHA1,如--override-input neovim-src github:neovim/neovim/89dc8f8f4e754e70cbe1624f030fb61bded41bc2。
Haiku
部分依赖可来自 Haiku 仓库,其余需要捆绑依赖:
cmake -DUSE_BUNDLED_LIBUV=OFF -DUSE_BUNDLED_UNIBILIUM=OFF -DUSE_BUNDLED_LUAJIT=OFF -B .deps ./cmake.deps make -C .depsFreeBSD
sudo pkg install cmake gmake sha wget gettext curl git如果遇到sha256sum不匹配错误,且实际的 SHA-256 哈希为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,那么这就是你的问题所在(这是空文件的 sha256sum,说明下载没有真正发生)。
OpenBSD
doas pkg_add gmake cmake curl gettext-tools git ninjaninja技术上是可选的,但没有它构建很可能会失败:因为那时cmake会使用make,而捆绑的 LuaJIT 需要gmake。替代方案是安装系统luajit并禁用捆绑 LuaJIT:
gmake DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_LUAJIT=0"另一个变通办法是编辑 cmake/Deps.cmake,注释掉set(MAKE_PRG "$(MAKE)")一行,让MAKE_PRG保持为gmake,这样 LuaJIT 会用gmake构建。
macOS
macOS / Homebrew
- 安装 Xcode Command Line Tools:
xcode-select --install - 安装 Homebrew
- 安装 Neovim 构建依赖:
brew install ninja cmake gettext curl git- 注意:如果看到 Wget 证书错误(macOS 10.10 以下旧版本):
brew install curl-ca-bundle echo CA_CERTIFICATE=$(brew --prefix curl-ca-bundle)/share/ca-bundle.crt >> ~/.wgetrc - 注意:如果看到
'stdio.h' file not found,尝试:open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
- 注意:如果看到 Wget 证书错误(macOS 10.10 以下旧版本):
macOS / MacPorts
- 安装 Xcode Command Line Tools:
xcode-select --install - 安装 MacPorts
- 安装 Neovim 构建依赖:
sudo port install ninja cmake gettext git- 注意:Wget 证书错误(macOS 10.10 以下):
sudo port install curl-ca-bundle echo CA_CERTIFICATE=/opt/local/share/curl/curl-ca-bundle.crt >> ~/.wgetrc - 注意:
'stdio.h' file not found的解决办法同上(安装 macOS SDK headers 包)。
- 注意:Wget 证书错误(macOS 10.10 以下):
面向旧版 macOS 构建
从新版 macOS 构建面向旧版 macOS 的二进制,需设置部署目标:
make CMAKE_BUILD_TYPE=Release MACOSX_DEPLOYMENT_TARGET=10.13 DEPS_CMAKE_FLAGS="-DCMAKE_CXX_COMPILER=$(xcrun -find c++)"这里显式指定 C++ 编译器,是为了在设置部署目标后仍能被找到。对应源码逻辑:CMakeLists.txt 在CMAKE_OSX_DEPLOYMENT_TARGET未手动设置时,用sw_vers -productVersion回退到本机系统版本,且 cmake.deps/CMakeLists.txt 中做了同样的处理(注释明确说明"两边都要设置")。
使用 Zig 构建
前置条件
- zig 0.16.x
操作步骤
- 构建编辑器:
zig build,运行./zig-out/bin/nvim - 带运行时完整安装:
zig build install --prefix ~/.local - 测试:
zig build functionaltest运行全部功能测试zig build functionaltest -- test/functional/autocmd/bufenter_spec.lua运行单个文件中的测试zig build unittest运行全部单元测试zig build oldtest运行全部 oldtests
构建定义在根目录 build.zig,版本常量(0.13.0-dev、API level 15)与 CMake 构建保持一致,测试步骤由 test/run_tests.zig 提供。
使用系统依赖
zig build -h中的 "Available System Integrations" 一节列出可用的系统集成。启用某个集成,例如zig build -fsys=utf8proc,会使用系统安装的 utf8proc。从源码看,build.zig 的SystemIntegrationOptions结构体定义了五个可集成的库:lua、tree_sitter、unibilium、utf8proc、uv,与-fsys=选项一一对应。
zig build --system deps_dir会启用所有集成并关闭依赖拉取。这要求你预先下载那些没有系统集成的依赖(编写本文时是 ziglua 和内置 tree-sitter 解析器)到deps_dir:需要创建以各包哈希命名的子目录,并把依赖解压在其中——ziglua 应放在deps_dir/zlua-0.1.0-hGRpC1dCBQDf-IqqUifYvyr8B9-4FlYXqY8cl7HIetrC之下,依此类推。哈希从 build.zig.zon 中获取。社区仓库中的PKGBUILD的prepare函数可作为参考示例。
交叉编译(Cross-compiling)
交叉编译未完全支持,但仓库在此收集笔记以备参考(欢迎改进)。该节同样适用于 WebAssembly(WASM)构建。
- cmake:设置
NVIM_HOST_PRG,使文档与 tags 生成不依赖目标二进制即可工作。 - zig build:交叉编译通常只需设置
-Dtarget即可开启,例如从 Linux 主机:zig build -Dtarget=aarch64-macos会自动编译一个 host 侧 Lua 供构建过程使用。
-Dhost={target_string}选项可覆盖编译期运行二进制时所用的平台;-Dhost=native强制完全交叉编译;-Dhost=(空字符串)假定目标二进制能在主机上运行(例如 x86_64 系统上目标是 x86,或通过 binfmt 之类设置了仿真)。
-Dhost的语义在 build.zig 中可见:当目标为 native 或架构/系统相同且未显式指定时,host 为空串(不交叉编译),否则回退为native,此时会额外编译一份 host 侧依赖(如ziglua_host,见 build.zig)。
WebAssembly(实验性)
Neovim 可以使用wasm32-emscripten目标交叉编译为 WebAssembly。
- 需要 Emscripten SDK(
emsdk)。 - 安装并激活后,把它的 sysroot 传给
-Demscripten-sysroot,例如$EMSDK/upstream/emscripten/cache/sysroot。
构建 WebAssembly 目标:
zig build nvim_bin \ -Dtarget=wasm32-emscripten \ -Demscripten-sysroot=$EMSDK/upstream/emscripten/cache/sysroot这会产出:
nvim.wasm:WebAssembly 模块;nvim.js:Emscripten 生成的 JavaScript loader。
仓库中 src/wasm 目录包含了配套的网页运行环境(index.html、app.js、nvim-worker.js、serve.py等),emscripten-sysroot选项本身定义在 build.zig,用于把 Emscripten 的include/目录注入编译过程。该目标当前标记为实验性,功能与稳定性以实际构建结果为准。
小结
| 场景 | 关键命令 / 选项 |
|---|---|
| 最快上手 | make CMAKE_BUILD_TYPE=RelWithDebInfo |
| 发布构建 | make CMAKE_BUILD_TYPE=Release |
| 自定义安装前缀 | make CMAKE_INSTALL_PREFIX=... install |
| 查看全部 CMake 选项 | cmake -B build -LH |
| 切换系统/捆绑依赖 | DEPS_CMAKE_FLAGS="-DUSE_BUNDLED=..."系列 |
| 离线构建 | make deps DEPS_CMAKE_FLAGS=-DUSE_EXISTING_SRC_DIR=ON |
| 静态二进制 | musl 发行版 +make CMAKE_EXTRA_FLAGS="-DSTATIC_BUILD=1" |
| 本地定制 | 根目录local.mk(参照 contrib/local.mk.example) |
| Zig 构建 | zig build(0.16.x) |
| WASM(实验性) | zig build nvim_bin -Dtarget=wasm32-emscripten -Demscripten-sysroot=... |
本文全部内容均以当前仓库(源码版本号 0.13.0-dev,API level 15)实际文件为准:构建入口见 Makefile 与 CMakeLists.txt,依赖管理见 cmake.deps/CMakeLists.txt 与 cmake.deps/deps.txt,Zig 构建见 build.zig。
【免费下载链接】neovimVim-fork focused on extensibility and usability项目地址: https://gitcode.com/GitHub_Trending/ne/neovim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考