pytrainer: unpin python 3.10
[NixPkgs.git] / pkgs / applications / editors / vim / macvim.nix
blob2005eef7b6fe137b53cc8845249225f3170db319
1 { lib
2 , stdenv
3 , fetchFromGitHub
4 , runCommand
5 , ncurses
6 , gettext
7 , pkg-config
8 , cscope
9 , ruby_3_2
10 , tcl
11 , perl540
12 , luajit
13 , darwin
14 , libiconv
15 , python3
18 # Try to match MacVim's documented script interface compatibility
19 let
20   perl = perl540;
21   # Ruby 3.2
22   ruby = ruby_3_2;
24   # Building requires a few system tools to be in PATH.
25   # Some of these we could patch into the relevant source files (such as xcodebuild and
26   # qlmanage) but some are used by Xcode itself and we have no choice but to put them in PATH.
27   # Symlinking them in this way is better than just putting all of /usr/bin in there.
28   buildSymlinks = runCommand "macvim-build-symlinks" {} ''
29     mkdir -p $out/bin
30     ln -s /usr/bin/xcrun /usr/bin/xcodebuild /usr/bin/tiffutil /usr/bin/qlmanage $out/bin
31   '';
34 stdenv.mkDerivation (finalAttrs: {
35   pname = "macvim";
37   version = "179";
39   src = fetchFromGitHub {
40     owner = "macvim-dev";
41     repo = "macvim";
42     rev = "release-${finalAttrs.version}";
43     hash = "sha256-L9LVXyeA09aMtNf+b/Oo+eLpeVEKTD1/oNWCiFn5FbU=";
44   };
46   enableParallelBuilding = true;
48   nativeBuildInputs = [ pkg-config buildSymlinks ];
49   buildInputs = [
50     gettext ncurses cscope luajit ruby tcl perl python3
51   ];
53   patches = [ ./macvim.patch ];
55   configureFlags = [
56     "--enable-cscope"
57     "--enable-fail-if-missing"
58     "--with-features=huge"
59     "--enable-gui=macvim"
60     "--enable-multibyte"
61     "--enable-nls"
62     "--enable-luainterp=dynamic"
63     "--enable-python3interp=dynamic"
64     "--enable-perlinterp=dynamic"
65     "--enable-rubyinterp=dynamic"
66     "--enable-tclinterp=yes"
67     "--without-local-dir"
68     "--with-luajit"
69     "--with-lua-prefix=${luajit}"
70     "--with-python3-command=${python3}/bin/python3"
71     "--with-ruby-command=${ruby}/bin/ruby"
72     "--with-tclsh=${tcl}/bin/tclsh"
73     "--with-tlib=ncurses"
74     "--with-compiledby=Nix"
75     "--disable-sparkle"
76   ];
78   # Remove references to Sparkle.framework from the project.
79   # It's unused (we disabled it with --disable-sparkle) and this avoids
80   # copying the unnecessary several-megabyte framework into the result.
81   postPatch = ''
82     echo "Patching file src/MacVim/MacVim.xcodeproj/project.pbxproj"
83     sed -e '/Sparkle\.framework/d' -i src/MacVim/MacVim.xcodeproj/project.pbxproj
84   '';
86   # This is unfortunate, but we need to use the same compiler as Xcode, but Xcode doesn't provide a
87   # way to configure the compiler. We also need to pull in lib/include paths for some of our build
88   # inputs since we don't have cc-wrapper to do that for us.
89   preConfigure =
90     let
91       # ideally we'd recurse, but we don't need that right now
92       inputs = [ ncurses ] ++ perl.propagatedBuildInputs;
93       ldflags = map (drv: "-L${lib.getLib drv}/lib") inputs;
94       cppflags = map (drv: "-isystem ${lib.getDev drv}/include") inputs;
95     in
96     ''
97       unset DEVELOPER_DIR # Use the system Xcode not the nixpkgs SDK.
99       CC=/usr/bin/clang
101       DEV_DIR=$(/usr/bin/xcode-select -print-path)/Platforms/MacOSX.platform/Developer
102       configureFlagsArray+=(
103         --with-developer-dir="$DEV_DIR"
104         LDFLAGS=${lib.escapeShellArg ldflags}
105         CPPFLAGS=${lib.escapeShellArg cppflags}
106         CFLAGS="-Wno-error=implicit-function-declaration"
107       )
108     ''
109     # For some reason having LD defined causes PSMTabBarControl to fail at link-time as it
110     # passes arguments to ld that it meant for clang.
111     + ''
112       unset LD
113     ''
114     # When building with nix-daemon, we need to pass -derivedDataPath or else it tries to use
115     # a folder rooted in /var/empty and fails. Unfortunately we can't just pass -derivedDataPath
116     # by itself as this flag requires the use of -scheme or -xctestrun (not sure why), but MacVim
117     # by default just runs `xcodebuild -project src/MacVim/MacVim.xcodeproj`, relying on the default
118     # behavior to build the first target in the project. Experimentally, there seems to be a scheme
119     # called MacVim, so we'll explicitly select that. We also need to specify the configuration too
120     # as the scheme seems to have the wrong default.
121     + ''
122       configureFlagsArray+=(
123         XCODEFLAGS="-scheme MacVim -derivedDataPath $NIX_BUILD_TOP/derivedData"
124         --with-xcodecfg="Release"
125       )
126     ''
127   ;
129   # Because we're building with system clang, this means we're building against Xcode's SDK and
130   # linking against system libraries. The configure script is picking up Nix Libsystem (via ruby)
131   # so we need to patch that out or we'll get linker issues. The MacVim binary built by Xcode links
132   # against the system anyway so it doesn't really matter that the Vim binary will too. If we
133   # decide that matters, we can always patch it back to the Nix libsystem post-build.
134   # It also picks up libiconv, libunwind, and objc4 from Nix. These seem relatively harmless but
135   # let's strip them out too.
136   #
137   # Note: If we do add a post-build install_name_tool patch, we need to add the
138   # "LDFLAGS=-headerpad_max_install_names" flag to configureFlags and either patch it into the
139   # Xcode project or pass it as a flag to xcodebuild as well.
140   postConfigure = ''
141     substituteInPlace src/auto/config.mk \
142       --replace "PERL_CFLAGS${"\t"}=" "PERL_CFLAGS${"\t"}= -I${darwin.libutil}/include" \
143       --replace " -L${stdenv.cc.libc}/lib" "" \
144       --replace " -L${darwin.libobjc}/lib" "" \
145       --replace " -L${darwin.libunwind}/lib" "" \
146       --replace " -L${libiconv}/lib" ""
148     # All the libraries we stripped have -osx- in their name as of this time.
149     # Assert now that this pattern no longer appears in config.mk.
150     ( # scope variable
151       while IFS="" read -r line; do
152         if [[ "$line" == LDFLAGS*-osx-* ]]; then
153           echo "WARNING: src/auto/config.mk contains reference to Nix osx library" >&2
154         fi
155       done <src/auto/config.mk
156     )
158     substituteInPlace src/MacVim/vimrc --subst-var-by CSCOPE ${cscope}/bin/cscope
159   '';
161   # Note that $out/MacVim.app has a misnamed set of binaries in the Contents/bin folder (the V is
162   # capitalized) and is missing a bunch of them. This is why we're grabbing the version from the
163   # build folder.
164   postInstall = ''
165     mkdir -p $out/Applications
166     cp -r src/MacVim/build/Release/MacVim.app $out/Applications
167     rm -rf $out/MacVim.app
169     mkdir -p $out/bin
170     for prog in ex vi {,g,m,r}vi{m,mdiff,ew}; do
171       ln -s $out/Applications/MacVim.app/Contents/bin/mvim $out/bin/$prog
172     done
173     for prog in {,g}vimtutor xxd; do
174       ln -s $out/Applications/MacVim.app/Contents/bin/$prog $out/bin/$prog
175     done
176     ln -s $out/Applications/MacVim.app/Contents/bin/gvimtutor $out/bin/mvimtutor
178     mkdir -p $out/share
179     ln -s $out/Applications/MacVim.app/Contents/man $out/share/man
181     # Fix rpaths
182     exe="$out/Applications/MacVim.app/Contents/MacOS/Vim"
183     libperl=$(dirname $(find ${perl} -name "libperl.dylib"))
184     install_name_tool -add_rpath ${luajit}/lib $exe
185     install_name_tool -add_rpath ${tcl}/lib $exe
186     install_name_tool -add_rpath ${python3}/lib $exe
187     install_name_tool -add_rpath $libperl $exe
188     install_name_tool -add_rpath ${ruby}/lib $exe
190     # Remove manpages from tools we aren't providing
191     find $out/Applications/MacVim.app/Contents/man -name evim.1 -delete
192   '';
194   # We rely on the user's Xcode install to build. It may be located in an arbitrary place, and
195   # it's not clear what system-level components it may require, so for now we'll just allow full
196   # filesystem access. This way the package still can't access the network.
197   sandboxProfile = ''
198     (allow file-read* file-write* process-exec mach-lookup)
199     ; block homebrew dependencies
200     (deny file-read* file-write* process-exec mach-lookup (subpath "/usr/local") (with no-log))
201   '';
203   meta = with lib; {
204     description = "Vim - the text editor - for macOS";
205     homepage = "https://macvim.org/";
206     license = licenses.vim;
207     maintainers = [ ];
208     platforms = platforms.darwin;
209     hydraPlatforms = []; # hydra can't build this as long as we rely on Xcode and sandboxProfile
210   };