##   Makefile for lib-src subdirectory in XEmacs.
##   Copyright (C) 1985, 1987, 1988, 1993, 1994 Free Software Foundation, Inc.
##   Copyright (C) 1996, 1997 Sun Microsystems, Inc.

## This file is part of XEmacs.

## XEmacs is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.

## XEmacs is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
## for more details.

## You should have received a copy of the GNU General Public License
## along with XEmacs; see the file COPYING.  If not, write to
## the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
## Boston, MA 02111-1307, USA.

## Note: FSF Makefile.in.in does something weird so that the comments
## above a certain point in this file are in shell format instead of
## in C format.  How the hell is this supposed to work? */

## For performance and consistency, no built-in rules
.SUFFIXES:
.SUFFIXES: .c .h .o
## ==================== Things "configure" will edit ====================

@SET_MAKE@
SHELL = /bin/sh
RM = rm -f
pwd = /bin/pwd

CC=@CC@
CPP=@CPP@
CFLAGS=@CFLAGS@
CPPFLAGS=@CPPFLAGS@
LDFLAGS=@LDFLAGS@
ALLOCA=@ALLOCA@
LN_S=@LN_S@
version=@version@

## This will be the name of the generated binary and is set automatically
## by configure.
PROGNAME=@PROGNAME@

## ==================== Where To Install Things ====================

prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
libdir=@libdir@
srcdir=@srcdir@
archlibdir=@archlibdir@
configuration=@configuration@
## ==================== Utility Programs for the Build =================

INSTALL = @install_pp@ @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@

## ========================== Lists of Files ===========================

#define NO_SHORTNAMES
#define NOT_C_CODE
#include "../src/config.h"

## Things that a user might actually run,
## which should be installed in bindir.
INSTALLABLES_BASE = etags ctags b2m gnuclient ootags
INSTALLABLE_SCRIPTS = rcs-checkin pstogif gnudoit gnuattach
#ifdef HAVE_MS_WINDOWS
INSTALLABLES = $(INSTALLABLES_BASE) runemacs
#else
INSTALLABLES = $(INSTALLABLES_BASE) 
#endif


## Things that Emacs runs internally, or during the build process,
## which should not be installed in bindir.
UTILITIES= make-path wakeup profile make-docfile digest-doc \
	sorted-doc movemail cvtmail fakemail yow hexl \
	gnuserv mmencode
## These need to be conditional on I18N3 make-msgfile make-po

## Like UTILITIES, but they are not system-dependent, and should not be
## deleted by the distclean target.
GEN_SCRIPTS = rcs2log vcdiff gzip-el.sh
PKG_SCRIPTS = add-big-package.sh
SCRIPTS = $(GEN_SCRIPTS) $(PKG_SCRIPTS)

EXECUTABLES= ${UTILITIES} ${INSTALLABLES} ${SCRIPTS} ${INSTALLABLE_SCRIPTS}

SOURCES = COPYING ChangeLog Makefile.in.in README aixcc.lex emacs.csh \
	makedoc.com *.[chy] $(SCRIPTS)
## Additional -D flags for movemail (add to MOVE_FLAGS if desired):
## MAIL_USE_POP		Support mail retrieval from a POP mailbox.
## MAIL_USE_MMDF		Support MMDF mailboxes.
## MAIL_USE_FLOCK	Use flock for file locking (see the comments
##			about locking in movemail.c)
## MAIL_UNLINK_SPOOL	Unlink the user spool mailbox after reading
##			it (instead of just emptying it).
## KERBEROS		Support Kerberized POP.
## KRB5			Support Kerberos Version 5 pop instead of
##			Version 4 (define this in addition to
##			KERBEROS).
## HESIOD		Support Hesiod lookups of user mailboxes.
## MAILHOST		A string, the host name of the default POP
##			mail host for the site.

