From 1f004970f00bd8ef7ad955b52857df136f82185b Mon Sep 17 00:00:00 2001 From: bfredl Date: Tue, 11 Mar 2025 14:01:55 +0100 Subject: feat(build): build.zig MVP: build and run functionaltests on linux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NEW BUILD SYSTEM! This is a MVP implementation which supports building the "nvim" binary, including cross-compilation for some targets. As an example, you can build a aarch64-macos binary from an x86-64-linux-gnu host, or vice versa Add CI target for build.zig currently for functionaltests on linux x86_64 only Follow up items: - praxis for version and dependency bumping - windows 💀 - full integration of libintl and gettext (or a desicion not to) - update help and API metadata files - installation into a $PREFIX - more tests and linters --- runtime/CMakeLists.txt | 5 +++++ runtime/doc/news.txt | 6 ++++++ runtime/embedded_data.zig | 3 +++ runtime/gen_runtime.zig | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 runtime/embedded_data.zig create mode 100644 runtime/gen_runtime.zig (limited to 'runtime') diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt index d103b5f4d7..fdd846561e 100644 --- a/runtime/CMakeLists.txt +++ b/runtime/CMakeLists.txt @@ -12,12 +12,17 @@ get_directory_property(LUA_GEN_DEPS DIRECTORY ${PROJECT_SOURCE_DIR}/src/nvim DEF add_custom_command(OUTPUT ${GENERATED_SYN_VIM} COMMAND ${LUA_GEN} ${SYN_VIM_GENERATOR} ${GENERATED_SYN_VIM} ${FUNCS_DATA} + ${PROJECT_SOURCE_DIR}/src/nvim/options.lua + ${PROJECT_SOURCE_DIR}/src/nvim/auevents.lua + ${PROJECT_SOURCE_DIR}/src/nvim/ex_cmds.lua + ${PROJECT_SOURCE_DIR}/src/nvim/vvars.lua DEPENDS ${LUA_GEN_DEPS} ${SYN_VIM_GENERATOR} ${PROJECT_SOURCE_DIR}/src/nvim/ex_cmds.lua ${PROJECT_SOURCE_DIR}/src/nvim/auevents.lua ${PROJECT_SOURCE_DIR}/src/nvim/options.lua + ${PROJECT_SOURCE_DIR}/src/nvim/vvars.lua ${PROJECT_SOURCE_DIR}/src/nvim/eval.c ${FUNCS_DATA} ) diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt index a69520b8e2..bc42829012 100644 --- a/runtime/doc/news.txt +++ b/runtime/doc/news.txt @@ -107,6 +107,12 @@ API `max_height` is reached, and returns the `end_row` and `end_vcol` for which `max_height` or the calculated height is reached. +BUILD + +• A Zig-based build system has been added as an alternative to CMake. It is + currently limited in functionality, and CMake remains the recommended option + for the time being. + DEFAULTS • 'statusline' default is exposed as a statusline expression (previously it diff --git a/runtime/embedded_data.zig b/runtime/embedded_data.zig new file mode 100644 index 0000000000..5872a20faf --- /dev/null +++ b/runtime/embedded_data.zig @@ -0,0 +1,3 @@ +pub const inspect_module = @embedFile("./lua/vim/inspect.lua"); +pub const shared_module = @embedFile("./lua/vim/shared.lua"); +pub const iter_module = @embedFile("./lua/vim/iter.lua"); diff --git a/runtime/gen_runtime.zig b/runtime/gen_runtime.zig new file mode 100644 index 0000000000..1bf7bfde38 --- /dev/null +++ b/runtime/gen_runtime.zig @@ -0,0 +1,39 @@ +const std = @import("std"); +const LazyPath = std.Build.LazyPath; + +pub const SourceItem = struct { name: []u8, api_export: bool }; + +pub fn nvim_gen_runtime( + b: *std.Build, + nlua0: *std.Build.Step.Compile, + nvim_bin: *std.Build.Step.Compile, + funcs_data: LazyPath, +) !*std.Build.Step.WriteFile { + const gen_runtime = b.addWriteFiles(); + + { + const gen_step = b.addRunArtifact(nlua0); + gen_step.addFileArg(b.path("src/gen/gen_vimvim.lua")); + const file = gen_step.addOutputFileArg("generated.vim"); + _ = gen_runtime.addCopyFile(file, "syntax/vim/generated.vim"); + gen_step.addFileArg(funcs_data); + gen_step.addFileArg(b.path("src/nvim/options.lua")); + gen_step.addFileArg(b.path("src/nvim/auevents.lua")); + gen_step.addFileArg(b.path("src/nvim/ex_cmds.lua")); + gen_step.addFileArg(b.path("src/nvim/vvars.lua")); + } + + { + const install_doc_files = b.addInstallDirectory(.{ .source_dir = b.path("runtime/doc"), .install_dir = .prefix, .install_subdir = "runtime/doc" }); + const gen_step = b.addRunArtifact(nvim_bin); + gen_step.step.dependOn(&install_doc_files.step); + gen_step.addArgs(&.{ "-u", "NONE", "-i", "NONE", "-e", "--headless", "-c", "helptags ++t doc", "-c", "quit" }); + // TODO(bfredl): ugly on purpose. nvim should be able to generate "tags" at a specificed destination + const install_path: std.Build.LazyPath = .{ .cwd_relative = b.install_path }; + gen_step.setCwd(install_path.path(b, "runtime/")); + + gen_runtime.step.dependOn(&gen_step.step); + } + + return gen_runtime; +} -- cgit