# A-A-P recipe for building Vim
#
# There are no user choices in here!
# Put configure arguments in the file config.arg.
# Later there will be a config.txt file that contains examples and
# explanations.
#
# Optional arguments:
#  PREFIX=dir           Overrules the install directory.
#                       Can be specified when installing only.
#                       Example: aap install PREFIX=$HOME
#

# Skip the configure stuff when "link.sh" is executing this recipe recursively
# to build pathdef.c or not building something and auto/config.aap does exist.
@if ((_no.TARGETARG != "pathdef" and has_build_target())
@       or not os.path.exists("auto/config.aap")):

    #
    # A U T O C O N F
    #

    # Run autoconf when configure.in has been changed since it was last run.
    # This is skipped when the signatures in "mysign" are up-to-date.  When
    # there is no autoconf program skip this (the signature is often the only
    # thing that's outdated)
    auto/configure {signfile = mysign} : configure.in
        @if not program_path("autoconf"):
            :print Can't find autoconf, using existing configure script.
        @else:
            # Move configure aside, autoconf would overwrite it
            :move {exist} configure configure.save
            :sys autoconf
            :cat configure | :eval re.sub('\\./config.log', 'auto/config.log', stdin) >! auto/configure
            :chmod 755 auto/configure
            :move configure.save configure
            :del {force} auto/config.cache auto/config.status

    # Change the configure script to produce config.aap instead of config.mk.
    auto/configure.aap : auto/configure
        :print Adjusting auto/configure for A-A-P.
        :cat auto/configure | :eval re.sub("config.mk", "config.aap", stdin)
                                                        >! auto/configure.aap
        :chmod 755 auto/configure.aap

    # The configure script uses the directory where it's located, use a link.
    configure.aap:  {buildcheck=}
        :symlink {f} auto/configure.aap configure.aap

    # Dependency: run configure.aap to update config.h and config.aap in the
    # "auto" directory.
    config {virtual} auto/config.h auto/config.aap :
                         auto/configure.aap configure.aap
                         config.arg config.h.in config.aap.in
        :sys CONFIG_STATUS=auto/config.status
                ./configure.aap `file2string("config.arg")`
                    --cache-file=auto/config.cache

    # Configure arguments: create an empty "config.arg" file when its missing
    config.arg:
        :touch {exist} config.arg

    # "auto/config.aap" contains a lot of settings, such as the name of the
    # executable "Target".
    # First update it, forcefully if the "reconfig" target was used.
    @if _no.TARGETARG != "comment" and _no.TARGETARG != "make":
        @if "reconfig" in var2list(_no.TARGETARG):
            :del {force} auto/config.cache auto/config.status
            :update {force} auto/config.aap
        @else:
            :update auto/config.aap

# Include the recipe that autoconf generated.
:include auto/config.aap

# A "PREFIX=dir" argument overrules the value of $prefix
@if _no.get("PREFIX"):
    prefix = $PREFIX

# Don't want "~/" in prefix.
prefix = `os.path.expanduser(prefix)`

#
# G U I  variant
#
# The GUI is selected by configure, a lot of other things depend on it.
#
:variant GUI
    GTK
        GUI_SRC         = gui.c gui_gtk.c gui_gtk_x11.c pty.c gui_beval.c
                            gui_gtk_f.c
        GUI_OBJ         =
        GUI_DEFS        = -DFEAT_GUI_GTK $NARROW_PROTO
        GUI_IPATH       = $GUI_INC_LOC
        GUI_LIBS_DIR    = $GUI_LIB_LOC
        GUI_LIBS1       =
        GUI_LIBS2       = $GTK_LIBNAME
        GUI_TARGETS     = installglinks
        GUI_MAN_TARGETS = installghelplinks
        GUI_TESTTARGET  = gui
    KDE
        GUI_SRC         = gui.c pty.c gui_kde.cc gui_kde_x11.cc
                            gui_kde_wid_moc.cc
                            kvim_iface_skel.cc
        GUI_OBJ         = $BDIR/gui_kde_wid.o
        GUI_DEFS        = -DFEAT_GUI_KDE $NARROW_PROTO
        GUI_IPATH       = $GUI_INC_LOC
        GUI_LIBS_DIR    = $GUI_LIB_LOC
        GUI_LIBS1       =
        GUI_LIBS2       =
        GUI_TARGETS     = installglinks installkdeicons
        GUI_MAN_TARGETS = installghelplinks
        GUI_TESTTARGET  = gui

    MOTIF
        GUI_SRC         = gui.c gui_motif.c gui_x11.c pty.c gui_beval.c
                          gui_xmdlg.c gui_xmebw.c
        GUI_OBJ         =
        GUI_DEFS        = -DFEAT_GUI_MOTIF $NARROW_PROTO
        GUI_IPATH       = $GUI_INC_LOC
        GUI_LIBS_DIR    = $GUI_LIB_LOC
        GUI_LIBS1       =
        GUI_LIBS2       = $MOTIF_LIBNAME -lXt
        GUI_TARGETS     = installglinks
        GUI_MAN_TARGETS = installghelplinks
        GUI_TESTTARGET  = gui
    ATHENA
        # XAW_LIB et al. can be overruled to use Xaw3d widgets
        XAW_LIB         ?= -lXaw
        GUI_SRC         =  gui.c gui_athena.c gui_x11.c pty.c gui_beval.c \
                            gui_at_sb.c gui_at_fs.c
        GUI_OBJ         =
        GUI_DEFS        = -DFEAT_GUI_ATHENA $NARROW_PROTO
        GUI_IPATH       = $GUI_INC_LOC
        GUI_LIBS_DIR    = $GUI_LIB_LOC
        GUI_LIBS1       = $XAW_LIB
        GUI_LIBS2       = -lXt
        GUI_TARGETS     = installglinks
        GUI_MAN_TARGETS = installghelplinks
        GUI_TESTTARGET  = gui
    NEXTAW
        # XAW_LIB et al. can be overruled to use Xaw3d widgets
        XAW_LIB         ?= -lXaw
        GUI_SRC         =  gui.c gui_athena.c gui_x11.c pty.c gui_beval.c
                            gui_at_fs.c
        GUI_OBJ         =
        GUI_DEFS        = -DFEAT_GUI_ATHENA -DFEAT_GUI_NEXTAW $NARROW_PROTO
        GUI_IPATH       = $GUI_INC_LOC
        GUI_LIBS_DIR    = $GUI_LIB_LOC
        GUI_LIBS1       = $NEXTAW_LIB
        GUI_LIBS2       = -lXt
        GUI_TARGETS     = installglinks
        GUI_MAN_TARGETS = installghelplinks
        GUI_TESTTARGET  = gui
    PHOTONGUI
        GUI_SRC         = gui.c gui_photon.c pty.c
        GUI_OBJ         =
        GUI_DEFS        = -DFEAT_GUI_PHOTON
        GUI_IPATH       =
        GUI_LIBS_DIR    =
        GUI_LIBS1       = -lph -lphexlib
        GUI_LIBS2       =
        GUI_TARGETS     = installglinks
        GUI_MAN_TARGETS = installghelplinks
        GUI_TESTTARGET  = gui
    *
        GUI_SRC         =
        GUI_OBJ         =
        GUI_DEFS        =
        GUI_IPATH       =
        GUI_LIBS_DIR    =
        GUI_LIBS1       =
        GUI_LIBS2       =
        GUI_TARGETS     =
        GUI_MAN_TARGETS =
        GUI_TESTTARGET  =


