
After final improvements to the official formatter implementation,
this commit now performs the first treewide reformat of Nix files using it.
This is part of the implementation of RFC 166.
Only "inactive" files are reformatted, meaning only files that
aren't being touched by any PR with activity in the past 2 months.
This is to avoid conflicts for PRs that might soon be merged.
Later we can do a full treewide reformat to get the rest,
which should not cause as many conflicts.
A CI check has already been running for some time to ensure that new and
already-formatted files are formatted, so the files being reformatted here
should also stay formatted.
This commit was automatically created and can be verified using
nix-build a08b3a4d19
.tar.gz \
--argstr baseRev 78e9caf153f5a339bf1d4c000ff6f0a503a369c8
result/bin/apply-formatting $NIXPKGS_PATH
221 lines
7.8 KiB
Nix
221 lines
7.8 KiB
Nix
{
|
|
lib,
|
|
stdenv,
|
|
fetchFromGitHub,
|
|
runCommand,
|
|
ncurses,
|
|
gettext,
|
|
pkg-config,
|
|
cscope,
|
|
ruby_3_2,
|
|
tcl,
|
|
perl540,
|
|
luajit,
|
|
darwin,
|
|
libiconv,
|
|
python3,
|
|
}:
|
|
|
|
# Try to match MacVim's documented script interface compatibility
|
|
let
|
|
perl = perl540;
|
|
# Ruby 3.2
|
|
ruby = ruby_3_2;
|
|
|
|
# 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
|
|
|
|
stdenv.mkDerivation (finalAttrs: {
|
|
pname = "macvim";
|
|
|
|
version = "179";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "macvim-dev";
|
|
repo = "macvim";
|
|
rev = "release-${finalAttrs.version}";
|
|
hash = "sha256-L9LVXyeA09aMtNf+b/Oo+eLpeVEKTD1/oNWCiFn5FbU=";
|
|
};
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
nativeBuildInputs = [
|
|
pkg-config
|
|
buildSymlinks
|
|
];
|
|
buildInputs = [
|
|
gettext
|
|
ncurses
|
|
cscope
|
|
luajit
|
|
ruby
|
|
tcl
|
|
perl
|
|
python3
|
|
];
|
|
|
|
patches = [ ./macvim.patch ];
|
|
|
|
configureFlags = [
|
|
"--enable-cscope"
|
|
"--enable-fail-if-missing"
|
|
"--with-features=huge"
|
|
"--enable-gui=macvim"
|
|
"--enable-multibyte"
|
|
"--enable-nls"
|
|
"--enable-luainterp=dynamic"
|
|
"--enable-python3interp=dynamic"
|
|
"--enable-perlinterp=dynamic"
|
|
"--enable-rubyinterp=dynamic"
|
|
"--enable-tclinterp=yes"
|
|
"--without-local-dir"
|
|
"--with-luajit"
|
|
"--with-lua-prefix=${luajit}"
|
|
"--with-python3-command=${python3}/bin/python3"
|
|
"--with-ruby-command=${ruby}/bin/ruby"
|
|
"--with-tclsh=${tcl}/bin/tclsh"
|
|
"--with-tlib=ncurses"
|
|
"--with-compiledby=Nix"
|
|
"--disable-sparkle"
|
|
];
|
|
|
|
# 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. We also need to pull in lib/include paths for some of our build
|
|
# inputs since we don't have cc-wrapper to do that for us.
|
|
preConfigure =
|
|
let
|
|
# ideally we'd recurse, but we don't need that right now
|
|
inputs = [ ncurses ] ++ perl.propagatedBuildInputs;
|
|
ldflags = map (drv: "-L${lib.getLib drv}/lib") inputs;
|
|
cppflags = map (drv: "-isystem ${lib.getDev drv}/include") inputs;
|
|
in
|
|
''
|
|
unset DEVELOPER_DIR # Use the system Xcode not the nixpkgs SDK.
|
|
|
|
CC=/usr/bin/clang
|
|
|
|
DEV_DIR=$(/usr/bin/xcode-select -print-path)/Platforms/MacOSX.platform/Developer
|
|
configureFlagsArray+=(
|
|
--with-developer-dir="$DEV_DIR"
|
|
LDFLAGS=${lib.escapeShellArg ldflags}
|
|
CPPFLAGS=${lib.escapeShellArg cppflags}
|
|
CFLAGS="-Wno-error=implicit-function-declaration"
|
|
)
|
|
''
|
|
# 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
|
|
''
|
|
# When building with nix-daemon, we need to pass -derivedDataPath or else it tries to use
|
|
# a folder rooted in /var/empty and fails. Unfortunately we can't just pass -derivedDataPath
|
|
# by itself as this flag requires the use of -scheme or -xctestrun (not sure why), but MacVim
|
|
# by default just runs `xcodebuild -project src/MacVim/MacVim.xcodeproj`, relying on the default
|
|
# behavior to build the first target in the project. Experimentally, there seems to be a scheme
|
|
# called MacVim, so we'll explicitly select that. We also need to specify the configuration too
|
|
# as the scheme seems to have the wrong default.
|
|
+ ''
|
|
configureFlagsArray+=(
|
|
XCODEFLAGS="-scheme MacVim -derivedDataPath $NIX_BUILD_TOP/derivedData"
|
|
--with-xcodecfg="Release"
|
|
)
|
|
'';
|
|
|
|
# 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.
|
|
postConfigure = ''
|
|
substituteInPlace src/auto/config.mk \
|
|
--replace " -L${stdenv.cc.libc}/lib" "" \
|
|
--replace " -L${darwin.libobjc}/lib" "" \
|
|
--replace " -L${darwin.libunwind}/lib" "" \
|
|
--replace " -L${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
|
|
'';
|
|
|
|
# Note that $out/MacVim.app has a misnamed set of binaries in the Contents/bin folder (the V is
|
|
# capitalized) and is missing a bunch of them. This is why we're grabbing the version from the
|
|
# build folder.
|
|
postInstall = ''
|
|
mkdir -p $out/Applications
|
|
cp -r src/MacVim/build/Release/MacVim.app $out/Applications
|
|
rm -rf $out/MacVim.app
|
|
|
|
mkdir -p $out/bin
|
|
for prog in ex vi {,g,m,r}vi{m,mdiff,ew}; do
|
|
ln -s $out/Applications/MacVim.app/Contents/bin/mvim $out/bin/$prog
|
|
done
|
|
for prog in {,g}vimtutor xxd; do
|
|
ln -s $out/Applications/MacVim.app/Contents/bin/$prog $out/bin/$prog
|
|
done
|
|
ln -s $out/Applications/MacVim.app/Contents/bin/gvimtutor $out/bin/mvimtutor
|
|
|
|
mkdir -p $out/share
|
|
ln -s $out/Applications/MacVim.app/Contents/man $out/share/man
|
|
|
|
# Fix rpaths
|
|
exe="$out/Applications/MacVim.app/Contents/MacOS/Vim"
|
|
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 ${python3}/lib $exe
|
|
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/Applications/MacVim.app/Contents/man -name evim.1 -delete
|
|
'';
|
|
|
|
# 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))
|
|
'';
|
|
|
|
meta = with lib; {
|
|
description = "Vim - the text editor - for macOS";
|
|
homepage = "https://macvim.org/";
|
|
license = licenses.vim;
|
|
maintainers = [ ];
|
|
platforms = platforms.darwin;
|
|
hydraPlatforms = [ ]; # hydra can't build this as long as we rely on Xcode and sandboxProfile
|
|
};
|
|
})
|