feat(build): support full runtime distribution work

Working towards making the build.zig build actually useful for
users..

For building a full runtime distribution in /usr or /opt/nvim or
whatever, use

sudo zig build install -p /usr

by default "zig build" will now work like "make" e.g. just build the binary
and the generated parts of the runtime. This will work for development,
but you need to use both parts of the runtime, just like with
an "uninstalled" cmake build:

   zig build
   VIM=. ./zig-out/bin/nvim --clean --cmd "set rtp+=./zig-out/runtime"

As a wrapper, `zig build run_dev` can be used
This commit is contained in:
bfredl
2025-11-12 13:56:28 +01:00
parent 6741c134e1
commit 8e0692cdc5
2 changed files with 32 additions and 12 deletions

View File

@@ -217,10 +217,10 @@ jobs:
- run: sudo apt-get install -y inotify-tools
- run: zig build test_nlua0
- run: zig build nvim && ./zig-out/bin/nvim --version
- run: zig build nvim_bin && ./zig-out/bin/nvim --version
- run: zig build unittest
- run: zig build functionaltest
# `zig build nvim` uses a lua script for doctags in order to support cross-compiling
# `zig build` uses a lua script for doctags in order to support cross-compiling
# compare with the builtin generator that they match
- run: cd runtime; ../zig-out/bin/nvim -u NONE -i NONE -e --headless -c "helptags ++t doc" -c quit
- run: diff -u runtime/doc/tags zig-out/runtime/doc/tags

View File

@@ -230,10 +230,10 @@ pub fn build(b: *std.Build) !void {
_ = gen_config.addCopyFile(sysconfig_step.getOutput(), "auto/config.h"); // run_preprocessor() workaronnd
_ = gen_config.add("auto/pathdef.h", b.fmt(
\\char *default_vim_dir = "/usr/local/share/nvim";
\\char *default_vim_dir = "{s}/share/nvim";
\\char *default_vimruntime_dir = "";
\\char *default_lib_dir = "/usr/local/lib/nvim";
, .{}));
\\char *default_lib_dir = "{s}/nvim";
, .{ b.install_path, b.lib_dir })); // b.lib_dir is typically b.install_path + "/lib" but may be overridden
const opt_version_string = b.option([]const u8, "version-string", "Override Neovim version string. Default is to find out with git.");
const version_medium = if (opt_version_string) |version_string| version_string else v: {
@@ -380,18 +380,38 @@ pub fn build(b: *std.Build) !void {
nvim_exe_step.dependOn(&nvim_exe_install.step);
const gen_runtime = try runtime.nvim_gen_runtime(b, nlua0, funcs_data);
const runtime_install = b.addInstallDirectory(.{ .source_dir = gen_runtime.getDirectory(), .install_dir = .prefix, .install_subdir = "runtime/" });
const nvim = b.step("nvim", "build the editor");
nvim.dependOn(&nvim_exe_install.step);
nvim.dependOn(&runtime_install.step);
const lua_dev_deps = b.dependency("lua_dev_deps", .{});
const test_deps = b.step("test_deps", "test prerequisites");
test_deps.dependOn(&nvim_exe_install.step);
test_deps.dependOn(&runtime_install.step);
// running tests doesn't require copying the static runtime, only the generated stuff
const test_runtime_install = b.addInstallDirectory(.{ .source_dir = gen_runtime.getDirectory(), .install_dir = .prefix, .install_subdir = "runtime/" });
test_deps.dependOn(&test_runtime_install.step);
const nvim_dev = b.step("nvim_dev", "build the editor for development");
b.default_step = nvim_dev;
nvim_dev.dependOn(&nvim_exe_install.step);
nvim_dev.dependOn(&test_runtime_install.step);
// run from dev environment
const run_cmd = b.addRunArtifact(nvim_exe);
run_cmd.setEnvironmentVariable("VIMRUNTIME", try b.build_root.join(b.graph.arena, &.{"runtime"}));
run_cmd.setEnvironmentVariable("NVIM_ZIG_INSTALL_DIR", b.getInstallPath(.prefix, "runtime"));
run_cmd.step.dependOn(nvim_dev);
run_cmd.addArgs(&.{ "--cmd", "let &rtp = &rtp.','.$NVIM_ZIG_INSTALL_DIR" });
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run_dev", "run the editor (for development)");
run_step.dependOn(&run_cmd.step);
// installation
const install = b.getInstallStep();
install.dependOn(&nvim_exe_install.step);
b.installDirectory(.{ .source_dir = b.path("runtime/"), .install_dir = .prefix, .install_subdir = "share/nvim/runtime/" });
b.installDirectory(.{ .source_dir = gen_runtime.getDirectory(), .install_dir = .prefix, .install_subdir = "share/nvim/runtime/" });
test_deps.dependOn(test_fixture(b, "shell-test", null, target, optimize, &flags));
test_deps.dependOn(test_fixture(b, "tty-test", libuv, target, optimize, &flags));