PRE_DEFS = -Iproto -I. $DEFS $GUI_DEFS $GUI_IPATH $CPPFLAGS $?(EXTRA_IPATHS)
POST_DEFS = $X_CFLAGS $MZSCHEME_CFLAGS $PERL_CFLAGS $PYTHON_CFLAGS $TCL_CFLAGS $RUBY_CFLAGS $?(EXTRA_DEFS)
CFLAGS = $PRE_DEFS $CONF_CFLAGS $?(PROFILE_CFLAGS) $POST_DEFS
CPPFLAGS =
# Need C++ flags for KDE
CXXFLAGS = $CFLAGS

ALL_LIB_DIRS = $GUI_LIBS_DIR $X_LIBS_DIR
LDFLAGS = $ALL_LIB_DIRS $CONF_LDFLAGS
LIBS = $GUI_LIBS1 $GUI_X_LIBS $GUI_LIBS2 $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $CONF_LIBS $?(EXTRA_LIBS) $MZSCHEME_LIBS $PERL_LIBS $PYTHON_LIBS $TCL_LIBS $RUBY_LIBS $?(PROFILE_LIBS)

Target = $VIMNAME

# reconfig target also builds Vim (reconfiguration is handled above).
reconfig {virtual}: $Target


# Execute the test scripts.  Run these after compiling Vim, before installing.
#
# This will produce a lot of garbage on your screen, including a few error
# messages.  Don't worry about that.
# If there is a real error, there will be a difference between "test.out" and
# a "test99.ok" file.
# If everything is allright, the final message will be "ALL DONE".
#
test check:
    VimProg = ../$Target
    :execute testdir/main.aap $GUI_TESTTARGET

testclean {virtual}:
    :del {force} testdir/*.out testdir/test.log

CLEANFILES += gui_kde_wid_moc.cc kvim_iface_skel.cc *.kidl

# When no fetch target exists we are not a child of the ../main.aap recipe,
# Use ../main.aap to do the fetching.
# --- If you get an error here for wrong number of arguments, you need to
#     update to a newer version of A-A-P.
@if not has_target("fetch"):
    fetch:
        :execute ../main.aap fetch


# All the source files that need to be compiled.
# Some are optional and depend on configure.
# "version.c" is missing, it's always compiled (see below).
Source =
        buffer.c
        charset.c
        diff.c
        digraph.c
        edit.c
        eval.c
        ex_cmds.c
        ex_cmds2.c
        ex_docmd.c
        ex_eval.c
        ex_getln.c
        fileio.c
        fold.c
        getchar.c
        hardcopy.c
        hashtable.c
        if_cscope.c
        if_xcmdsrv.c
        main.c
        mark.c
        memfile.c
        memline.c
        menu.c
        message.c
        misc1.c
        misc2.c
        move.c
        mbyte.c
        normal.c
        ops.c
        option.c
        os_unix.c
        auto/pathdef.c
        popupmenu.c
        quickfix.c
        regexp.c
        screen.c
        search.c
        spell.c
        syntax.c
        tag.c
        term.c
        ui.c
        undo.c
        window.c
        $OS_EXTRA_SRC
        $GUI_SRC
        $HANGULIN_SRC
        $MZSCHEME_SRC
        $PERL_SRC
        $NETBEANS_SRC
        $PYTHON_SRC
        $TCL_SRC
        $RUBY_SRC
        $SNIFF_SRC
        $WORKSHOP_SRC

Objects =
        $GUI_OBJ

# TODO: make is still used for subdirectories, need to write a recipe.
MAKE ?= make

all: $Target

# This dependency is required to build auto/osdef.h before automatic
# dependencies are generated.
$Source version.c : auto/osdef.h

# Need to mention that the target also depends on version.c, since it's not
# inluded in $Source
$Target : version.c

# Some sources are to be found in the "auto" directory.
SRCPATH += auto

# When building Vim always compile version.c to get the timestamp.
:filetype
    declare my_prog
:attr {filetype = my_prog} $Target

:program $Target : $Source $Objects

:action build my_prog object
        version_obj = `src2obj("version.c")`
        :do compile {target = $version_obj} version.c
        #:do build {target = $target {filetype = program}} $source $version_obj
        link_sed = $BDIR/link.sed
        @if os.path.exists(link_sed):
            :move {force} $link_sed auto/link.sed
        @else:
            :del {force} auto/link.sed
        :update link2.sh
        :sys LINK="$?(PURIFY) $?(SHRPENV) $CC $LDFLAGS \
                -o $target $source $version_obj $LIBS" \
                MAKE="aap" sh ./link2.sh
        :copy {force} auto/link.sed $BDIR/link.sed

# "link.sh" must be modified for A-A-P
link2.sh : link.sh
    :print Adjusting $-source for A-A-P.
    :cat $source | :eval re.sub("objects/pathdef.o", "pathdef", stdin)
                                                                      >! $target

xxd/xxd$EXESUF: xxd/xxd.c
    :sys cd xxd; CC="$CC" CFLAGS="$CPPFLAGS $CFLAGS" \
            $MAKE -f Makefile

# Build the language specific files if they were unpacked.
# Generate the converted .mo files separately, it's no problem if this fails.
languages {virtual}:
        @if _no.MAKEMO:
            :sys cd $PODIR; CC="$CC" $MAKE prefix=$DESTDIR$prefix
            @try:
                :sys cd $PODIR; CC="$CC" $MAKE prefix=$DESTDIR$prefix converted
            @except:
                :print Generated converted language files failed, continuing

# Update the *.po files for changes in the sources.  Only run manually.
update-po {virtual}:
        cd $PODIR; CC="$CC" $MAKE prefix=$DESTDIR$prefix update-po

auto/if_perl.c: if_perl.xs
        :sys $PERL -e 'unless ( $$] >= 5.005 ) { for (qw(na defgv errgv)) { print "#define PL_$$_ $$_\n" }}' > $target
        :sys $PERL $PERLLIB/ExtUtils/xsubpp -prototypes -typemap \
            $PERLLIB/ExtUtils/typemap if_perl.xs >> $target

$BDIR/gui_kde_wid.o: gui_kde_wid.cc
        :sys $MOC -o gui_kde_wid_moc.cc gui_kde_wid.h
        @try:
            :sys $KDE_PREFIX/bin/dcopidl kvim_iface.h > kvim_iface.kidl
        @except:
            :del {f} kvim_iface.kidl
        :sys $KDE_PREFIX/bin/dcopidl2cpp --c++-suffix cc --no-stub kvim_iface.kidl
        :do compile gui_kde_wid.cc

gui_kde_wid_moc.cc: $BDIR/gui_kde_wid.o

kvim_iface_skel.cc: $BDIR/gui_kde_wid.o


auto/osdef.h: auto/config.h osdef.sh osdef1.h.in osdef2.h.in
        :sys CC="$CC $CFLAGS" srcdir=$srcdir sh $srcdir/osdef.sh

pathdef {virtual} : $BDIR/auto/pathdef$OBJSUF

auto/pathdef.c: auto/config.aap
        :print Creating $target
        :print >! $target /* pathdef.c */
        :print >> $target /* This file is automatically created by main.aap */
        :print >> $target /* DO NOT EDIT!  Change main.aap only. */
        :print >> $target $#include "vim.h"
        :print >> $target char_u *default_vim_dir = (char_u *)"$VIMRCLOC";
        :print >> $target char_u *default_vimruntime_dir = (char_u *)"$?VIMRUNTIMEDIR";
        v = $CC -c -I$srcdir $CFLAGS
        @v = string.replace(v, '"', '\\"')
        :print >> $target char_u *all_cflags = (char_u *)"$v";
        linkcmd = $CC $LDFLAGS -o $VIMTARGET $LIBS
        link_sed = $BDIR/link.sed
        @if os.path.exists(link_sed):
            # filter $linkcmd through $BDIR/link.sed
            :print $linkcmd | :syseval sed -f $link_sed | :eval re.sub("\n", "", stdin) | :assign linkcmd
        @linkcmd = string.replace(linkcmd, '"', '\\"')
        :print >> $target char_u *all_lflags = (char_u *)"$linkcmd";
        @if _no.get("COMPILEDBY"):
            who = $COMPILEDBY
            where = ''
        @else:
            :syseval whoami | :eval re.sub("\n", "", stdin) | :assign who

            :syseval hostname | :eval re.sub("\n", "", stdin) | :assign where
        :print >> $target char_u *compiled_user = (char_u *)"$who";
        :print >> $target char_u *compiled_sys = (char_u *)"$where";


