Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

neovim: improve lpeg patch for darwin #351423

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
334 changes: 201 additions & 133 deletions pkgs/by-name/ne/neovim-unwrapped/package.nix
Original file line number Diff line number Diff line change
@@ -1,70 +1,101 @@
{ lib, stdenv, fetchFromGitHub, removeReferencesTo, cmake, gettext, msgpack-c, libiconv
, libuv, lua, pkg-config
, unibilium
, libvterm-neovim
, tree-sitter
, fetchurl
, buildPackages
, treesitter-parsers ? import ./treesitter-parsers.nix { inherit fetchurl; }
, CoreServices
, fixDarwinDylibNames
, glibcLocales ? null, procps ? null

# now defaults to false because some tests can be flaky (clipboard etc), see
# also: https://github.com/neovim/neovim/issues/16233
, nodejs ? null, fish ? null, python3 ? null
{
lib,
stdenv,
fetchFromGitHub,
removeReferencesTo,
cmake,
gettext,
msgpack-c,
libiconv,
libuv,
lua,
pkg-config,
unibilium,
libvterm-neovim,
tree-sitter,
fetchurl,
buildPackages,
treesitter-parsers ? import ./treesitter-parsers.nix { inherit fetchurl; },
CoreServices,
fixDarwinDylibNames,
glibcLocales ? null,
procps ? null,

# now defaults to false because some tests can be flaky (clipboard etc), see
# also: https://github.com/neovim/neovim/issues/16233
nodejs ? null,
fish ? null,
python3 ? null,
}:
stdenv.mkDerivation (finalAttrs:
stdenv.mkDerivation (
finalAttrs:
let
nvim-lpeg-dylib = luapkgs: if stdenv.hostPlatform.isDarwin
then (luapkgs.lpeg.overrideAttrs (oa: {
preConfigure = ''
# neovim wants clang .dylib
sed -i makefile -e "s/CC = gcc/CC = clang/"
sed -i makefile -e "s/-bundle/-dynamiclib/"
'';
preBuild = ''
# there seems to be implicit calls to Makefile from luarocks, we need to
# add a stage to build our dylib
make macosx
mkdir -p $out/lib
mv lpeg.so $out/lib/lpeg.dylib
'';
nativeBuildInputs =
oa.nativeBuildInputs
++ (
lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames
);
}))
else luapkgs.lpeg;
requiredLuaPkgs = ps: (with ps; [
(nvim-lpeg-dylib ps)
luabitop
mpack
] ++ lib.optionals finalAttrs.finalPackage.doCheck [
luv
coxpcall
busted
luafilesystem
penlight
inspect
]
);
neovimLuaEnv = lua.withPackages requiredLuaPkgs;
neovimLuaEnvOnBuild = lua.luaOnBuild.withPackages requiredLuaPkgs;
codegenLua =
if lua.luaOnBuild.pkgs.isLuaJIT
then
let deterministicLuajit =
lua.luaOnBuild.override {
nvim-lpeg-dylib =
luapkgs:
if stdenv.hostPlatform.isDarwin then
let
luaLibDir = "$out/lib/lua/${lib.versions.majorMinor luapkgs.lua.luaversion}";
in
(luapkgs.lpeg.overrideAttrs (oa: {
preConfigure = ''
# neovim wants clang .dylib
substituteInPlace Makefile \
--replace-fail "CC = gcc" "CC = clang" \
--replace-fail "-bundle" "-dynamiclib" \
--replace-fail "lpeg.so" "lpeg.dylib"
'';
preBuild = ''
# there seems to be implicit calls to Makefile from luarocks, we need to
# add a stage to build our dylib
make macosx
mkdir -p ${luaLibDir}
mv lpeg.dylib ${luaLibDir}/lpeg.dylib
'';
postInstall = ''
rm -f ${luaLibDir}/lpeg.so
'';
nativeBuildInputs =
oa.nativeBuildInputs ++ (lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames);
}))
else
luapkgs.lpeg;
requiredLuaPkgs =
ps:
(
with ps;
[
(nvim-lpeg-dylib ps)
luabitop
mpack
]
++ lib.optionals finalAttrs.finalPackage.doCheck [
luv
coxpcall
busted
luafilesystem
penlight
inspect
]
);
neovimLuaEnv = lua.withPackages requiredLuaPkgs;
neovimLuaEnvOnBuild = lua.luaOnBuild.withPackages requiredLuaPkgs;
codegenLua =
if lua.luaOnBuild.pkgs.isLuaJIT then
let
deterministicLuajit = lua.luaOnBuild.override {
deterministicStringIds = true;
self = deterministicLuajit;
};
in deterministicLuajit.withPackages(ps: [ ps.mpack (nvim-lpeg-dylib ps) ])
else lua.luaOnBuild;

in
deterministicLuajit.withPackages (ps: [
ps.mpack
(nvim-lpeg-dylib ps)
])
else
lua.luaOnBuild;

in {
in
{
pname = "neovim-unwrapped";
version = "0.10.2";

Expand All @@ -87,26 +118,42 @@ in {
dontFixCmake = true;

inherit lua;
treesitter-parsers = treesitter-parsers //
{ markdown = treesitter-parsers.markdown // { location = "tree-sitter-markdown"; }; } //
{ markdown_inline = treesitter-parsers.markdown // { language = "markdown_inline"; location = "tree-sitter-markdown-inline"; }; }
;

buildInputs = [
libuv
libvterm-neovim
# 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
msgpack-c
neovimLuaEnv
tree-sitter
unibilium
] ++ lib.optionals stdenv.hostPlatform.isDarwin [ libiconv CoreServices ]
++ lib.optionals finalAttrs.finalPackage.doCheck [ glibcLocales procps ]
;
treesitter-parsers =
treesitter-parsers
// {
markdown = treesitter-parsers.markdown // {
location = "tree-sitter-markdown";
};
}
// {
markdown_inline = treesitter-parsers.markdown // {
language = "markdown_inline";
location = "tree-sitter-markdown-inline";
};
};

buildInputs =
[
libuv
libvterm-neovim
# 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
msgpack-c
neovimLuaEnv
tree-sitter
unibilium
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
libiconv
CoreServices
]
++ lib.optionals finalAttrs.finalPackage.doCheck [
glibcLocales
procps
];

doCheck = false;

Expand All @@ -126,18 +173,23 @@ in {
];

# extra programs test via `make functionaltest`
nativeCheckInputs = let
pyEnv = python3.withPackages(ps: with ps; [ pynvim msgpack ]);
in [
fish
nodejs
pyEnv # for src/clint.py
];
nativeCheckInputs =
let
pyEnv = python3.withPackages (
ps: with ps; [
pynvim
msgpack
]
);
in
[
fish
nodejs
pyEnv # for src/clint.py
];

# nvim --version output retains compilation flags and references to build tools
postPatch = ''
substituteInPlace src/nvim/version.c --replace NVIM_VERSION_CFLAGS "";
'' + lib.optionalString (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
postPatch = lib.optionalString (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
sed -i runtime/CMakeLists.txt \
-e "s|\".*/bin/nvim|\${stdenv.hostPlatform.emulator buildPackages} &|g"
sed -i src/nvim/po/CMakeLists.txt \
Expand All @@ -147,45 +199,54 @@ in {
find "$out" -type f -exec remove-references-to -t ${stdenv.cc} '{}' +
'';
# check that the above patching actually works
outputChecks = let
disallowedRequisites = [ stdenv.cc ] ++ lib.optional (lua != codegenLua) codegenLua;
in {
out = { inherit disallowedRequisites; };
debug = { inherit disallowedRequisites; };
};
outputChecks =
let
disallowedRequisites = [ stdenv.cc ] ++ lib.optional (lua != codegenLua) codegenLua;
in
{
out = {
inherit disallowedRequisites;
};
debug = {
inherit disallowedRequisites;
};
};

cmakeFlags = [
# 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.
"-DUSE_BUNDLED=OFF"
]
++ lib.optional (!lua.pkgs.isLuaJIT) "-DPREFER_LUA=ON"
++ lib.optionals lua.pkgs.isLuaJIT [
"-DLUAC_PRG=${codegenLua}/bin/luajit -b -s %s -"
"-DLUA_GEN_PRG=${codegenLua}/bin/luajit"
"-DLUA_PRG=${neovimLuaEnvOnBuild}/bin/luajit"
];
cmakeFlags =
[
# 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.
"-DUSE_BUNDLED=OFF"
]
++ lib.optional (!lua.pkgs.isLuaJIT) "-DPREFER_LUA=ON"
++ lib.optionals lua.pkgs.isLuaJIT [
"-DLUAC_PRG=${codegenLua}/bin/luajit -b -s %s -"
"-DLUA_GEN_PRG=${codegenLua}/bin/luajit"
"-DLUA_PRG=${neovimLuaEnvOnBuild}/bin/luajit"
];

preConfigure =
''
mkdir -p $out/lib/nvim/parser
''
+ lib.concatStrings (
lib.mapAttrsToList (language: grammar: ''
ln -s \
${
tree-sitter.buildGrammar {
inherit (grammar) src;
version = "neovim-${finalAttrs.version}";
language = grammar.language or language;
location = grammar.location or null;
}
}/parser \
$out/lib/nvim/parser/${language}.so
'') finalAttrs.treesitter-parsers
);

preConfigure = lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace src/nvim/CMakeLists.txt --replace " util" ""
'' + ''
mkdir -p $out/lib/nvim/parser
'' + lib.concatStrings (lib.mapAttrsToList
(language: grammar: ''
ln -s \
${tree-sitter.buildGrammar {
inherit (grammar) src;
version = "neovim-${finalAttrs.version}";
language = grammar.language or language;
location = grammar.location or null;
}}/parser \
$out/lib/nvim/parser/${language}.so
'')
finalAttrs.treesitter-parsers);

shellHook=''
shellHook = ''
export VIMRUNTIME=$PWD/runtime
'';

Expand All @@ -201,15 +262,22 @@ in {
modifications to the core source
- Improve extensibility with a new plugin architecture
'';
homepage = "https://www.neovim.io";
homepage = "https://www.neovim.io";
mainProgram = "nvim";
# "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 lib.licenses; [ asl20 vim ];
maintainers = with lib.maintainers; [ manveru rvolosatovs ];
platforms = lib.platforms.unix;
license = with lib.licenses; [
asl20
vim
];
maintainers = with lib.maintainers; [
manveru
rvolosatovs
];
platforms = lib.platforms.unix;
};
})
}
)