MOVE_FLAGS=
##
## Additional libraries for movemail:
## For KERBEROS
## MOVE_LIBS= -lkrb -ldes -lcom_err
## For KERBEROS + KRB5
## MOVE_LIBS= -lkrb5 -lcrypto -lisode -lcom_err
## Add "-lhesiod" if HESIOD is defined.

MOVE_LIBS=

## ========================== start of cpp stuff =======================

#ifdef USE_GNU_MAKE
vpath %.c @srcdir@
vpath %.h @srcdir@
#else
VPATH=@srcdir@
#endif

c_switch_general=@c_switch_general@
c_switch_all=@c_switch_all@
ld_switch_general=@ld_switch_general@
ld_switch_all=@ld_switch_all@
ld_libs_general=@ld_libs_general@

## We need to #define emacs to get the right versions of some files.

cppflags = -Demacs -I../src $(CPPFLAGS)
cflags   = $(CFLAGS) $(cppflags) $(c_switch_general)
ldflags  = $(LDFLAGS) $(ld_switch_general) $(ld_libs_general)

## This is the default compilation command.
## But we should never rely on it, because some make version
## failed to find it for getopt.o.
## Using an explicit command made it work.
.c.o:
	${CC} -c $(cflags) $<

all: ${UTILITIES} ${INSTALLABLES} srcdir-symlink.stamp

## Make symlinks for shell scripts if using --srcdir
srcdir-symlink.stamp:
	for f in ${SCRIPTS}; do \
		if test ! -r $$f; then ${LN_S} ${srcdir}/$$f $$f; fi; \
	done; \
	touch $@;

#undef MOVEMAIL_NEEDS_BLESSING
#if !defined (MAIL_USE_FLOCK) && ! defined (MAIL_USE_LOCKF)
#define MOVEMAIL_NEEDS_BLESSING
blessmail = blessmail
blessmail:
	../src/xemacs -batch -l ../lisp/blessmail.el
	chmod +x $@
#endif /* movemail needs blessing */

maybe-blessmail: $(blessmail)
#ifdef MOVEMAIL_NEEDS_BLESSING
## Do not charge ahead and do it!  Let the installer decide.
##	  ./blessmail ${archlibdir}/movemail
	@if test `wc -l <blessmail` != 2; then \
	  dir=`sed -n -e 's/echo mail directory = \(.*\)/\1/p' blessmail`; \
	  echo "*************************************************************";\
	  echo "Assuming $$dir is really the mail spool directory, you should";\
	  echo "run  lib-src/blessmail ${archlibdir}/movemail"; \
	  echo "as root, to give  movemail  appropriate permissions."; \
	  echo "Do that after running  make install."; \
	  echo "You can also do  make blessmail. "; \
	  echo "*************************************************************";\
	fi
#endif

do-blessmail: $(blessmail)
#ifdef MOVEMAIL_NEEDS_BLESSING
	./blessmail ${archlibdir}/movemail
#endif

## Install the internal utilities.  Until they are installed, we can
## just run them directly from lib-src.
${archlibdir}: all
	@echo; echo "Installing utilities run internally by XEmacs."
	./make-path ${archlibdir}
	if test "`(cd ${archlibdir} && $(pwd))`" != "`$(pwd)`"; then \
	  for f in ${UTILITIES}; do \
	    (cd .. && $(INSTALL_PROGRAM) lib-src/$$f ${archlibdir}/$$f) ; \
	  done ; \
	fi
	if test "`(cd ${archlibdir} && $(pwd))`" \
	     != "`(cd ${srcdir}     && $(pwd))`"; then \
	  for f in ${SCRIPTS}; do \
	    (cd .. && $(INSTALL_PROGRAM) ${srcdir}/$$f ${archlibdir}/$$f); \
	  done ; \
	fi

