# Makefile for GNU Awk.
#
# Copyright (C) 1986, 1988, 1989 the Free Software Foundation, Inc.
# 
# This file is part of GAWK, the GNU implementation of the
# AWK Progamming Language.
# 
# GAWK 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 1, or (at your option)
# any later version.
# 
# GAWK 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 GAWK; see the file COPYING.  If not, write to
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

# User tunable macros

# CFLAGS: options to the C compiler
#
#	-O	optimize
#	-g	include dbx/sdb info
#	-gg	include gdb debugging info; only for GCC (deprecated)
#	-pg	include new (gmon) profiling info
#	-p	include old style profiling info (System V)
#
#	To port GAWK, examine and adjust the following flags carefully.
#	In addition, you will have to look at alloca below.
#	The intent (eventual) is to not penalize the most-standard-conforming
#	systems with a lot of #define's.
#
#	-DBCOPY_MISSING		- bcopy() et al. are missing; will replace
#				  with a #define'd memcpy() et al. -- use at
#				  your own risk (should really use a memmove())
#	-DSPRINTF_INT		- sprintf() returns int (most USG systems)
#	-DBLKSIZE_MISSING	- st_blksize missing from stat() structure
#				  (most USG systems)
#	-DBSDSTDIO		- has a BSD internally-compatible stdio
#	-DDOPRNT_MISSING	- lacks doprnt() routine
#	-DDUP2_MISSING		- lacks dup2() system call (S5Rn, n < 4)
#	-DGCVT_MISSING		- lacks gcvt() routine
#	-DGETOPT_MISSING	- lacks getopt() routine
#	-DMEMCMP_MISSING	- lacks memcmp() routine
#	-DMEMCPY_MISSING	- lacks memcpy() routine
#	-DMEMSET_MISSING	- lacks memset() routine
#	-DRANDOM_MISSING	- lacks random() routine
#	-DSTRCASE_MISSING	- lacks strcasecmp() routine
#	-DSTRCHR_MISSING	- lacks strchr() and strrchr() routines
#	-DSTRERROR_MISSING	- lacks (ANSI C) strerror() routine
#	-DSTRTOD_MISSING	- lacks strtod() routine
#	-DTMPNAM_MISSING	- lacks or deficient tmpnam() routine
#	-DVPRINTF_MISSING	- lacks vprintf and associated routines
#	-DSIGTYPE=int		- signal routines return int (default void)

# Sun running SunOS 4.x
# MISSING = -DSTRERROR_MISSING -DSTRCASE_MISSING

# SGI Personal Iris (Sys V derived)
# MISSING = -DSPRINTF_INT -DBLKSIZE_MISSING -DSTRERROR_MISSING -DRANDOM_MISSING

# VAX running Ultrix 3.x
# MISSING = -DSTRERROR_MISSING

# A generic 4.2 BSD machine
# (eliminate GETOPT_MISSING for 4.3 release)
# (eliminate STRCASE_MISSING and TMPNAM_MISSING for Tahoe release)
# MISSING = -DBSDSTDIO -DMEMCMP_MISSING -DMEMCPY_MISSING -DMEMSET_MISSING \
#	-DSTRERROR_MISSING -DSTRTOD_MISSING -DVPRINTF_MISSING \
#	-DSTRCASE_MISSING -DTMPNAM_MISSING \
#	-DGETOPT_MISSING -DSTRCHR_MISSING -DSIGTYPE=int

# On Amdahl UTS, a SysVr2-derived system
# MISSING = -DBCOPY_MISSING -DSPRINTF_INT -DRANDOM_MISSING -DSTRERROR_MISSING \
#	-DSTRCASE_MISSING -DDUP2_MISSING # -DBLKSIZE_MISSING ??????

# Comment out the next line if you don't have gcc.
# Also choose just one of -g and -O.
# CC=		 gcc
# for DOS
CC= cl
POPEN = popen.obj

# for DOS, most of the missing symbols are defined in MISSING.C in order to
# get around the command line length limitations
MISSING = -DSPRINTF_INT -DBLKSIZE_MISSING -DBCOPY_MISSING
LINKFLAGS= /PACK /NOE /NOI /st:0x1800
# for debugging
#LINKFLAGS= /MAP /CO /FAR /PACK /NOE /NOI /st:0x1800

# also give suffixes and explicit rule for DOS
.SUFFIXES : .obj .c
.c.obj:
	$(CC) -c $(CFLAGS) -I. -AL $<
	
OPTIMIZE=	-Ox
PROFILE=	#-pg
DEBUG=		#-Od -Zi -DDEBUG #-DMEMDEBUG #-DFUNC_TRACE #-DMPROF
DEBUGGER=	#-g -Bstatic
WARN=		#-W -Wunused -Wimplicit -Wreturn-type -Wcomment	# for gcc only

# Parser to use on grammar -- if you don't have bison use the first one
PARSER = yacc
#PARSER = bison -y

# ALLOCA
#	Set equal to alloca.obj if your system is S5 and you don't have
#	alloca. Uncomment one of the rules below to make alloca.obj from
#	either alloca.s or alloca.c.
ALLOCA= alloca.obj

#
# With the exception of the alloca rule referred to above, you shouldn't
# need to customize this file below this point.
#

FLAGS= $(MISSING) $(DEBUG)
CFLAGS= $(FLAGS) $(DEBUGGER) $(PROFILE) $(OPTIMIZE) $(WARN)

# object files
O1 = main.obj eval.obj builtin.obj msg.obj debug.obj io.obj field.obj array.obj node.obj
O2 = version.obj missing.obj $(POPEN)

AWKOBJS = $(O1) $(O2)