### Names of the programs and targets
VIMTARGET       = $VIMNAME$EXESUF
EXTARGET        = $EXNAME$LNKSUF
VIEWTARGET      = $VIEWNAME$LNKSUF
GVIMNAME        = g$VIMNAME
GVIMTARGET      = $GVIMNAME$LNKSUF
GVIEWNAME       = g$VIEWNAME
GVIEWTARGET     = $GVIEWNAME$LNKSUF
RVIMNAME        = r$VIMNAME
RVIMTARGET      = $RVIMNAME$LNKSUF
RVIEWNAME       = r$VIEWNAME
RVIEWTARGET     = $RVIEWNAME$LNKSUF
RGVIMNAME       = r$GVIMNAME
RGVIMTARGET     = $RGVIMNAME$LNKSUF
RGVIEWNAME      = r$GVIEWNAME
RGVIEWTARGET    = $RGVIEWNAME$LNKSUF
VIMDIFFNAME     = $(VIMNAME)diff
GVIMDIFFNAME    = g$VIMDIFFNAME
VIMDIFFTARGET   = $VIMDIFFNAME$LNKSUF
GVIMDIFFTARGET  = $GVIMDIFFNAME$LNKSUF
EVIMNAME        = e$VIMNAME
EVIMTARGET      = $EVIMNAME$LNKSUF
EVIEWNAME       = e$VIEWNAME
EVIEWTARGET     = $EVIEWNAME$LNKSUF

### Names of the tools that are also made
TOOLS = xxd/xxd$EXESUF

# Root of the installation tree.  Empty for a normal install, set to an
# existing path to install into a special place (for generating a package).
DESTDIR ?=

### Location of man pages
MANSUBDIR = $MANDIR/man1

### Location of Vim files (should not need to be changed, and
### some things might not work when they are changed!)
VIMDIR = /vim
@r = re.compile('.*VIM_VERSION_NODOT\\s*"(vim\\d\\d[^"]*)".*', re.S)
VIMRTDIR = /`r.match(open("version.h").read()).group(1)`
HELPSUBDIR = /doc
COLSUBDIR = /colors
SYNSUBDIR = /syntax
INDSUBDIR = /indent
AUTOSUBDIR = /autoload
PLUGSUBDIR = /plugin
FTPLUGSUBDIR = /ftplugin
LANGSUBDIR = /lang
COMPSUBDIR = /compiler
KMAPSUBDIR = /keymap
MACROSUBDIR = /macros
TOOLSSUBDIR = /tools
TUTORSUBDIR = /tutor
PRINTSUBDIR = /print
PODIR = po