## We do not need to install "wakeup" explicitly, because it will be
## copied when this whole directory is copied.
.PHONY : all maybe-blessmail install uninstall
install: ${archlibdir}
	@echo; echo "Installing utilities for users to run."
	for file in ${INSTALLABLES} ; do \
	  (cd .. && $(INSTALL_PROGRAM) lib-src/$${file} ${bindir}/$${file}) ; \
	done
	for file in ${INSTALLABLE_SCRIPTS} ; do \
	  (cd .. && $(INSTALL_PROGRAM) ${srcdir}/$${file} ${bindir}/$${file}) ; \
	done

uninstall:
	(cd ${bindir} && \
	 $(RM) ${INSTALLABLES} ${INSTALLABLE_SCRIPTS})
	(cd ${archlibdir} && \
	 $(RM) ${UTILITIES} ${INSTALLABLES} ${SCRIPTS} ${INSTALLABLE_SCRIPTS})

.PHONY: mostlyclean clean distclean realclean extraclean
mostlyclean:
	$(RM) *.o *.i core
clean: mostlyclean
	$(RM) ${INSTALLABLES} ${UTILITIES} *.exe
distclean: clean
	$(RM) DOC *.tab.c *.tab.h aixcc.c TAGS
	$(RM) Makefile Makefile.in blessmail config.values
realclean: distclean
extraclean: distclean
	$(RM) *~ \#*

.PHONY: unlock relock check
unlock:
	chmod u+w $(SOURCES)
relock:
	chmod u-w $(SOURCES)

## Test the contents of the directory.
check:
	@echo "We don't have any tests for XEmacs yet."

TAGS: etags
	etags *.[ch]

GETOPTOBJS = getopt.o getopt1.o $(ALLOCA)
GETOPTDEPS = $(GETOPTOBJS) ${srcdir}/getopt.h
getopt.o: ${srcdir}/getopt.c ${srcdir}/getopt.h
	${CC} -c $(cflags) ${srcdir}/getopt.c
getopt1.o: ${srcdir}/getopt1.c ${srcdir}/getopt.h
	${CC} -c $(cflags) ${srcdir}/getopt1.c
alloca.o: ${srcdir}/../src/alloca.c
	${CC} -c $(cflags) ${srcdir}/../src/alloca.c

regex.o: ${srcdir}/../src/regex.c ${srcdir}/../src/regex.h
	$(CC) -c `echo $(cflags) | sed 's/-Demacs/ /'` \
		-DINHIBIT_STRING_HEADER ${srcdir}/../src/regex.c

etags_args = -I. $(cflags) -I${srcdir} -I${srcdir}/../src \
	-DVERSION='"${version}"' ${srcdir}/etags.c \
	$(GETOPTOBJS) regex.o $(ldflags)
etags_deps   = ${srcdir}/etags.c $(GETOPTDEPS) regex.o ../src/config.h

etags: ${etags_deps}
	$(CC) ${etags_args} -o $@

runemacs_args = -I. $(cflags) -I${srcdir} -I${srcdir}/../src \
	-DVERSION='"${version}"' ${srcdir}/../nt/runemacs.c \
	$(ldflags) -Wl,--subsystem,windows
runemacs_deps   = ${srcdir}/../nt/runemacs.c ${srcdir}/../nt/xemacs.ico ../src/config.h

runemacs: ${runemacs_deps}
	echo "runemacs ICON DISCARDABLE \"../nt/xemacs.ico\"" \
	| windres -o runemacs_res.o
	$(CC) runemacs_res.o ${runemacs_args} -o $@

ootags_args = -I. $(cflags) -I${srcdir} -I${srcdir}/../src \
	-DVERSION='"${version}"' ${srcdir}/ootags.c \
	$(GETOPTOBJS) regex.o $(ldflags)
ootags_deps   = ${srcdir}/ootags.c $(GETOPTDEPS) regex.o ../src/config.h

ootags: ${ootags_deps}
	$(CC) ${ootags_args} -o $@

## ctags depends on etags to assure that parallel makes do not write
## two etags.o files on top of each other.
ctags: ${etags_deps} etags
	$(CC) -DCTAGS ${etags_args} -o $@

