# 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
	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
	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
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
### 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
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
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_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_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_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 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_PLUG/*.vim $DEST_PLUG/README.txt
    :deldir {force} $DEST_FTP $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 :