### VIMLOC      common root of the Vim files (all versions)
### VIMRTLOC    common root of the runtime Vim files (this version)
### VIMRCLOC    compiled-in location for global [g]vimrc files (all versions)
### VIMRUNTIMEDIR  compiled-in location for runtime files (optional)
### HELPSUBLOC  location for help files
### COLSUBLOC   location for colorscheme files
### SYNSUBLOC   location for syntax files
### INDSUBLOC   location for indent files
### AUTOSUBLOC  location for standard autoload files
### PLUGSUBLOC  location for standard plugin files
### FTPLUGSUBLOC  location for ftplugin files
### LANGSUBLOC  location for language files
### COMPSUBLOC  location for compiler files
### KMAPSUBLOC  location for keymap files
### MACROSUBLOC location for macro files
### TOOLSSUBLOC location for tools files
### TUTORSUBLOC location for tutor files
### PRINTSUBLOC location for print files
### SCRIPTLOC   location for script files (menu.vim, bugreport.vim, ..)
### You can override these if you want to install them somewhere else.
### Edit feature.h for compile-time settings.
VIMLOC          = $DATADIR$VIMDIR
VIMRTLOC        = $DATADIR$VIMDIR$VIMRTDIR
VIMRCLOC        = $VIMLOC
HELPSUBLOC      = $VIMRTLOC$HELPSUBDIR
COLSUBLOC       = $VIMRTLOC$COLSUBDIR
SYNSUBLOC       = $VIMRTLOC$SYNSUBDIR
INDSUBLOC       = $VIMRTLOC$INDSUBDIR
AUTOSUBLOC      = $VIMRTLOC$AUTOSUBDIR
PLUGSUBLOC      = $VIMRTLOC$PLUGSUBDIR
FTPLUGSUBLOC    = $VIMRTLOC$FTPLUGSUBDIR
LANGSUBLOC      = $VIMRTLOC$LANGSUBDIR
COMPSUBLOC      = $VIMRTLOC$COMPSUBDIR
KMAPSUBLOC      = $VIMRTLOC$KMAPSUBDIR
MACROSUBLOC     = $VIMRTLOC$MACROSUBDIR
TOOLSSUBLOC     = $VIMRTLOC$TOOLSSUBDIR
TUTORSUBLOC     = $VIMRTLOC$TUTORSUBDIR
PRINTSUBLOC     = $VIMRTLOC$PRINTSUBDIR
SCRIPTLOC       = $VIMRTLOC

### Only set VIMRUNTIMEDIR when VIMRTLOC is set to a different location and
### the runtime directory is not below it.
#VIMRUNTIMEDIR = $VIMRTLOC

### Name of the evim file target.
EVIM_FILE       = $DESTDIR$SCRIPTLOC/evim.vim
MSWIN_FILE      = $DESTDIR$SCRIPTLOC/mswin.vim

### Name of the menu file target.
SYS_MENU_FILE   = $DESTDIR$SCRIPTLOC/menu.vim
SYS_SYNMENU_FILE = $DESTDIR$SCRIPTLOC/synmenu.vim
SYS_DELMENU_FILE = $DESTDIR$SCRIPTLOC/delmenu.vim

### Name of the bugreport file target.
SYS_BUGR_FILE   = $DESTDIR$SCRIPTLOC/bugreport.vim

### Name of the file type detection file target.
SYS_FILETYPE_FILE = $DESTDIR$SCRIPTLOC/filetype.vim

### Name of the file type detection file target.
SYS_FTOFF_FILE  = $DESTDIR$SCRIPTLOC/ftoff.vim

### Name of the file type detection script file target.
SYS_SCRIPTS_FILE = $DESTDIR$SCRIPTLOC/scripts.vim

### Name of the ftplugin-on file target.
SYS_FTPLUGIN_FILE = $DESTDIR$SCRIPTLOC/ftplugin.vim

### Name of the ftplugin-off file target.
SYS_FTPLUGOF_FILE = $DESTDIR$SCRIPTLOC/ftplugof.vim

### Name of the indent-on file target.
SYS_INDENT_FILE = $DESTDIR$SCRIPTLOC/indent.vim

### Name of the indent-off file target.
SYS_INDOFF_FILE = $DESTDIR$SCRIPTLOC/indoff.vim

### Name of the option window script file target.
SYS_OPTWIN_FILE = $DESTDIR$SCRIPTLOC/optwin.vim

### Permissions for binaries
BINMOD = 755

### Permissions for man page
MANMOD = 644

### Permissions for help files
HELPMOD = 644

### Permissions for Perl and shell scripts
SCRIPTMOD = 755

### Permission for Vim script files (menu.vim, bugreport.vim, ..)
VIMSCRIPTMOD = 644

### Permissions for all directories that are created
DIRMOD = 755

### Permissions for all other files that are created
FILEMOD = 644

# Where to copy the man and help files from
HELPSOURCE = ../runtime/doc

# Where to copy the script files from (menu, bugreport)
SCRIPTSOURCE = ../runtime

# Where to copy the colorscheme files from
COLSOURCE = ../runtime/colors

# Where to copy the syntax files from
SYNSOURCE = ../runtime/syntax

# Where to copy the indent files from
INDSOURCE = ../runtime/indent

# Where to copy the standard plugin files from
AUTOSOURCE = ../runtime/autoload

# Where to copy the standard plugin files from
PLUGSOURCE = ../runtime/plugin

# Where to copy the ftplugin files from
FTPLUGSOURCE = ../runtime/ftplugin

# Where to copy the macro files from
MACROSOURCE = ../runtime/macros

# Where to copy the tools files from
TOOLSSOURCE = ../runtime/tools

# Where to copy the tutor files from
TUTORSOURCE = ../runtime/tutor

# Where to look for language specific files
LANGSOURCE = ../runtime/lang

# Where to look for compiler files
COMPSOURCE = ../runtime/compiler

# Where to look for keymap files
KMAPSOURCE = ../runtime/keymap

# Where to look for print resource files
PRINTSOURCE = ../runtime/print

# abbreviations
DEST_BIN = $DESTDIR$BINDIR
DEST_VIM = $DESTDIR$VIMLOC
DEST_RT = $DESTDIR$VIMRTLOC
DEST_HELP = $DESTDIR$HELPSUBLOC
DEST_COL = $DESTDIR$COLSUBLOC
DEST_SYN = $DESTDIR$SYNSUBLOC
DEST_IND = $DESTDIR$INDSUBLOC
DEST_AUTO = $DESTDIR$AUTOSUBLOC
DEST_PLUG = $DESTDIR$PLUGSUBLOC
DEST_FTP = $DESTDIR$FTPLUGSUBLOC
DEST_LANG = $DESTDIR$LANGSUBLOC
DEST_COMP = $DESTDIR$COMPSUBLOC
DEST_KMAP = $DESTDIR$KMAPSUBLOC
DEST_MACRO = $DESTDIR$MACROSUBLOC
DEST_TOOLS = $DESTDIR$TOOLSSUBLOC
DEST_TUTOR = $DESTDIR$TUTORSUBLOC
DEST_SCRIPT = $DESTDIR$SCRIPTLOC
DEST_PRINT = $DESTDIR$PRINTSUBLOC
DEST_MAN = $DESTDIR$MANSUBDIR

