2021-01-15 13:21:58 +00:00
|
|
|
{ lib, stdenv, fetchFromGitHub, cmake, gettext, msgpack, libtermkey, libiconv
|
neovim: make the build reproducible
This introduces a patch that improves binary reproducibility since changes in
ordering of the generated code indeed cause changes in the compiled code.
Additionally, since neovim embeds luajit-compiled bytecode into the nvim binary,
we are impacted by https://github.com/LuaJIT/LuaJIT/issues/626 . It is possible
to switch to lua 5.1, but that'd be a regression (luajit has much better
performance and some plugins depend on it, like for example Noice and Lazy).
Disabling `COMPILE_LUA` at build time would cause a runtime penalty each time
neovim starts. Instead, we run luagit with those security settings disabled for
the build-time code generation.
(Note to self: for a minimized testcase this seemed to help at
975ec13f5d5aefcac1dbb15fa867e660e07c93a1 but no longer at
03080b795aa3496ed62d4a0697c9f4767e7ca7e5 of luajit, which is surprising since
that commit doesn't look super relevant. _Also_ surprisingly it does seem to
work in the context of the neovim code generation, though, so that might be
good enough...)
Also, some of the code generation (using mpack and tables) still relies on
stable table ordering. This should eventually be fixed, but as a workaround
we use the luajit-with-stable-string-ids for those generators as well.
Fixes #207841
2022-12-28 13:04:18 +00:00
|
|
|
, fetchpatch
|
2021-01-19 06:50:56 +00:00
|
|
|
, libuv, lua, ncurses, pkg-config
|
2021-10-28 16:57:13 +00:00
|
|
|
, unibilium, gperf
|
2018-05-16 05:55:26 +00:00
|
|
|
, libvterm-neovim
|
2020-05-10 19:13:02 +00:00
|
|
|
, tree-sitter
|
2022-05-22 07:16:22 +00:00
|
|
|
, CoreServices
|
2019-02-05 15:00:19 +00:00
|
|
|
, glibcLocales ? null, procps ? null
|
|
|
|
|
2022-03-30 09:08:06 +00:00
|
|
|
# now defaults to false because some tests can be flaky (clipboard etc), see
|
|
|
|
# also: https://github.com/neovim/neovim/issues/16233
|
2019-02-05 15:00:19 +00:00
|
|
|
, doCheck ? false
|
2021-05-01 00:29:59 +00:00
|
|
|
, nodejs ? null, fish ? null, python3 ? null
|
2015-06-11 00:42:20 +00:00
|
|
|
}:
|
2014-11-27 20:04:28 +00:00
|
|
|
|
2015-06-11 00:42:20 +00:00
|
|
|
let
|
2019-02-05 15:00:19 +00:00
|
|
|
neovimLuaEnv = lua.withPackages(ps:
|
2019-08-01 11:52:11 +00:00
|
|
|
(with ps; [ lpeg luabitop mpack ]
|
2022-12-07 01:09:19 +00:00
|
|
|
++ lib.optionals doCheck [
|
2019-02-05 15:00:19 +00:00
|
|
|
nvim-client luv coxpcall busted luafilesystem penlight inspect
|
|
|
|
]
|
|
|
|
));
|
neovim: make the build reproducible
This introduces a patch that improves binary reproducibility since changes in
ordering of the generated code indeed cause changes in the compiled code.
Additionally, since neovim embeds luajit-compiled bytecode into the nvim binary,
we are impacted by https://github.com/LuaJIT/LuaJIT/issues/626 . It is possible
to switch to lua 5.1, but that'd be a regression (luajit has much better
performance and some plugins depend on it, like for example Noice and Lazy).
Disabling `COMPILE_LUA` at build time would cause a runtime penalty each time
neovim starts. Instead, we run luagit with those security settings disabled for
the build-time code generation.
(Note to self: for a minimized testcase this seemed to help at
975ec13f5d5aefcac1dbb15fa867e660e07c93a1 but no longer at
03080b795aa3496ed62d4a0697c9f4767e7ca7e5 of luajit, which is surprising since
that commit doesn't look super relevant. _Also_ surprisingly it does seem to
work in the context of the neovim code generation, though, so that might be
good enough...)
Also, some of the code generation (using mpack and tables) still relies on
stable table ordering. This should eventually be fixed, but as a workaround
we use the luajit-with-stable-string-ids for those generators as well.
Fixes #207841
2022-12-28 13:04:18 +00:00
|
|
|
codegenLua =
|
|
|
|
if lua.pkgs.isLuaJIT
|
|
|
|
then
|
|
|
|
let deterministicLuajit =
|
|
|
|
lua.override {
|
|
|
|
deterministicStringIds = true;
|
|
|
|
self = deterministicLuajit;
|
|
|
|
};
|
|
|
|
in deterministicLuajit.withPackages(ps: [ ps.mpack ps.lpeg ])
|
|
|
|
else lua;
|
2020-05-23 15:05:52 +00:00
|
|
|
|
2021-05-01 00:29:59 +00:00
|
|
|
pyEnv = python3.withPackages(ps: with ps; [ pynvim msgpack ]);
|
2019-02-05 15:00:19 +00:00
|
|
|
in
|
|
|
|
stdenv.mkDerivation rec {
|
2019-08-15 12:41:18 +00:00
|
|
|
pname = "neovim-unwrapped";
|
2023-01-23 09:42:28 +00:00
|
|
|
version = "0.8.3";
|
2015-06-11 00:42:20 +00:00
|
|
|
|
2015-06-11 08:48:29 +00:00
|
|
|
src = fetchFromGitHub {
|
|
|
|
owner = "neovim";
|
2016-06-04 15:58:01 +00:00
|
|
|
repo = "neovim";
|
|
|
|
rev = "v${version}";
|
2023-01-23 09:42:28 +00:00
|
|
|
hash = "sha256-ItJ8aX/WUfcAovxRsXXyWKBAI92hFloYIZiv7viPIdQ=";
|
2015-06-11 08:48:29 +00:00
|
|
|
};
|
2015-06-11 00:42:20 +00:00
|
|
|
|
2018-12-30 19:37:44 +00:00
|
|
|
patches = [
|
|
|
|
# introduce a system-wide rplugin.vim in addition to the user one
|
|
|
|
# necessary so that nix can handle `UpdateRemotePlugins` for the plugins
|
|
|
|
# it installs. See https://github.com/neovim/neovim/issues/9413.
|
|
|
|
./system_rplugin_manifest.patch
|
neovim: make the build reproducible
This introduces a patch that improves binary reproducibility since changes in
ordering of the generated code indeed cause changes in the compiled code.
Additionally, since neovim embeds luajit-compiled bytecode into the nvim binary,
we are impacted by https://github.com/LuaJIT/LuaJIT/issues/626 . It is possible
to switch to lua 5.1, but that'd be a regression (luajit has much better
performance and some plugins depend on it, like for example Noice and Lazy).
Disabling `COMPILE_LUA` at build time would cause a runtime penalty each time
neovim starts. Instead, we run luagit with those security settings disabled for
the build-time code generation.
(Note to self: for a minimized testcase this seemed to help at
975ec13f5d5aefcac1dbb15fa867e660e07c93a1 but no longer at
03080b795aa3496ed62d4a0697c9f4767e7ca7e5 of luajit, which is surprising since
that commit doesn't look super relevant. _Also_ surprisingly it does seem to
work in the context of the neovim code generation, though, so that might be
good enough...)
Also, some of the code generation (using mpack and tables) still relies on
stable table ordering. This should eventually be fixed, but as a workaround
we use the luajit-with-stable-string-ids for those generators as well.
Fixes #207841
2022-12-28 13:04:18 +00:00
|
|
|
# make the build reproducible, rebased version of
|
|
|
|
# https://github.com/neovim/neovim/pull/21586
|
|
|
|
(fetchpatch {
|
|
|
|
name = "neovim-build-make-generated-source-files-reproducible.patch";
|
|
|
|
url = "https://github.com/raboof/neovim/commit/485dd2af3efbfd174163583c46e0bb2a01ff04f1.patch";
|
|
|
|
hash = "sha256-9aRVK4lDkL/W4RVjeKptrZFY7rYYBx6/RGR4bQSbCsM=";
|
|
|
|
})
|
2018-12-30 19:37:44 +00:00
|
|
|
];
|
|
|
|
|
2019-05-14 07:24:14 +00:00
|
|
|
dontFixCmake = true;
|
2015-06-11 00:42:20 +00:00
|
|
|
|
2021-08-31 17:28:57 +00:00
|
|
|
inherit lua;
|
|
|
|
|
2015-06-11 08:48:29 +00:00
|
|
|
buildInputs = [
|
2019-08-01 11:52:11 +00:00
|
|
|
gperf
|
2015-06-11 08:48:29 +00:00
|
|
|
libtermkey
|
|
|
|
libuv
|
2019-08-01 11:52:11 +00:00
|
|
|
libvterm-neovim
|
2022-03-29 02:48:19 +00:00
|
|
|
# This is actually a c library, hence it's not included in neovimLuaEnv,
|
|
|
|
# see:
|
|
|
|
# https://github.com/luarocks/luarocks/issues/1402#issuecomment-1080616570
|
|
|
|
# and it's definition at: pkgs/development/lua-modules/overrides.nix
|
|
|
|
lua.pkgs.libluv
|
2018-08-17 23:53:33 +00:00
|
|
|
msgpack
|
2015-06-11 08:48:29 +00:00
|
|
|
ncurses
|
2019-02-05 15:00:19 +00:00
|
|
|
neovimLuaEnv
|
2020-05-10 19:13:02 +00:00
|
|
|
tree-sitter
|
2019-08-01 11:52:11 +00:00
|
|
|
unibilium
|
2022-12-07 01:09:19 +00:00
|
|
|
] ++ lib.optionals stdenv.isDarwin [ libiconv CoreServices ]
|
|
|
|
++ lib.optionals doCheck [ glibcLocales procps ]
|
2019-02-05 15:00:19 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
inherit doCheck;
|
|
|
|
|
|
|
|
# to be exhaustive, one could run
|
|
|
|
# make oldtests too
|
|
|
|
checkPhase = ''
|
|
|
|
make functionaltest
|
|
|
|
'';
|
2015-06-11 08:48:29 +00:00
|
|
|
|
|
|
|
nativeBuildInputs = [
|
2015-06-17 17:36:06 +00:00
|
|
|
cmake
|
2015-06-11 08:48:29 +00:00
|
|
|
gettext
|
2021-01-19 06:50:56 +00:00
|
|
|
pkg-config
|
2015-06-11 08:48:29 +00:00
|
|
|
];
|
|
|
|
|
2020-05-23 15:05:52 +00:00
|
|
|
# extra programs test via `make functionaltest`
|
2023-01-21 12:00:00 +00:00
|
|
|
nativeCheckInputs = [
|
2020-05-23 15:05:52 +00:00
|
|
|
fish
|
|
|
|
nodejs
|
|
|
|
pyEnv # for src/clint.py
|
|
|
|
];
|
|
|
|
|
2019-01-25 21:20:12 +00:00
|
|
|
# nvim --version output retains compilation flags and references to build tools
|
|
|
|
postPatch = ''
|
|
|
|
substituteInPlace src/nvim/version.c --replace NVIM_VERSION_CFLAGS "";
|
|
|
|
'';
|
|
|
|
# check that the above patching actually works
|
neovim: make the build reproducible
This introduces a patch that improves binary reproducibility since changes in
ordering of the generated code indeed cause changes in the compiled code.
Additionally, since neovim embeds luajit-compiled bytecode into the nvim binary,
we are impacted by https://github.com/LuaJIT/LuaJIT/issues/626 . It is possible
to switch to lua 5.1, but that'd be a regression (luajit has much better
performance and some plugins depend on it, like for example Noice and Lazy).
Disabling `COMPILE_LUA` at build time would cause a runtime penalty each time
neovim starts. Instead, we run luagit with those security settings disabled for
the build-time code generation.
(Note to self: for a minimized testcase this seemed to help at
975ec13f5d5aefcac1dbb15fa867e660e07c93a1 but no longer at
03080b795aa3496ed62d4a0697c9f4767e7ca7e5 of luajit, which is surprising since
that commit doesn't look super relevant. _Also_ surprisingly it does seem to
work in the context of the neovim code generation, though, so that might be
good enough...)
Also, some of the code generation (using mpack and tables) still relies on
stable table ordering. This should eventually be fixed, but as a workaround
we use the luajit-with-stable-string-ids for those generators as well.
Fixes #207841
2022-12-28 13:04:18 +00:00
|
|
|
disallowedReferences = [ stdenv.cc ] ++ lib.optional (lua != codegenLua) codegenLua;
|
2019-01-25 21:20:12 +00:00
|
|
|
|
2016-06-12 02:11:31 +00:00
|
|
|
cmakeFlags = [
|
2022-03-29 02:48:19 +00:00
|
|
|
# Don't use downloaded dependencies. At the end of the configurePhase one
|
|
|
|
# can spot that cmake says this option was "not used by the project".
|
|
|
|
# That's because all dependencies were found and
|
|
|
|
# third-party/CMakeLists.txt is not read at all.
|
2020-05-10 19:13:02 +00:00
|
|
|
"-DUSE_BUNDLED=OFF"
|
2019-02-05 15:00:19 +00:00
|
|
|
]
|
2022-12-07 01:09:19 +00:00
|
|
|
++ lib.optional (!lua.pkgs.isLuaJIT) "-DPREFER_LUA=ON"
|
2019-02-05 15:00:19 +00:00
|
|
|
;
|
2015-06-11 08:48:29 +00:00
|
|
|
|
neovim: make the build reproducible
This introduces a patch that improves binary reproducibility since changes in
ordering of the generated code indeed cause changes in the compiled code.
Additionally, since neovim embeds luajit-compiled bytecode into the nvim binary,
we are impacted by https://github.com/LuaJIT/LuaJIT/issues/626 . It is possible
to switch to lua 5.1, but that'd be a regression (luajit has much better
performance and some plugins depend on it, like for example Noice and Lazy).
Disabling `COMPILE_LUA` at build time would cause a runtime penalty each time
neovim starts. Instead, we run luagit with those security settings disabled for
the build-time code generation.
(Note to self: for a minimized testcase this seemed to help at
975ec13f5d5aefcac1dbb15fa867e660e07c93a1 but no longer at
03080b795aa3496ed62d4a0697c9f4767e7ca7e5 of luajit, which is surprising since
that commit doesn't look super relevant. _Also_ surprisingly it does seem to
work in the context of the neovim code generation, though, so that might be
good enough...)
Also, some of the code generation (using mpack and tables) still relies on
stable table ordering. This should eventually be fixed, but as a workaround
we use the luajit-with-stable-string-ids for those generators as well.
Fixes #207841
2022-12-28 13:04:18 +00:00
|
|
|
preConfigure = lib.optionalString lua.pkgs.isLuaJIT ''
|
|
|
|
cmakeFlagsArray+=(
|
|
|
|
"-DLUAC_PRG=${codegenLua}/bin/luajit -b -s %s -"
|
|
|
|
"-DLUA_GEN_PRG=${codegenLua}/bin/luajit"
|
|
|
|
)
|
|
|
|
'' + lib.optionalString stdenv.isDarwin ''
|
2015-10-22 20:46:18 +00:00
|
|
|
substituteInPlace src/nvim/CMakeLists.txt --replace " util" ""
|
2015-06-10 08:05:59 +00:00
|
|
|
'';
|
|
|
|
|
2019-02-05 15:00:19 +00:00
|
|
|
shellHook=''
|
|
|
|
export VIMRUNTIME=$PWD/runtime
|
|
|
|
'';
|
|
|
|
|
2022-12-07 01:09:19 +00:00
|
|
|
meta = with lib; {
|
2015-06-11 08:48:29 +00:00
|
|
|
description = "Vim text editor fork focused on extensibility and agility";
|
|
|
|
longDescription = ''
|
|
|
|
Neovim is a project that seeks to aggressively refactor Vim in order to:
|
|
|
|
- Simplify maintenance and encourage contributions
|
|
|
|
- Split the work between multiple developers
|
|
|
|
- Enable the implementation of new/modern user interfaces without any
|
|
|
|
modifications to the core source
|
|
|
|
- Improve extensibility with a new plugin architecture
|
|
|
|
'';
|
2020-04-01 01:11:51 +00:00
|
|
|
homepage = "https://www.neovim.io";
|
2021-07-10 18:28:51 +00:00
|
|
|
mainProgram = "nvim";
|
2015-06-11 08:48:29 +00:00
|
|
|
# "Contributions committed before b17d96 by authors who did not sign the
|
|
|
|
# Contributor License Agreement (CLA) remain under the Vim license.
|
|
|
|
# Contributions committed after b17d96 are licensed under Apache 2.0 unless
|
|
|
|
# those contributions were copied from Vim (identified in the commit logs
|
|
|
|
# by the vim-patch token). See LICENSE for details."
|
|
|
|
license = with licenses; [ asl20 vim ];
|
2022-06-19 10:07:43 +00:00
|
|
|
maintainers = with maintainers; [ manveru rvolosatovs ];
|
2015-06-11 08:48:29 +00:00
|
|
|
platforms = platforms.unix;
|
|
|
|
};
|
2019-02-05 15:00:19 +00:00
|
|
|
}
|