nixpkgs/pkgs/applications/editors/vim/macvim.nix

174 lines
6.2 KiB
Nix
Raw Normal View History

{ stdenv, fetchFromGitHub, runCommand, ncurses, gettext
, pkgconfig, cscope, ruby, tcl, perl, luajit
2016-05-07 00:50:52 +00:00
, darwin
, usePython27 ? false
, python27 ? null, python37 ? null
2014-06-06 21:45:22 +00:00
}:
let
python = if usePython27
then { pkg = python27; name = "python"; }
else { pkg = python37; name = "python3"; };
in
assert python.pkg != null;
let
# Building requires a few system tools to be in PATH.
# Some of these we could patch into the relevant source files (such as xcodebuild and
# qlmanage) but some are used by Xcode itself and we have no choice but to put them in PATH.
# Symlinking them in this way is better than just putting all of /usr/bin in there.
buildSymlinks = runCommand "macvim-build-symlinks" {} ''
mkdir -p $out/bin
ln -s /usr/bin/xcrun /usr/bin/xcodebuild /usr/bin/tiffutil /usr/bin/qlmanage $out/bin
'';
in
2019-08-13 21:52:01 +00:00
stdenv.mkDerivation {
pname = "macvim";
2014-06-06 21:45:22 +00:00
2020-09-28 22:22:17 +00:00
version = "8.2.1719";
2014-06-06 21:45:22 +00:00
src = fetchFromGitHub {
owner = "macvim-dev";
repo = "macvim";
2020-09-28 22:22:17 +00:00
rev = "snapshot-166";
sha256 = "1p51q59l1dl5lnf1ms960lm8zfg39p8xq0pdjw6wdyypjj3r8v3v";
2014-06-06 21:45:22 +00:00
};
enableParallelBuilding = true;
nativeBuildInputs = [ pkgconfig buildSymlinks ];
2014-06-06 21:45:22 +00:00
buildInputs = [
gettext ncurses cscope luajit ruby tcl perl python.pkg
2014-06-06 21:45:22 +00:00
];
2020-03-04 02:02:27 +00:00
patches = [ ./macvim.patch ];
2014-06-06 21:45:22 +00:00
configureFlags = [
"--enable-cscope"
2014-06-06 21:45:22 +00:00
"--enable-fail-if-missing"
"--with-features=huge"
"--enable-gui=macvim"
"--enable-multibyte"
"--enable-nls"
"--enable-luainterp=dynamic"
"--enable-${python.name}interp=dynamic"
2014-06-06 21:45:22 +00:00
"--enable-perlinterp=dynamic"
"--enable-rubyinterp=dynamic"
"--enable-tclinterp=yes"
2014-10-18 05:15:45 +00:00
"--without-local-dir"
2014-06-06 21:45:22 +00:00
"--with-luajit"
"--with-lua-prefix=${luajit}"
"--with-${python.name}-command=${python.pkg}/bin/${python.name}"
2014-06-06 21:45:22 +00:00
"--with-ruby-command=${ruby}/bin/ruby"
"--with-tclsh=${tcl}/bin/tclsh"
"--with-tlib=ncurses"
"--with-compiledby=Nix"
2020-03-04 02:02:27 +00:00
"--disable-sparkle"
2014-06-06 21:45:22 +00:00
];
2020-03-04 02:02:27 +00:00
# Remove references to Sparkle.framework from the project.
# It's unused (we disabled it with --disable-sparkle) and this avoids
# copying the unnecessary several-megabyte framework into the result.
postPatch = ''
echo "Patching file src/MacVim/MacVim.xcodeproj/project.pbxproj"
sed -e '/Sparkle\.framework/d' -i src/MacVim/MacVim.xcodeproj/project.pbxproj
'';
# This is unfortunate, but we need to use the same compiler as Xcode,
# but Xcode doesn't provide a way to configure the compiler.
2014-06-06 21:45:22 +00:00
preConfigure = ''
CC=/usr/bin/clang
2014-06-06 21:45:22 +00:00
DEV_DIR=$(/usr/bin/xcode-select -print-path)/Platforms/MacOSX.platform/Developer
configureFlagsArray+=(
--with-developer-dir="$DEV_DIR"
LDFLAGS="-L${ncurses}/lib"
CPPFLAGS="-isystem ${ncurses.dev}/include"
CFLAGS="-Wno-error=implicit-function-declaration"
2014-06-06 21:45:22 +00:00
)
''
# For some reason having LD defined causes PSMTabBarControl to fail at link-time as it
# passes arguments to ld that it meant for clang.
+ ''
unset LD
''
;
2014-06-06 21:45:22 +00:00
macvim: Clean up hybrid compilation environment MacVim compiles the Vim part using `/usr/bin/clang` and the GUI part using Xcode. The Xcode portion always uses Xcode's own SDK and we have no workable alternative. The Vim portion so far has been compiling using a hybrid compilation environment, where it uses the SDK for most stuff but picks up a bunch of library linker paths (including libSystem) by virtue of Ruby's LDFLAGS. This hybrid compilation environment meant that if the SDK headers referenced a symbol that the library itself didn't have, this could produce link errors. Previously we attempted to fix this by synthesizing an include path that contained just the one header from Nix's Libsystem that referenced the missing symbol, to get rid of the reference and allow linking to work again, but this was very hacky and runs the risk of future Xcode SDK changes producing the same errors with different headers, or of future SDK versions expecting the intercepted header to contain a definition that Nix's doesn't. This new approach is to just clean up the compilation environment such that the Vim portion is compiling against the Xcode SDK as well, by sanitizing the LDFLAGS produced by the configure script so it stops referencing Nix's versions of OS libraries. This means the resulting Vim binary no longer depends at runtime on Nix for anything except the scripting language support, but that's how it's been for the MacVim binary all along anyway, and this approach should keep us insulated against future Xcode SDK changes.
2020-04-19 03:35:04 +00:00
# Because we're building with system clang, this means we're building against Xcode's SDK and
# linking against system libraries. The configure script is picking up Nix Libsystem (via ruby)
# so we need to patch that out or we'll get linker issues. The MacVim binary built by Xcode links
# against the system anyway so it doesn't really matter that the Vim binary will too. If we
# decide that matters, we can always patch it back to the Nix libsystem post-build.
# It also picks up libiconv, libunwind, and objc4 from Nix. These seem relatively harmless but
# let's strip them out too.
#
# Note: If we do add a post-build install_name_tool patch, we need to add the
# "LDFLAGS=-headerpad_max_install_names" flag to configureFlags and either patch it into the
# Xcode project or pass it as a flag to xcodebuild as well.
2016-05-07 00:50:52 +00:00
postConfigure = ''
macvim: Clean up hybrid compilation environment MacVim compiles the Vim part using `/usr/bin/clang` and the GUI part using Xcode. The Xcode portion always uses Xcode's own SDK and we have no workable alternative. The Vim portion so far has been compiling using a hybrid compilation environment, where it uses the SDK for most stuff but picks up a bunch of library linker paths (including libSystem) by virtue of Ruby's LDFLAGS. This hybrid compilation environment meant that if the SDK headers referenced a symbol that the library itself didn't have, this could produce link errors. Previously we attempted to fix this by synthesizing an include path that contained just the one header from Nix's Libsystem that referenced the missing symbol, to get rid of the reference and allow linking to work again, but this was very hacky and runs the risk of future Xcode SDK changes producing the same errors with different headers, or of future SDK versions expecting the intercepted header to contain a definition that Nix's doesn't. This new approach is to just clean up the compilation environment such that the Vim portion is compiling against the Xcode SDK as well, by sanitizing the LDFLAGS produced by the configure script so it stops referencing Nix's versions of OS libraries. This means the resulting Vim binary no longer depends at runtime on Nix for anything except the scripting language support, but that's how it's been for the MacVim binary all along anyway, and this approach should keep us insulated against future Xcode SDK changes.
2020-04-19 03:35:04 +00:00
substituteInPlace src/auto/config.mk \
--replace "PERL_CFLAGS =" "PERL_CFLAGS = -I${darwin.libutil}/include" \
--replace " -L${stdenv.cc.libc}/lib" "" \
--replace " -L${darwin.libobjc}/lib" "" \
--replace " -L${darwin.libunwind}/lib" "" \
--replace " -L${darwin.libiconv}/lib" ""
# All the libraries we stripped have -osx- in their name as of this time.
# Assert now that this pattern no longer appears in config.mk.
( # scope variable
while IFS="" read -r line; do
if [[ "$line" == LDFLAGS*-osx-* ]]; then
echo "WARNING: src/auto/config.mk contains reference to Nix osx library" >&2
fi
done <src/auto/config.mk
)
substituteInPlace src/MacVim/vimrc --subst-var-by CSCOPE ${cscope}/bin/cscope
2016-05-07 00:50:52 +00:00
'';
2014-06-06 21:45:22 +00:00
postInstall = ''
mkdir -p $out/Applications
cp -r src/MacVim/build/Release/MacVim.app $out/Applications
rm -rf $out/MacVim.app
2014-06-06 21:45:22 +00:00
rm $out/bin/*
2014-06-06 21:45:22 +00:00
cp src/vimtutor $out/bin
for prog in mvim ex vi vim vimdiff view rvim rvimdiff rview; do
ln -s $out/Applications/MacVim.app/Contents/bin/mvim $out/bin/$prog
2014-06-06 21:45:22 +00:00
done
# Fix rpaths
exe="$out/Applications/MacVim.app/Contents/MacOS/Vim"
2014-06-06 21:45:22 +00:00
libperl=$(dirname $(find ${perl} -name "libperl.dylib"))
install_name_tool -add_rpath ${luajit}/lib $exe
install_name_tool -add_rpath ${tcl}/lib $exe
install_name_tool -add_rpath ${python.pkg}/lib $exe
2014-06-06 21:45:22 +00:00
install_name_tool -add_rpath $libperl $exe
install_name_tool -add_rpath ${ruby}/lib $exe
# Remove manpages from tools we aren't providing
find $out/share/man \( -name eVim.1 -or -name xxd.1 \) -delete
2014-06-06 21:45:22 +00:00
'';
# We rely on the user's Xcode install to build. It may be located in an arbitrary place, and
# it's not clear what system-level components it may require, so for now we'll just allow full
# filesystem access. This way the package still can't access the network.
sandboxProfile = ''
(allow file-read* file-write* process-exec mach-lookup)
; block homebrew dependencies
(deny file-read* file-write* process-exec mach-lookup (subpath "/usr/local") (with no-log))
'';
2014-06-06 21:45:22 +00:00
meta = with stdenv.lib; {
description = "Vim - the text editor - for macOS";
homepage = "https://github.com/macvim-dev/macvim";
license = licenses.vim;
maintainers = with maintainers; [ cstrahan lilyball ];
2014-06-06 21:45:22 +00:00
platforms = platforms.darwin;
2019-10-19 07:19:46 +00:00
hydraPlatforms = []; # hydra can't build this as long as we rely on Xcode and sandboxProfile
2014-06-06 21:45:22 +00:00
};
}