# These are directories, create them when needed.
:attr {directory = $DIRMOD} $DEST_BIN $DEST_VIM $DEST_RT $DEST_HELP $DEST_COL
                $DEST_SYN $DEST_IND $DEST_AUTO $DEST_PLUG $DEST_FTP $DEST_LANG
                $DEST_COMP $DEST_KMAP $DEST_MACRO $DEST_TOOLS $DEST_TUTOR
                $DEST_SCRIPT $DEST_PRINT $DEST_MAN

#
# I N S T A L L
#
install:
    @if not os.path.isdir(_no.DEST_BIN):
        @try:
            :mkdir $DEST_BIN
        @except:
        @   pass
    @if os.access(_no.DEST_BIN, os.W_OK):
        # Bin directory is writable, install directly.
        :update installvim installtools install-languages install-icons
    @else:
        # Bin directory is not writable, need to become root.
        :print The destination directory "$DEST_BIN" is not writable.
        :print If this is the wrong directory, use PREFIX to specify another one.
        :print Otherwise, type the root password to continue installing.
        :asroot $AAP install

installvim {virtual}: installvimbin installruntime installlinks \
                        installhelplinks installmacros installtutor

installvimbin {virtual}{force}: $Target $DEST_BIN
        exe = $DEST_BIN/$VIMTARGET
        @if os.path.exists(exe):
            # Move the old executable aside and delete it.  Any other method
            # may cause a crash if the executable is currently being used.
            :move {force} $exe $(exe).rm
            :del {force} $(exe).rm
        :copy $VIMTARGET $DEST_BIN
        :do strip $exe
        :chmod $BINMOD $DEST_BIN/$VIMTARGET
# may create a link to the new executable from /usr/bin/vi
        @if _no.get("LINKIT"):
            :sys $LINKIT

