Neovim 从源码构建完全指南:构建类型、捆绑依赖管理与多平台交叉编译(BUILD.md 深度解读)
2026/9/5 22:28:34 网站建设 项目流程

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 类系统):

  1. 在你的系统上安装构建前置依赖。
  2. 克隆仓库:
    git clone https://gitcode.com/GitHub_Trending/ne/neovim
  3. cd neovim
    • 如果希望构建稳定版(stable release),同时执行git checkout stable
  4. make CMAKE_BUILD_TYPE=RelWithDebInfo
    • 如需安装到自定义位置,设置CMAKE_INSTALL_PREFIX,参见 INSTALL.md。
    • 在 BSD 系统上,请将make换成gmake
    • 在 Windows 上构建,见下文Windows 构建一节,推荐 MSVC(Visual Studio)
  5. sudo make install
    • 默认安装位置为/usr/local
    • 在 Debian/Ubuntu 上,可以改用cd build && cpack -G DEB && sudo dpkg -i nvim-linux-<arch>.deb<arch>x86_64arm64)来构建并安装 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 install

CMake 会把大量信息缓存到build/CMakeCache.txt。如果你想更改CMAKE_BUILD_TYPECMAKE_INSTALL_PREFIX,请先执行rm -rf build。在 Git 提交新增或删除文件(包括runtime中的文件)后重新构建时,同样需要先清掉缓存——拿不准时执行make distclean(它基本上是rm -rf build .deps的快捷方式)。

从源码看有两点佐证:

  • Makefile 中的distclean目标会删除.depsbuild.zig-cachezig-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_LIBUVlibuv跟随USE_BUNDLED
USE_BUNDLED_LUAPUC Lua(默认仅用于测试,需显式开启)OFF
USE_BUNDLED_LUAJITLuaJIT跟随USE_BUNDLED
USE_BUNDLED_LUVluv跟随USE_BUNDLED
USE_BUNDLED_TStree-sitter 运行时跟随USE_BUNDLED
USE_BUNDLED_TS_PARSERStree-sitter 解析器跟随USE_BUNDLED
USE_BUNDLED_UNIBILIUMunibilium跟随USE_BUNDLED
USE_BUNDLED_UTF8PROCutf8proc跟随USE_BUNDLED
USE_BUNDLED_GETTEXT/USE_BUNDLED_LIBICONVgettext / libiconv仅 MSVC 平台默认ON,其余OFF
ENABLE_WASMTIMEwasmtime(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_LIBINTLON)、ENABLE_UNIBILIUMON)、ENABLE_WASMTIMEOFF)等主程序侧开关,以及ENABLE_ASAN_UBSAN/ENABLE_MSAN/ENABLE_TSAN三类互斥的 sanitizer 选项。

Windows 构建

Windows / MSVC

MSVC(Visual Studio)是 Windows 上推荐的构建方式。

  1. 安装 Visual Studio(2017 或更新版本),勾选Desktop development with C++工作负载。
    • 32 位 Windows 上需要处理 Ninja 二进制格式不兼容的问题(Visual Studio 反馈社区有对应工单)。
  2. 用 Visual Studio 打开 Neovim 项目文件夹。
    • Visual Studio 应能检测到 CMake 文件并自动开始构建。
  3. 选择nvim.exe (bin\nvim.exe)目标并按 F5 运行。
    • 若构建失败,可能是在你切换到x86-Release之前,Visual Studio 已用x64-{Debug,Release}发起了构建。处理方式:右键 CMakeLists.txt →Delete Cache,再右键 →Generate Cache
    • 若看到来自ntdll的 "access violation",可忽略并继续。
  4. 若出现uv.dll not found之类的错误,先尝试nvim.exe (Install)目标,然后切回nvim.exe (bin\nvim.exe)

源码层面有个便利设计:CMakeLists.txt 检测到CLION_IDEVisualStudioEdition环境变量时,会自动代你构建捆绑依赖(execute_process调用cmake.deps),这正是"Visual Studio 打开即自动构建"的底层原因。

Windows / MSVC PowerShell

如果希望从命令行直接调用cmake

  1. 确保 Visual Studio 环境变量已加载,任选其一:
    • 使用Visual Studio Developer Command PromptDeveloper PowerShell
    • 在 PowerShell 中通过 Pscx 模块调用Import-VisualStudioVars
    • 在命令提示符中执行:
      VsDevCmd.bat -arch=x64

    这一步是为了让luarocks能找到 Visual Studio 安装,避免回退到 MinGW 并报'mingw32-gcc' is not recognized as an internal or external command之类的错误。

  2. 在 "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

  1. 安装 CLion。
  2. 用 CLion 打开 Neovim 项目。
  3. 选择Build → Build All in 'Release'