wakeup: ${srcdir}/wakeup.c
	$(CC) $(cflags) ${srcdir}/wakeup.c $(ldflags) -o $@

profile: ${srcdir}/profile.c
	$(CC) $(cflags) ${srcdir}/profile.c $(ldflags) -o $@

make-docfile: ${srcdir}/make-docfile.c
	$(CC) $(cflags) ${srcdir}/make-docfile.c $(ldflags) -o $@

digest-doc: ${srcdir}/digest-doc.c
	$(CC) $(cflags) ${srcdir}/digest-doc.c $(ldflags) -o $@

sorted-doc: ${srcdir}/sorted-doc.c
	$(CC) $(cflags) ${srcdir}/sorted-doc.c $(ldflags) -o $@

b2m: ${srcdir}/b2m.c ../src/config.h
	$(CC) $(cflags) ${srcdir}/b2m.c $(ldflags) -o $@

movemail: ${srcdir}/movemail.c ${srcdir}/pop.c ${srcdir}/pop.h ../src/config.h
	$(CC) $(cflags) ${MOVE_FLAGS} ${srcdir}/movemail.c ${srcdir}/pop.c $(ldflags) ${MOVE_LIBS} -o $@

cvtmail: ${srcdir}/cvtmail.c
	$(CC) $(cflags) ${srcdir}/cvtmail.c $(ldflags) -o $@

fakemail: ${srcdir}/fakemail.c ../src/config.h
	$(CC) $(cflags) ${srcdir}/fakemail.c $(ldflags) -o $@

yow: ${srcdir}/yow.c ../src/paths.h
	$(CC) $(cflags) ${srcdir}/yow.c $(ldflags) -o $@

hexl: ${srcdir}/hexl.c
	$(CC) $(cflags) ${srcdir}/hexl.c $(ldflags) -o $@

make-msgfile: ${srcdir}/make-msgfile.c
	$(CC) $(cflags) ${srcdir}/make-msgfile.c $(ldflags) -o $@

make-po: ${srcdir}/make-po.c
	$(CC) $(cflags) ${srcdir}/make-po.c $(ldflags) -o $@

cflags_gnuserv  = $(CFLAGS) $(cppflags) $(c_switch_all)
ldflags_gnuserv = $(LDFLAGS) $(ld_switch_all) @libs_xauth@ $(ld_libs_general)
gnuslib.o: ${srcdir}/gnuslib.c ${srcdir}/gnuserv.h ../src/config.h
	$(CC) -c $(cflags_gnuserv) ${srcdir}/gnuslib.c
gnuclient: ${srcdir}/gnuclient.c gnuslib.o ${srcdir}/gnuserv.h
	$(CC) $(cflags_gnuserv) ${srcdir}/$@.c gnuslib.o ${ldflags_gnuserv} -o $@
gnuserv: ${srcdir}/gnuserv.c gnuslib.o ${srcdir}/gnuserv.h
	$(CC) $(cflags_gnuserv) ${srcdir}/$@.c gnuslib.o ${ldflags_gnuserv} -o $@

## mmencode binary is used by tm - but is really part of the metamail package
## mmencode.c was merged copy of mmencode.c and codes.c of metamail
mmencode : ${srcdir}/mmencode.c
	$(CC) $(cflags) ${srcdir}/mmencode.c -o $@


## The timer utility (timer.c, getdate.y) is not used in XEmacs
## because XEmacs provides built-in timer facilities.

make-path: ${srcdir}/make-path.c ../src/config.h
	$(CC) $(cflags) ${srcdir}/make-path.c -o $@

## These are NOT included in INSTALLABLES or UTILITIES.
## See ../src/Makefile.in.in.
aixcc: ${srcdir}/aixcc.c
	$(CC) $(cflags) ${srcdir}/aixcc.c -o $@

aixcc.c: ${srcdir}/aixcc.lex
	lex ${srcdir}/aixcc.lex
	mv lex.yy.c aixcc.c