# install the help files; first adjust the contents for the location
installruntime {virtual}{force}: $HELPSOURCE/vim.1 $DEST_MAN $DEST_VIM
                $DEST_RT $DEST_HELP $DEST_COL $DEST_SYN $DEST_IND
                $DEST_FTP $DEST_AUTO $DEST_PLUG $DEST_TUTOR $DEST_COMP
                $DEST_PRINT
        :print generating $DEST_MAN/$(VIMNAME).1
        :cat $HELPSOURCE/vim.1 |
                :eval re.sub("/usr/local/lib/vim", _no.VIMLOC, stdin) |
                :eval re.sub(_no.VIMLOC + "/doc", _no.HELPSUBLOC, stdin) |
                :eval re.sub(_no.VIMLOC + "/syntax", _no.SYNSUBLOC, stdin) |
                :eval re.sub(_no.VIMLOC + "/tutor", _no.TUTORSUBLOC, stdin) |
                :eval re.sub(_no.VIMLOC + "/vimrc",
                                               _no.VIMRCLOC + "/vimrc", stdin) |
                :eval re.sub(_no.VIMLOC + "/gvimrc",
                                              _no.VIMRCLOC + "/gvimrc", stdin) |
                :eval re.sub(_no.VIMLOC + "/menu.vim",
                                           _no.SCRIPTLOC + "/menu.vim", stdin) |
                :eval re.sub(_no.VIMLOC + "/bugreport.vim",
                                      _no.SCRIPTLOC + "/bugreport.vim", stdin) |
                :eval re.sub(_no.VIMLOC + "/filetype.vim",
                                       _no.SCRIPTLOC + "/filetype.vim", stdin) |
                :eval re.sub(_no.VIMLOC + "/ftoff.vim",
                                          _no.SCRIPTLOC + "/ftoff.vim", stdin) |
                :eval re.sub(_no.VIMLOC + "/scripts.vim",
                                        _no.SCRIPTLOC + "/scripts.vim", stdin) |
                :eval re.sub(_no.VIMLOC + "/optwin.vim",
                                         _no.SCRIPTLOC + "/optwin.vim", stdin) |
                :eval re.sub(_no.VIMLOC + "/\\*.ps",
                                                 _no.SCRIPTLOC + "/*.ps", stdin)
                >! $DEST_MAN/$(VIMNAME).1
        :chmod $MANMOD $DEST_MAN/$(VIMNAME).1

        :print generating $DEST_MAN/$(VIMNAME)tutor.1
        :cat $HELPSOURCE/vimtutor.1 |
                :eval re.sub("/usr/local/lib/vim", _no.VIMLOC, stdin) |
                :eval re.sub(_no.VIMLOC + "/tutor", _no.TUTORSUBLOC, stdin)
                >! $DEST_MAN/$(VIMNAME)tutor.1
        :chmod $MANMOD $DEST_MAN/$(VIMNAME)tutor.1

        :copy $HELPSOURCE/vimdiff.1 $DEST_MAN/$(VIMDIFFNAME).1
        :chmod $MANMOD $DEST_MAN/$(VIMDIFFNAME).1

        :print generating $DEST_MAN/$(EVIMNAME).1
        :cat $HELPSOURCE/evim.1 |
                :eval re.sub("/usr/local/lib/vim", _no.SCRIPTLOC, stdin)
                >! $DEST_MAN/$(EVIMNAME).1
        :chmod $MANMOD $DEST_MAN/$(EVIMNAME).1

        :cd $HELPSOURCE
        @try:
            XTRA = `glob.glob("*.??x")` `glob.glob("tags-??")`
        @except:
            XTRA =       # It's OK if there are no matches.
        :copy *.txt tags $XTRA $DEST_HELP
        :cd -
        :cd $DEST_HELP
        :chmod $HELPMOD *.txt tags $XTRA
        :cd -
        :copy  $HELPSOURCE/*.pl $DEST_HELP
        :chmod $SCRIPTMOD $DEST_HELP/*.pl
# install the menu files
        :copy $SCRIPTSOURCE/menu.vim $SYS_MENU_FILE
        :chmod $VIMSCRIPTMOD $SYS_MENU_FILE
        :copy $SCRIPTSOURCE/synmenu.vim $SYS_SYNMENU_FILE
        :chmod $VIMSCRIPTMOD $SYS_SYNMENU_FILE
        :copy $SCRIPTSOURCE/delmenu.vim $SYS_DELMENU_FILE
        :chmod $VIMSCRIPTMOD $SYS_DELMENU_FILE
# install the evim file
        :copy $SCRIPTSOURCE/mswin.vim $MSWIN_FILE
        :chmod $VIMSCRIPTMOD $MSWIN_FILE
        :copy $SCRIPTSOURCE/evim.vim $EVIM_FILE
        :chmod $VIMSCRIPTMOD $EVIM_FILE
# install the bugreport file
        :copy $SCRIPTSOURCE/bugreport.vim $SYS_BUGR_FILE
        :chmod $VIMSCRIPTMOD $SYS_BUGR_FILE
# install the example vimrc files
        :copy $SCRIPTSOURCE/vimrc_example.vim $DEST_SCRIPT
        :chmod $VIMSCRIPTMOD $DEST_SCRIPT/vimrc_example.vim
        :copy $SCRIPTSOURCE/gvimrc_example.vim $DEST_SCRIPT
        :chmod $VIMSCRIPTMOD $DEST_SCRIPT/gvimrc_example.vim
# install the file type detection files
        :copy $SCRIPTSOURCE/filetype.vim $SYS_FILETYPE_FILE
        :chmod $VIMSCRIPTMOD $SYS_FILETYPE_FILE
        :copy $SCRIPTSOURCE/ftoff.vim $SYS_FTOFF_FILE
        :chmod $VIMSCRIPTMOD $SYS_FTOFF_FILE
        :copy $SCRIPTSOURCE/scripts.vim $SYS_SCRIPTS_FILE
        :chmod $VIMSCRIPTMOD $SYS_SCRIPTS_FILE
        :copy $SCRIPTSOURCE/ftplugin.vim $SYS_FTPLUGIN_FILE
        :chmod $VIMSCRIPTMOD $SYS_FTPLUGIN_FILE
        :copy $SCRIPTSOURCE/ftplugof.vim $SYS_FTPLUGOF_FILE
        :chmod $VIMSCRIPTMOD $SYS_FTPLUGOF_FILE
        :copy $SCRIPTSOURCE/indent.vim $SYS_INDENT_FILE
        :chmod $VIMSCRIPTMOD $SYS_INDENT_FILE
        :copy $SCRIPTSOURCE/indoff.vim $SYS_INDOFF_FILE
        :chmod $VIMSCRIPTMOD $SYS_INDOFF_FILE
        :copy $SCRIPTSOURCE/optwin.vim $SYS_OPTWIN_FILE
        :chmod $VIMSCRIPTMOD $SYS_OPTWIN_FILE
# install the print resource files
        :copy $PRINTSOURCE/*.ps $DEST_PRINT
        :chmod $FILEMOD $DEST_PRINT/*.ps
# install the colorscheme files
        :copy $COLSOURCE/*.vim $COLSOURCE/README.txt $DEST_COL
        :chmod $HELPMOD $DEST_COL/*.vim $DEST_COL/README.txt
# install the syntax files
        :copy $SYNSOURCE/*.vim $SYNSOURCE/README.txt $DEST_SYN
        :chmod $HELPMOD $DEST_SYN/*.vim $DEST_SYN/README.txt
# install the indent files
        :copy $INDSOURCE/*.vim $INDSOURCE/README.txt $DEST_IND
        :chmod $HELPMOD $DEST_IND/*.vim
# install the standard autoload files
        :copy $AUTOSOURCE/*.vim $AUTOSOURCE/README.txt $DEST_AUTO
        :chmod $HELPMOD $DEST_AUTO/*.vim $DEST_AUTO/README.txt
# install the standard plugin files
        :copy $PLUGSOURCE/*.vim $PLUGSOURCE/README.txt $DEST_PLUG
        :chmod $HELPMOD $DEST_PLUG/*.vim $DEST_PLUG/README.txt
# install the ftplugin files
        :copy $FTPLUGSOURCE/*.vim $FTPLUGSOURCE/README.txt $DEST_FTP
        :chmod $HELPMOD $DEST_FTP/*.vim $DEST_FTP/README.txt
# install the compiler files
        :copy $COMPSOURCE/*.vim $COMPSOURCE/README.txt $DEST_COMP
        :chmod $HELPMOD $DEST_COMP/*.vim $DEST_COMP/README.txt

installmacros {virtual}{force}: $MACROSOURCE $DEST_VIM $DEST_RT $DEST_MACRO
        :copy {recursive}{force} $MACROSOURCE/* $DEST_MACRO
        # Delete any CVS and AAPDIR directories.
        # Use the ":tree" command if possible.  It was added later, fall back
        # to using "find" when it doesn't work.
        @try:
           :tree $DEST_MACRO {dirname = CVS}
              :del {recursive} $name
           :tree $DEST_MACRO {dirname = AAPDIR}
              :del {recursive} $name
           :tree $DEST_MACRO {dirname = .*}
              :chmod $DIRMOD $name
           :tree $DEST_MACRO {filename = .*}
              :chmod $FILEMOD $name
        @except:
        @  ok, cvsdirs = redir_system('find %s -name CVS -print' % _no.DEST_MACRO)
        @  if ok and cvsdirs:
             :del {recursive} $cvsdirs
           :sys chmod $DIRMOD ``find $DEST_MACRO -type d -print``
           :sys chmod $FILEMOD ``find $DEST_MACRO -type f -print``
        :chmod $SCRIPTMOD $DEST_MACRO/less.sh

# install the tutor files
installtutor {virtual}{force}: $TUTORSOURCE $DEST_VIM $DEST_RT $DEST_TUTOR
        :copy vimtutor $DEST_BIN/$(VIMNAME)tutor
        :chmod $SCRIPTMOD $DEST_BIN/$(VIMNAME)tutor
        :copy $TUTORSOURCE/tutor* $TUTORSOURCE/README* $DEST_TUTOR
        :chmod $HELPMOD $DEST_TUTOR/*

# install helper program xxd
installtools {virtual}{force}: $TOOLS $DEST_BIN $DEST_MAN \
                $TOOLSSOURCE $DEST_VIM $DEST_RT $DEST_TOOLS
        xxd = $DEST_BIN/xxd$EXESUF
        @if os.path.exists(xxd):
          :move {force} $xxd $(xxd).rm
          :del $(xxd).rm
        :copy xxd/xxd$EXESUF $DEST_BIN
        :do strip $DEST_BIN/xxd$EXESUF
        :chmod $BINMOD $DEST_BIN/xxd$EXESUF
        :copy $HELPSOURCE/xxd.1 $DEST_MAN
        :chmod $MANMOD $DEST_MAN/xxd.1
# install the runtime tools
        @try:
        @  if aap_has(":tree"):
              # New method: copy everything and delete CVS and AAPDIR dirs
              :copy {recursive} $TOOLSSOURCE/* $DEST_TOOLS
              :tree $DEST_TOOLS {dirname = CVS}
                 :delete {recursive} $name
              :tree $DEST_TOOLS {dirname = AAPDIR}
                 :delete {recursive} $name
        @except:
            # Old method: copy only specific files and directories.
            :copy {recursive} $TOOLSSOURCE/README.txt $TOOLSSOURCE/[a-z]* $DEST_TOOLS
        :chmod $FILEMOD $DEST_TOOLS/*
# replace the path in some tools
        :progsearch perlpath perl
        @if perlpath:
            :cat $TOOLSSOURCE/efm_perl.pl |
                    :eval re.sub("/usr/bin/perl", perlpath, stdin)
                    >! $DEST_TOOLS/efm_perl.pl
        @else:
            :copy $TOOLSSOURCE/efm_perl.pl $DEST_TOOLS

        :progsearch awkpath nawk gawk awk
        @if awkpath:
            :cat $TOOLSSOURCE/mve.awk |
                    :eval re.sub("/usr/bin/nawk", awkpath, stdin)
                    >! $DEST_TOOLS/mve.awk
        @else:
            :copy $TOOLSSOURCE/mve.awk $DEST_TOOLS

        :sys chmod $SCRIPTMOD ``grep -l "^#!" $DEST_TOOLS/*``

# install the language specific files, if they were unpacked
install-languages {virtual}{force}: languages $DEST_LANG $DEST_KMAP
        @if _no.MAKEMO:
           :sys cd $PODIR; $MAKE prefix=$DESTDIR$prefix \
                    LOCALEDIR=$DEST_LANG INSTALL_DATA=cp FILEMOD=$FILEMOD install
        @if os.path.exists(_no.LANGSOURCE):
           :print installing language files
           :copy $LANGSOURCE/README.txt $LANGSOURCE/*.vim $DEST_LANG
           :chmod $FILEMOD $DEST_LANG/*.vim
        @if os.path.exists(_no.KMAPSOURCE):
           :copy $KMAPSOURCE/README.txt $KMAPSOURCE/*.vim $DEST_KMAP
           :chmod $FILEMOD $DEST_KMAP/*.vim

# Install the icons for the KDE GUI.  This differs from the KDE icons for
# other GUIs.
installkdeicons:
        :copy {mkdir} ../runtime/KVim.desktop $DESTDIR$KDE_PREFIX/share/applnk/Editors/
        :chmod 644 $DESTDIR$KDE_PREFIX/share/applnk/Editors/KVim.desktop
        :copy {mkdir} ../runtime/kvim32x32.png $DESTDIR$KDE_PREFIX/share/icons/hicolor/32x32/apps/gvim.png
        :chmod 644 $DESTDIR$KDE_PREFIX/share/icons/hicolor/32x32/apps/gvim.png
        :copy {mkdir} ../runtime/kvim48x48.png $DESTDIR$KDE_PREFIX/share/icons/hicolor/48x48/apps/gvim.png
        :chmod 644 $DESTDIR$KDE_PREFIX/share/icons/hicolor/48x48/apps/gvim.png
        :copy {mkdir} ../runtime/hi16-action-make.png $DESTDIR$KDE_PREFIX/share/icons/hicolor/16x16/actions/hi16-action-make.png
        :copy {mkdir} ../runtime/hi22-action-make.png $DESTDIR$KDE_PREFIX/share/icons/hicolor/22x22/actions/hi22-action-make.png
        :copy {mkdir} ../runtime/kde-tips $DESTDIR$KDE_PREFIX/share/apps/gvim/tips
        :chmod 644 $DESTDIR$KDE_PREFIX/share/apps/kvim/tips

# install the icons for KDE, if the directory exists and the icon doesn't.
ICON48PATH = $DESTDIR$DATADIR/icons/hicolor/48x48/apps
ICON32PATH = $DESTDIR$DATADIR/icons/locolor/32x32/apps
ICON16PATH = $DESTDIR$DATADIR/icons/locolor/16x16/apps
KDEPATH = $HOME/.kde/share/icons
install-icons {virtual}:
        gp = $ICON48PATH/gvim.png
        @if os.path.isdir(_no.ICON48PATH) and not os.path.exists(gp):
           :copy $SCRIPTSOURCE/vim48x48.png $gp
        gp = $ICON32PATH/gvim.png
        @if os.path.isdir(_no.ICON32PATH) and not os.path.exists(gp):
           :copy $SCRIPTSOURCE/vim32x32.png $gp
        gp = $ICON16PATH/gvim.png
        @if os.path.isdir(_no.ICON16PATH) and not os.path.exists(gp):
           :copy $SCRIPTSOURCE/vim16x16.png $gp


$HELPSOURCE/vim.1 $MACROSOURCE $TOOLSSOURCE:
        @if not os.path.exists(_no.TOOLSSOURCE):
            :print Runtime files not found.
            :error You need to unpack the runtime archive before running "make install".

# create links from various names to vim.  This is only done when the links
# (or executables with the same name) don't exist yet.
installlinks {virtual}: $GUI_TARGETS \
                        $DEST_BIN/$EXTARGET \
                        $DEST_BIN/$VIEWTARGET \
                        $DEST_BIN/$RVIMTARGET \
                        $DEST_BIN/$RVIEWTARGET \
                        $INSTALLVIMDIFF

installglinks {virtual}: $DEST_BIN/$GVIMTARGET \
                        $DEST_BIN/$GVIEWTARGET \
                        $DEST_BIN/$RGVIMTARGET \
                        $DEST_BIN/$RGVIEWTARGET \
                        $DEST_BIN/$EVIMTARGET \
                        $DEST_BIN/$EVIEWTARGET \
                        $INSTALLGVIMDIFF

installvimdiff {virtual}: $DEST_BIN/$VIMDIFFTARGET
installgvimdiff {virtual}: $DEST_BIN/$GVIMDIFFTARGET

# These dependencies use an empty buildcheck so that they are only done when
# the target doesn't exist.
$DEST_BIN/$EXTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $EXTARGET

$DEST_BIN/$VIEWTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $VIEWTARGET

$DEST_BIN/$GVIMTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $GVIMTARGET

$DEST_BIN/$GVIEWTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $GVIEWTARGET

$DEST_BIN/$RVIMTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $RVIMTARGET

$DEST_BIN/$RVIEWTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $RVIEWTARGET

$DEST_BIN/$RGVIMTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $RGVIMTARGET

$DEST_BIN/$RGVIEWTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $RGVIEWTARGET

$DEST_BIN/$VIMDIFFTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $VIMDIFFTARGET

$DEST_BIN/$GVIMDIFFTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $GVIMDIFFTARGET

$DEST_BIN/$EVIMTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $EVIMTARGET

$DEST_BIN/$EVIEWTARGET: {buildcheck = }
    :sys cd $DEST_BIN; ln -s $VIMTARGET $EVIEWTARGET

# create links for the manual pages with various names to vim.  This is only
# done when the links (or manpages with the same name) don't exist yet.
installhelplinks {virtual}: $GUI_MAN_TARGETS \
                        $DEST_MAN/$(EXNAME).1 \
                        $DEST_MAN/$(VIEWNAME).1 \
                        $DEST_MAN/$(RVIMNAME).1 \
                        $DEST_MAN/$(RVIEWNAME).1

installghelplinks {virtual}: $DEST_MAN/$(GVIMNAME).1 \
                        $DEST_MAN/$(GVIEWNAME).1 \
                        $DEST_MAN/$(RGVIMNAME).1 \
                        $DEST_MAN/$(RGVIEWNAME).1 \
                        $DEST_MAN/$(GVIMDIFFNAME).1 \
                        $DEST_MAN/$(EVIEWNAME).1

$DEST_MAN/$(EXNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMNAME).1 $(EXNAME).1

$DEST_MAN/$(VIEWNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMNAME).1 $(VIEWNAME).1

$DEST_MAN/$(GVIMNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMNAME).1 $(GVIMNAME).1

$DEST_MAN/$(GVIEWNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMNAME).1 $(GVIEWNAME).1

$DEST_MAN/$(RVIMNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMNAME).1 $(RVIMNAME).1

$DEST_MAN/$(RVIEWNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMNAME).1 $(RVIEWNAME).1

$DEST_MAN/$(RGVIMNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMNAME).1 $(RGVIMNAME).1

$DEST_MAN/$(RGVIEWNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMNAME).1 $(RGVIEWNAME).1

$DEST_MAN/$(GVIMDIFFNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(VIMDIFFNAME).1 $(GVIMDIFFNAME).1

$DEST_MAN/$(EVIEWNAME).1: {buildcheck = }
    :sys cd $DEST_MAN; ln -s $(EVIMNAME).1 $(EVIEWNAME).1

#
# U N I N S T A L L
#
uninstall {virtual}{force}: uninstall_runtime
    :del {force} $DEST_BIN/$VIMTARGET
    :del {force} $DEST_MAN/$(VIMNAME).1 $DEST_MAN/$(VIMNAME)tutor.1
    :del {force} $DEST_BIN/vimtutor
    :del {force} $DEST_BIN/xxd$EXESUF $DEST_MAN/xxd.1
    :del {force} $DEST_BIN/$EXTARGET $DEST_BIN/$VIEWTARGET
    :del {force} $DEST_BIN/$GVIMTARGET $DEST_BIN/$GVIEWTARGET
    :del {force} $DEST_BIN/$RVIMTARGET $DEST_BIN/$RVIEWTARGET
    :del {force} $DEST_BIN/$RGVIMTARGET $DEST_BIN/$RGVIEWTARGET
    :del {force} $DEST_BIN/$VIMDIFFTARGET $DEST_BIN/$GVIMDIFFTARGET
    :del {force} $DEST_BIN/$EVIMTARGET $DEST_BIN/$EVIEWTARGET
    :del {force} $DEST_MAN/$(EXNAME).1 $DEST_MAN/$(VIEWNAME).1
    :del {force} $DEST_MAN/$(GVIMNAME).1 $DEST_MAN/$(GVIEWNAME).1
    :del {force} $DEST_MAN/$(RVIMNAME).1 $DEST_MAN/$(RVIEWNAME).1
    :del {force} $DEST_MAN/$(RGVIMNAME).1 $DEST_MAN/$(RGVIEWNAME).1
    :del {force} $DEST_MAN/$(VIMDIFFNAME).1 $DEST_MAN/$(GVIMDIFFNAME).1
    :del {force} $DEST_MAN/$(EVIMNAME).1 $DEST_MAN/$(EVIEWNAME).1

# Note: "deldir" will fail if any files were added after "make install", that
# is intentionally: Keep files the user added.
uninstall_runtime {virtual}{force}:
    :del {force} $DEST_HELP/*.txt $DEST_HELP/tags $DEST_HELP/*.pl
    :del {force} $SYS_MENU_FILE $SYS_SYNMENU_FILE $SYS_DELMENU_FILE
    :del {force} $SYS_BUGR_FILE $EVIM_FILE $MSWIN_FILE
    :del {force} $DEST_SCRIPT/gvimrc_example.vim $DEST_SCRIPT/vimrc_example.vim
    :del {force} $SYS_FILETYPE_FILE $SYS_FTOFF_FILE $SYS_SCRIPTS_FILE
    :del {force} $SYS_INDOFF_FILE $SYS_INDENT_FILE
    :del {force} $SYS_FTPLUGOF_FILE $SYS_FTPLUGIN_FILE
    :del {force} $SYS_OPTWIN_FILE
    :del {force} $DEST_COL/*.vim $DEST_COL/README.txt
    :del {force} $DEST_SYN/*.vim $DEST_SYN/README.txt
    :del {force} $DEST_IND/*.vim $DEST_IND/README.txt
    :del {force} $DEST_PRINT/*.ps
    :del {force}{recursive} $DEST_MACRO
    :del {force}{recursive} $DEST_TUTOR
    :del {force}{recursive} $DEST_TOOLS
    :del {force}{recursive} $DEST_LANG
    :del {force}{recursive} $DEST_KMAP
    :del {force}{recursive} $DEST_COMP
    :deldir {force} $DEST_HELP $DEST_COL $DEST_SYN $DEST_IND
    :del {force}{recursive} $DEST_FTP/*.vim $DEST_FTP/README.txt
    :del {force} $DEST_AUTO/*.vim $DEST_AUTO/README.txt
    :del {force} $DEST_PLUG/*.vim $DEST_PLUG/README.txt
    :deldir {force} $DEST_FTP $DEST_AUTO $DEST_PLUG $DEST_PRINT $DEST_RT
#       This will fail when other Vim versions are installed, no worries.
    @try:
        :deldir $DEST_VIM
    @except:
        :print Cannot delete $DEST_VIM


# vim: sts=4 sw=4 :