# for unix
# AWKTAB = awk.tab.obj
# for dos
AWKTAB = awk_tab.obj



ALLOBJS = $(AWKOBJS) $(AWKTAB)

# GNUOBJS
#	GNU stuff that gawk uses as library routines.
GNUOBJS= regex.obj $(ALLOCA)

# source and documentation files
SRC =	main.c eval.c builtin.c msg.c \
	debug.c io.c field.c array.c node.c missing.c

ALLSRC= $(SRC) awk.tab.c

AWKSRC= awk.h awk.y $(ALLSRC) version.sh patchlev.h

GNUSRC = alloca.c alloca.s regex.c regex.h

COPIES = missing.d/dup2.c missing.d/gcvt.c missing.d/getopt.c \
	missing.d/memcmp.c missing.d/memcpy.c missing.d/memset.c \
	missing.d/random.c missing.d/strcase.c missing.d/strchr.c \
	missing.d/strerror.c missing.d/strtod.c missing.d/tmpnam.c \
	missing.d/vprintf.c

SUPPORT = support/texindex.c support/texinfo.tex

DOCS= gawk.1 gawk.texinfo

INFOFILES= gawk-info gawk-info-1 gawk-info-2 gawk-info-3 gawk-info-4 \
	   gawk-info-5 gawk-info-6 gawk.aux gawk.cp gawk.cps gawk.fn \
	   gawk.fns gawk.ky gawk.kys gawk.pg gawk.pgs gawk.toc \
	   gawk.tp gawk.tps gawk.vr gawk.vrs

MISC = CHANGES COPYING FUTURES Makefile PROBLEMS README

PCSTUFF= pc.d/Makefile.pc pc.d/popen.c pc.d/popen.h

ALLDOC= gawk.dvi $(INFOFILES)

ALLFILES= $(AWKSRC) $(GNUSRC) $(COPIES) $(MISC) $(DOCS) $(ALLDOC) $(PCSTUFF) $(SUPPORT)

# Release of gawk.  There can be no leading or trailing white space here!
REL=2.11
# for DOS
GAWK = gawk.exe
$(GAWK) : $(ALLOBJS) $(GNUOBJS) names.lnk
	link @names.lnk
	-@del names.lnk

#GNULIB = ..\lib\lgnu.lib 
GNULIB = 
names.lnk : makefile
	echo $(O1) + > $@
	echo $(O2) + >> $@
	echo $(AWKTAB) + >> $@
	echo $(GNUOBJS) >> $@
	echo $(GAWK) >> $@
	echo gawk.map >> $@
	echo $(GNULIB) $(LINKFLAGS) >> $@

popen.obj : pc.d\popen.c
	$(CC) -c $(CFLAGS) -Ipc.d -W2 -AL -Fo$*.obj pc.d\popen.c

# rules to build gawk
#$(GAWK) : $(ALLOBJS) $(GNUOBJS)
#	$(CC) -o gawk $(CFLAGS) $(ALLOBJS) $(GNUOBJS) -lm

$(AWKOBJS): awk.h

main.obj: patchlev.h

# for dos
awk_tab.obj : awk.y awk.h
	$(YACC) awk.y
	$(CC) -c $(CFLAGS) -Ipc.d -W2 -AL -Fo$@ ytab.c
	@-del ytab.c

# auxiliary rules for release maintenance
lint: $(ALLSRC)
	lint -hcbax $(FLAGS) $(ALLSRC)

xref:
	cxref -c $(FLAGS) $(ALLSRC) | grep -v '	/' >xref

clean:
	rm -f gawk *.obj core awk.objutput awk.tab.c gmon.objut make.objut version.c

clobber: clean
	rm -f $(ALLDOC) gawk.log

gawk.dvi: gawk.texinfo
	tex gawk.texinfo ; texindex gawk.??
	tex gawk.texinfo ; texindex gawk.??
	tex gawk.texinfo

$(INFOFILES): gawk.texinfo
	makeinfo gawk.texinfo

srcrelease: $(AWKSRC) $(GNUSRC) $(DOCS) $(MISC) $(COPIES) $(PCSTUFF) $(SUPPORT)
	-mkdir gawk-$(REL)
	cp -p $(AWKSRC) $(GNUSRC) $(DOCS) $(MISC) gawk-$(REL)
	-mkdir gawk-$(REL)/missing.d
	cp -p $(COPIES) gawk-$(REL)/missing.d
	-mkdir gawk-$(REL)/pc.d
	cp -p $(PCSTUFF) gawk-$(REL)/pc.d
	-mkdir gawk-$(REL)/support
	cp -p $(SUPPORT) gawk-$(REL)/support
	tar -cf - gawk-$(REL) | compress > gawk-$(REL).tar.Z

docrelease: $(ALLDOC)
	-mkdir gawk-$(REL)-doc
	cp -p $(INFOFILES) gawk.dvi gawk-$(REL)-doc
	nroff -man gawk.1 > gawk-$(REL)-doc/gawk.1.pr
	tar -cf - gawk-$(REL)-doc | compress > gawk-doc-$(REL).tar.Z

psrelease: docrelease
	-mkdir gawk-postscript
	dvi2ps gawk.dvi > gawk-postscript/gawk.postscript
	psroff -t -man gawk.1 > gawk-postscript/gawk.1.ps
	tar -cf - gawk-postscript | compress > gawk.postscript.tar.Z

release: srcrelease docrelease psrelease
	rm -fr gawk-postscript gawk-$(REL) gawk-$(REL)-doc

diff:
	for i in RCS/*; do rcsdiff -c -b $$i > `basename $$i ,v`.diff; done