Windows / Cygwin

自上游 PR #36417 之后,Cygwin 构建可能简单到:

make && make install

若失败,替代方案:

  1. 按常规方式安装所有依赖。
    • Cygport 仓库包含所有 Cygwin 发行版中不可用依赖的 Cygport 文件(如APKBUILDPKGBUILD),并描述了构建所需的特殊命令或参数;除非提供了自定义命令,Cygport 只会在干净一致的方式下调用autogen/cmakemakemake install等。
    • 社区项目 neovim-cygwin 基于 Cygwin 2.9.0 构建;更新的libuv可能需要更少的打补丁。Cygwin 2.10.0 中部分 SSP 行为变化,也可能影响 Neovim 的构建。
  2. 不使用捆绑依赖构建(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

  1. 在 MSYS2 shell 中安装这些包:
    pacman -S \ mingw-w64-ucrt-x86_64-gcc \ mingw-w64-x86_64-{cmake,make,ninja,diffutils}
  2. 在 Windows 命令提示符(cmd.exe)中设置PATH并构建:
    set PATH=c:\msys64\ucrt64\bin;c:\msys64\usr\bin;%PATH%
  3. 两个选项任选:
    • 使用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_BR
  • check-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

不使用"捆绑"依赖构建

  1. 手动安装依赖:
    • 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。
  2. 运行 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
  3. 运行makeninja或你告诉 CMake 生成的构建工具。
    • 强烈推荐使用ninja
  4. 如果 tree-sitter 解析器不是捆绑的,它们需要出现在运行时的parser/目录中(例如/usr/share/nvim/runtime/parser/)。

离线构建(Build offline)

在库过旧或缺失、且无网络的系统上,你可能想用捆绑依赖构建。支持方式如下:

  1. 在联网机器上,采用以下任一方式把依赖源码以构建可用的形式放入.deps
    • 获取官方 deps 仓库(neovim/deps 的src/分支,它是.deps/build/src/的自动更新"清理后"快照)到.deps/build/src/
    • 或者运行make deps生成.deps/,再按 CI 构建流程中给出的清理命令清理它。
  2. 把准备好的.deps拷贝到隔离机器(无网络)。
  3. 在隔离机器上启用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_FLAGBUNDLED_LUA_CMAKE_FLAG已移除,直接报错提示改用DEPS_CMAKE_FLAGS;另外USE_BUNDLED作为 Make 变量传入时,会被自动前缀成-DUSE_BUNDLED=...合并进DEPS_CMAKE_FLAGS

构建静态二进制(Linux)

  1. 使用 musl C 的 Linux 发行版(glibc 不支持静态链接)。下文以 Alpine Linux 为例,任何带 musl 的发行版均可。
  2. 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 git

RHEL / Fedora

sudo dnf -y install ninja-build cmake gcc make gettext curl glibc-gconv-extra git

openSUSE

sudo zypper install ninja cmake gcc-c++ gettext-tools curl git

Arch Linux

sudo pacman -S base-devel cmake ninja curl git

Alpine Linux

apk add build-base cmake coreutils curl gettext-tiny-dev git

Void Linux

xbps-install base-devel cmake curl git

NixOS / 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 .deps

FreeBSD

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 ninja

ninja技术上是可选的,但没有它构建很可能会失败:因为那时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
  1. 安装 Xcode Command Line Tools:xcode-select --install
  2. 安装 Homebrew
  3. 安装 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
macOS / MacPorts
  1. 安装 Xcode Command Line Tools:xcode-select --install
  2. 安装 MacPorts
  3. 安装 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 包)。
面向旧版 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结构体定义了五个可集成的库:luatree_sitterunibiliumutf8procuv,与-fsys=选项一一对应。

zig build --system deps_dir会启用所有集成并关闭依赖拉取。这要求你预先下载那些没有系统集成的依赖(编写本文时是 ziglua 和内置 tree-sitter 解析器)到deps_dir:需要创建以各包哈希命名的子目录,并把依赖解压在其中——ziglua 应放在deps_dir/zlua-0.1.0-hGRpC1dCBQDf-IqqUifYvyr8B9-4FlYXqY8cl7HIetrC之下,依此类推。哈希从 build.zig.zon 中获取。社区仓库中的PKGBUILDprepare函数可作为参考示例。

交叉编译(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.htmlapp.jsnvim-worker.jsserve.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询