# Copyright 1999-2013 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # Authors: # Jim Ramsay # Ryan Phillips # Seemant Kulleen # Aron Griffis # Ciaran McCreesh # Mike Kelly # This eclass handles vim, gvim and vim-core. # gvim's GUI preference order is as follows: # aqua CARBON (not tested) # -aqua gtk gnome GNOME2 # -aqua gtk -gnome GTK2 # -aqua -gtk motif MOTIF # -aqua -gtk -motif neXt NEXTAW # -aqua -gtk -motif -neXt ATHENA # Check for EAPI functions we need: case "${EAPI:-0}" in 0|1) die "vim.eclass no longer supports EAPI 0 or 1" ;; 2|3) ;; 5) HAS_PYTHON_R1=1 ;; *) die "Unknown EAPI ${EAPI}" ;; esac if [[ ${PN} != "vim-core" ]] ; then if [[ ${HAS_PYTHON_R1} ]]; then PYTHON_REQ_USE=threads inherit python-single-r1 else # vim supports python-2 only PYTHON_DEPEND="python? 2" PYTHON_USE_WITH_OPT="python" PYTHON_USE_WITH="threads" inherit python fi fi inherit eutils vim-doc flag-o-matic versionator fdo-mime bash-completion-r1 prefix if [[ ${PV} == 9999* ]] ; then inherit mercurial EHG_REPO_URI="https://vim.googlecode.com/hg/" EHG_PROJECT="vim" fi HOMEPAGE="http://www.vim.org/" SLOT="0" LICENSE="vim" IUSE="nls acl" EXPORT_FUNCTIONS pkg_setup src_prepare src_compile src_configure \ src_install src_test pkg_postinst pkg_postrm DEPEND="${DEPEND} >=app-eselect/eselect-vi-1.1 sys-apps/gawk >=sys-apps/sed-4 sys-devel/autoconf >=sys-libs/ncurses-5.2-r2 nls? ( virtual/libintl )" RDEPEND="${RDEPEND} >=app-eselect/eselect-vi-1.1 >=sys-libs/ncurses-5.2-r2 nls? ( virtual/libintl )" if [[ ${PN} == "vim-core" ]] ; then IUSE="${IUSE} livecd" PDEPEND="!livecd? ( app-vim/gentoo-syntax )" else IUSE="${IUSE} cscope debug gpm perl python ruby" if [[ ${HAS_PYTHON_R1} ]]; then DEPEND="${DEPEND} python? ( ${PYTHON_DEPS} )" RDEPEND="${RDEPEND} python? ( ${PYTHON_DEPS} )" REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )" fi DEPEND="${DEPEND} cscope? ( dev-util/cscope ) gpm? ( >=sys-libs/gpm-1.19.3 ) perl? ( dev-lang/perl ) acl? ( kernel_linux? ( sys-apps/acl ) ) ruby? ( || ( dev-lang/ruby:1.9 dev-lang/ruby:1.8 ) )" RDEPEND="${RDEPEND} cscope? ( dev-util/cscope ) gpm? ( >=sys-libs/gpm-1.19.3 ) perl? ( dev-lang/perl ) acl? ( kernel_linux? ( sys-apps/acl ) ) ruby? ( || ( dev-lang/ruby:1.9 dev-lang/ruby:1.8 ) ) !"/dev/stderr"} patchnum = $3 printf "%s:", patchnum >"/dev/stderr" } $1=="***" && $(NF)!="****" { # First line of a patch; suppress printing firstlines = $0 next } $1=="---" && $(NF)!="----" { # Second line of a patch; try to open the file to see # if it exists. thisfile = $2 if (!seen[thisfile] && (getline tryme < thisfile) == -1) { # Check if it will be created firstlines = firstlines "\n" $0 getline firstlines = firstlines "\n" $0 getline if ($0 != "*** 0 ****") { # Non-existent and not created, stop printing printing = 0 printf " (%s)", thisfile >"/dev/stderr" next } } # Close the file to avoid leakage, bug 205037 close(thisfile) # Print the previous lines and start printing print firstlines printing = 1 printf " %s", thisfile >"/dev/stderr" # Remember that we have seen this file seen[thisfile] = 1 } printing { print } END { if (patchnum) {printf "\n" >"/dev/stderr"} } ' > ${p} || die # For reasons yet unknown, epatch fails to apply this cleanly ebegin "Applying filtered vim patches" TMPDIR=${T} patch -f -s -p0 < ${p} eend 0 } vim_pkg_setup() { # people with broken alphabets run into trouble. bug 82186. unset LANG LC_ALL export LC_COLLATE="C" # Gnome sandbox silliness. bug #114475. mkdir -p "${T}/home" export HOME="${T}/home" if [[ ${PN} != "vim-core" ]] && use python; then if [[ ${HAS_PYTHON_R1} ]]; then python-single-r1_pkg_setup else # vim supports python-2 only python_set_active_version 2 # python.eclass only defines python_pkg_setup for EAPIs that support # USE dependencies python_pkg_setup fi fi } vim_src_prepare() { has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX= if [[ ${PV} != 9999* ]] ; then # Apply any patches available from vim.org for this version if [[ $VIM_ORG_PATCHES == *.patch.bz2 ]]; then einfo "Applying monolithic patch ${VIM_ORG_PATCHES}" epatch "${WORKDIR}/${VIM_ORG_PATCHES%.bz2}" else apply_vim_patches fi fi # Another set of patches borrowed from src rpm to fix syntax errors etc. cd "${S}" || die "cd ${S} failed" if [[ -d "${WORKDIR}"/gentoo/patches-all/ ]]; then EPATCH_SUFFIX="gz" EPATCH_FORCE="yes" \ epatch "${WORKDIR}"/gentoo/patches-all/ elif [[ ${PN} == "vim-core" ]] && [[ -d "${WORKDIR}"/gentoo/patches-core/ ]]; then # Patches for vim-core only (runtime/*) EPATCH_SUFFIX="patch" EPATCH_FORCE="yes" \ epatch "${WORKDIR}"/gentoo/patches-core/ fi # Fixup a script to use awk instead of nawk sed -i '1s|.*|#!'"${EPREFIX}"'/usr/bin/awk -f|' "${S}"/runtime/tools/mve.awk \ || die "mve.awk sed failed" # Patch to build with ruby-1.8.0_pre5 and following sed -i 's/defout/stdout/g' "${S}"/src/if_ruby.c # Read vimrc and gvimrc from /etc/vim echo '#define SYS_VIMRC_FILE "'${EPREFIX}'/etc/vim/vimrc"' >> "${S}"/src/feature.h echo '#define SYS_GVIMRC_FILE "'${EPREFIX}'/etc/vim/gvimrc"' >> "${S}"/src/feature.h # Use exuberant ctags which installs as /usr/bin/exuberant-ctags. # Hopefully this pattern won't break for a while at least. # This fixes bug 29398 (27 Sep 2003 agriffis) sed -i 's/\> "$c" ; done # conditionally make the manpager.sh script if [[ ${PN} == vim ]] && use vim-pager ; then cat < "${S}"/runtime/macros/manpager.sh #!/bin/sh sed -e 's/\x1B\[[[:digit:]]\+m//g' | col -b | \\ vim \\ -c 'let no_plugin_maps = 1' \\ -c 'set nolist nomod ft=man' \\ -c 'let g:showmarks_enable=0' \\ -c 'runtime! macros/less.vim' - END fi # Try to avoid sandbox problems. Bug #114475. if [[ -d "${S}"/src/po ]] ; then sed -i -e \ '/-S check.vim/s,..VIM.,ln -s $(VIM) testvim \; ./testvim -X,' \ "${S}"/src/po/Makefile fi if version_is_at_least 7.3.122; then cp "${S}"/src/config.mk.dist "${S}"/src/auto/config.mk fi # Bug #378107 - Build properly with >=perl-core/ExtUtils-ParseXS-3.20.0 if version_is_at_least 7.3; then sed -i "s:\\\$(PERLLIB)/ExtUtils/xsubpp:${EPREFIX}/usr/bin/xsubpp:" \ "${S}"/src/Makefile || die 'sed for ExtUtils-ParseXS failed' fi } vim_src_configure() { local myconf # Fix bug 37354: Disallow -funroll-all-loops on amd64 # Bug 57859 suggests that we want to do this for all archs filter-flags -funroll-all-loops # Fix bug 76331: -O3 causes problems, use -O2 instead. We'll do this for # everyone since previous flag filtering bugs have turned out to affect # multiple archs... replace-flags -O3 -O2 # Fix bug 18245: Prevent "make" from the following chain: # (1) Notice configure.in is newer than auto/configure # (2) Rebuild auto/configure # (3) Notice auto/configure is newer than auto/config.mk # (4) Run ./configure (with wrong args) to remake auto/config.mk ebegin "Creating configure script" sed -i 's/ auto.config.mk:/:/' src/Makefile || die "Makefile sed failed" rm -f src/auto/configure # autoconf-2.13 needed for this package -- bug 35319 # except it seems we actually need 2.5 now -- bug 53777 WANT_AUTOCONF=2.5 \ emake -j1 -C src autoconf || die "make autoconf failed" eend $? # This should fix a sandbox violation (see bug 24447). The hvc # things are for ppc64, see bug 86433. for file in /dev/pty/s* /dev/console /dev/hvc/* /dev/hvc* ; do [[ -e ${file} ]] && addwrite $file done if [[ ${PN} == "vim-core" ]] || ( [[ ${PN} == vim ]] && use minimal ); then myconf="--with-features=tiny \ --enable-gui=no \ --without-x \ --disable-darwin \ --disable-perlinterp \ --disable-pythoninterp \ --disable-rubyinterp \ --disable-gpm" else use debug && append-flags "-DDEBUG" myconf="--with-features=huge \ --enable-multibyte" myconf="${myconf} $(use_enable cscope)" myconf="${myconf} $(use_enable gpm)" myconf="${myconf} $(use_enable perl perlinterp)" if [[ ${HAS_PYTHON_R1} ]]; then if use python; then if [[ ${EPYTHON} == python3* ]]; then myconf="${myconf} --enable-python3interp" export vi_cv_path_python3="${PYTHON}" else myconf="${myconf} --enable-pythoninterp" export vi_cv_path_python="${PYTHON}" fi else myconf="${myconf} --disable-pythoninterp --disable-python3interp" fi else myconf="${myconf} $(use_enable python pythoninterp)" fi myconf="${myconf} $(use_enable ruby rubyinterp)" # tclinterp is broken; when you --enable-tclinterp flag, then # the following command never returns: # VIMINIT='let OS=system("uname -s")' vim # mzscheme support is currently broken. bug #91970 #myconf="${myconf} $(use_enable mzscheme mzschemeinterp)" if [[ ${PN} == gvim ]] ; then myconf="${myconf} $(use_enable netbeans)" fi # --with-features=huge forces on cscope even if we --disable it. We need # to sed this out to avoid screwiness. (1 Sep 2004 ciaranm) if ! use cscope ; then sed -i -e '/# define FEAT_CSCOPE/d' src/feature.h || \ die "couldn't disable cscope" fi if [[ ${PN} == vim ]] ; then # don't test USE=X here ... see bug #19115 # but need to provide a way to link against X ... see bug #20093 myconf="${myconf} --enable-gui=no --disable-darwin $(use_with X x)" elif [[ ${PN} == gvim ]] ; then myconf="${myconf} --with-vim-name=gvim --with-x" echo ; echo if use aqua ; then einfo "Building gvim with the Carbon GUI" myconf="${myconf} --enable-darwin --enable-gui=carbon" elif use gtk ; then myconf="${myconf} --enable-gtk2-check" if use gnome ; then einfo "Building gvim with the Gnome 2 GUI" myconf="${myconf} --enable-gui=gnome2" else einfo "Building gvim with the gtk+-2 GUI" myconf="${myconf} --enable-gui=gtk2" fi elif use motif ; then einfo "Building gvim with the MOTIF GUI" myconf="${myconf} --enable-gui=motif" elif use neXt ; then einfo "Building gvim with the neXtaw GUI" myconf="${myconf} --enable-gui=nextaw" else einfo "Building gvim with the Athena GUI" myconf="${myconf} --enable-gui=athena" fi echo ; echo else die "vim.eclass doesn't understand PN=${PN}" fi fi if [[ ${PN} == vim ]] && use minimal ; then myconf="${myconf} --disable-nls --disable-multibyte --disable-acl" else myconf="${myconf} $(use_enable nls) $(use_enable acl)" fi myconf="${myconf} --disable-selinux" # Let Portage do the stripping. Some people like that. export ac_cv_prog_STRIP="$(type -P true ) faking strip" # Keep Gentoo Prefix env contained within the EPREFIX use prefix && myconf="${myconf} --without-local-dir" if [[ ${PN} == "*vim" ]] ; then if [[ ${CHOST} == *-interix* ]]; then # avoid finding of this function, to avoid having to patch either # configure or the source, which would be much more hackish. # after all vim does it right, only interix is badly broken (again) export ac_cv_func_sigaction=no fi fi myconf="${myconf} --with-modified-by=Gentoo-${PVR}" econf ${myconf} || die "vim configure failed" } vim_src_compile() { # The following allows emake to be used emake -j1 -C src auto/osdef.h objects || die "make failed" if [[ ${PN} == "vim-core" ]] ; then emake tools || die "emake tools failed" rm -f src/vim else if ! emake ; then eerror "If the above messages seem to be talking about perl" eerror "and undefined references, please try re-emerging both" eerror "perl and libperl with the same USE flags. For more" eerror "information, see:" eerror " https://bugs.gentoo.org/show_bug.cgi?id=18129" die "emake failed" fi fi } vim_src_install() { has "${EAPI:-0}" 0 1 2 && use !prefix && EPREFIX= has "${EAPI:-0}" 0 1 2 && use !prefix && ED="${D}" local vimfiles=/usr/share/vim/vim${VIM_VERSION/.} if [[ ${PN} == "vim-core" ]] ; then dodir /usr/{bin,share/{man/man1,vim}} cd src || die "cd src failed" make \ installruntime \ installmanlinks \ installmacros \ installtutor \ installtutorbin \ installtools \ install-languages \ install-icons \ DESTDIR=${D} \ BINDIR="${EPREFIX}"/usr/bin \ MANDIR="${EPREFIX}"/usr/share/man \ DATADIR="${EPREFIX}"/usr/share \ || die "install failed" keepdir ${vimfiles}/keymap # default vimrc is installed by vim-core since it applies to # both vim and gvim insinto /etc/vim/ newins "${FILESDIR}"/vimrc${VIMRC_FILE_SUFFIX} vimrc eprefixify "${ED}"/etc/vim/vimrc if use livecd ; then # To save space, install only a subset of the files if we're on a # livecd. bug 65144. einfo "Removing some files for a smaller livecd install ..." eshopts_push -s extglob rm -fr "${ED}${vimfiles}"/{compiler,doc,ftplugin,indent} rm -fr "${ED}${vimfiles}"/{macros,print,tools,tutor} rm "${ED}"/usr/bin/vimtutor local keep_colors="default" ignore=$(rm -fr "${ED}${vimfiles}"/colors/!(${keep_colors}).vim ) local keep_syntax="conf|crontab|fstab|inittab|resolv|sshdconfig" # tinkering with the next line might make bad things happen ... keep_syntax="${keep_syntax}|syntax|nosyntax|synload" ignore=$(rm -fr "${ED}${vimfiles}"/syntax/!(${keep_syntax}).vim ) eshopts_pop fi # These files might have slight security issues, so we won't # install them. See bug #77841. We don't mind if these don't # exist. rm "${ED}${vimfiles}"/tools/{vimspell.sh,tcltags} 2>/dev/null elif [[ ${PN} == gvim ]] ; then dobin src/gvim dosym gvim /usr/bin/gvimdiff dosym gvim /usr/bin/evim dosym gvim /usr/bin/eview dosym gvim /usr/bin/gview dosym gvim /usr/bin/rgvim dosym gvim /usr/bin/rgview dodir /usr/share/man/man1 echo ".so vim.1" > "${ED}"/usr/share/man/man1/gvim.1 echo ".so vim.1" > "${ED}"/usr/share/man/man1/gview.1 echo ".so vimdiff.1" > "${ED}"/usr/share/man/man1/gvimdiff.1 insinto /etc/vim newins "${FILESDIR}"/gvimrc${GVIMRC_FILE_SUFFIX} gvimrc eprefixify "${ED}"/etc/vim/gvimrc insinto /usr/share/applications newins "${FILESDIR}"/gvim.desktop${GVIM_DESKTOP_SUFFIX} gvim.desktop insinto /usr/share/pixmaps doins "${FILESDIR}"/gvim.xpm else # app-editor/vim # Note: Do not install symlinks for 'vi', 'ex', or 'view', as these are # managed by eselect-vi dobin src/vim dosym vim /usr/bin/vimdiff dosym vim /usr/bin/rvim dosym vim /usr/bin/rview if use vim-pager ; then dosym ${vimfiles}/macros/less.sh /usr/bin/vimpager dosym ${vimfiles}/macros/manpager.sh /usr/bin/vimmanpager insinto ${vimfiles}/macros doins runtime/macros/manpager.sh fperms a+x ${vimfiles}/macros/manpager.sh fi fi # bash completion script, bug #79018. if [[ ${PN} == "vim-core" ]] ; then newbashcomp "${FILESDIR}"/xxd-completion xxd else newbashcomp "${FILESDIR}"/${PN}-completion ${PN} fi # We shouldn't be installing the ex or view man page symlinks, as they # are managed by eselect-vi rm -f "${ED}"/usr/share/man/man1/{ex,view}.1 } # Make convenience symlinks, hopefully without stepping on toes. Some # of these links are "owned" by the vim ebuild when it is installed, # but they might be good for gvim as well (see bug 45828) update_vim_symlinks() { has "${EAPI:-0}" 0 1 2 && use !prefix && EROOT="${ROOT}" local f syms syms="vimdiff rvim rview" einfo "Calling eselect vi update..." # Call this with --if-unset to respect user's choice (bug 187449) eselect vi update --if-unset # Make or remove convenience symlink, vim -> gvim if [[ -f "${EROOT}"/usr/bin/gvim ]]; then ln -s gvim "${EROOT}"/usr/bin/vim 2>/dev/null elif [[ -L "${EROOT}"/usr/bin/vim && ! -f "${EROOT}"/usr/bin/vim ]]; then rm "${EROOT}"/usr/bin/vim fi # Make or remove convenience symlinks to vim if [[ -f "${EROOT}"/usr/bin/vim ]]; then for f in ${syms}; do ln -s vim "${EROOT}"/usr/bin/${f} 2>/dev/null done else for f in ${syms}; do if [[ -L "${EROOT}"/usr/bin/${f} && ! -f "${EROOT}"/usr/bin/${f} ]]; then rm -f "${EROOT}"/usr/bin/${f} fi done fi # This will still break if you merge then remove the vi package, # but there's only so much you can do, eh? Unfortunately we don't # have triggers like are done in rpm-land. } vim_pkg_postinst() { # Update documentation tags (from vim-doc.eclass) update_vim_helptags # Update fdo mime stuff, bug #78394 if [[ ${PN} == gvim ]] ; then fdo-mime_mime_database_update fi if [[ ${PN} == vim ]] ; then if use X; then echo elog "The 'X' USE flag enables vim <-> X communication, like" elog "updating the xterm titlebar. It does not install a GUI." fi echo elog "To install a GUI version of vim, use the app-editors/gvim" elog "package." fi echo elog "Vim 7 includes an integrated spell checker. You need to install" elog "word list files before you can use it. There are ebuilds for" elog "some of these named app-vim/vim-spell-*. If your language of" elog "choice is not included, please consult vim-spell.eclass for" elog "instructions on how to make a package." echo ewarn "Note that the English word lists are no longer installed by" ewarn "default." echo if [[ ${PN} != "vim-core" ]] ; then echo elog "To see what's new in this release, use :help version${VIM_VERSION/.*/}.txt" fi # Make convenience symlinks if [[ ${PN} != "vim-core" ]] ; then # But only for vim/gvim, bug #252724 update_vim_symlinks fi } vim_pkg_postrm() { # Update documentation tags (from vim-doc.eclass) update_vim_helptags # Make convenience symlinks if [[ ${PN} != "vim-core" ]] ; then # But only for vim/gvim, bug #252724 update_vim_symlinks fi # Update fdo mime stuff, bug #78394 if [[ ${PN} == gvim ]] ; then fdo-mime_mime_database_update fi } vim_src_test() { if [[ ${PN} == "vim-core" ]] ; then einfo "No testing needs to be done for vim-core" return fi einfo " " einfo "Starting vim tests. Several error messages will be shown " einfo "whilst the tests run. This is normal behaviour and does not " einfo "indicate a fault." einfo " " ewarn "If the tests fail, your terminal may be left in a strange " ewarn "state. Usually, running 'reset' will fix this." ewarn " " echo # Don't let vim talk to X unset DISPLAY if [[ ${PN} == gvim ]] ; then # Make gvim not try to connect to X. See :help gui-x11-start # in vim for how this evil trickery works. ln -s "${S}"/src/gvim "${S}"/src/testvim testprog="../testvim" else testprog="../vim" fi # We've got to call make test from within testdir, since the Makefiles # don't pass through our VIMPROG argument cd "${S}"/src/testdir # Test 49 won't work inside a portage environment einfo "Test 49 isn't sandbox-friendly, so it will be skipped." sed -i -e 's~test49.out~~g' Makefile # We don't want to rebuild vim before running the tests sed -i -e 's,: \$(VIMPROG),: ,' Makefile # Don't try to do the additional GUI test make VIMPROG=${testprog} nongui \ || die "At least one test failed" }