# Makefile for gawk (GNU awk)                                   1 Sep 1995
#
# - for GNU C (djgpp)         [executable for DOS (32-bit)]
# - for GNU C (emx)           [executable for OS/2 2.x or DOS (32-bit)]
# - for Microsoft C 7         [ececutable for DOS (16-bit)]
# - for Microsoft C 6.00A     [executable for OS/2 or DOS (16-bit)]
# - for Microsoft C 5.1       [executable for OS/2 or DOS (16-bit)]

# Tested with ndmake and dmake-3.8 under DOS and dmake and
# GNU make under OS/2. Compiling with dmake under DOS may require 
# the DOS-only version of dmake (so that swapping works).

default:
	@echo "Enter $(MAK) target "
	@echo " where 'target' is chosen from                          " 
	@echo "  djgpp ... DOS 32-bit exe [GNU C, Delorie, v1 or v2]   "
	@echo "  emx ..... OS/2 32-bit exe [emx/gcc; uses emxlibc.dll] "
	@echo "  emxbnd .. OS/2 and DOS 32-bit exe [emx/gcc]           "
	@echo "  msc ..... DOS exe [Microsoft C 7]                     "
	@echo "  msc6 .... DOS exe [Microsoft C 6.00a]                 "
	@echo "  msc6os2 . OS/2 exe [Microsoft C 6.00a]                "
	@echo "  msc6bnd . OS/2 and DOS exe [Microsoft C 6.00a]        "
	@echo "  ----------------------------------------------------- "
	@echo "  test .... Perform tests (see README_d/README.pc)      "
	@echo "  install . Install gawk under $(prefix)/               "

# Support dropped in 3.0
#	@echo "  msc51     DOS exe [Microsoft C 5.1]                   "
#	@echo "  msc51bnd  OS/2 and DOS exe [Microsoft C 5.1]          "

#======================= Configuration ==================================
RSPFILE = gawk.rsp
#
# Choose method for passing arguments to the linker.
#
# If compiling under OS/2 or if make can pass long lines
#LDRSP = $(GAWKOBJS)
#LINKRSP = $(LDRSP)
#
# else if make == dmake
# Response files for linker: dmake allows the macro expansion
#   $(macro_name:modifier_list:modifier_list:...)
# The macro mktmp creates a temporary file for the linker. 
# The 't' modifier is for tokenization. 
#LDRSP =   @$(mktmp $(<:t"\n"))
#LINKRSP = @$(mktmp $(<:t"+\n") ) # Space before final paren req
#
# else use brain-dead approach (emxbnd will need 'tr').
RSP = $(RSPFILE)
LDRSP = @$(RSP)
LINKRSP = $(LDRSP)
#------------------------------------------------------------------------
# Some makes do not define MAKE (and ndmake does not allow a define).
# Define MAK to be your make command.
#MAK = $(MAKE) $(MAKEFILE)
MAK = $(MAKE)
#MAKEFILE = -f Makefile
#MAK = make45 $(MAKEFILE)
#------------------------------------------------------------------------
# Define the base directory for the install. "make install" will install
# in bin, lib/awk, man, and info under $(prefix)/. Most likely, you should
# edit config.h so that $(prefix)/lib/awk appears as part of DEFPATH.
#prefix =
prefix = c:/gnu
#
# Define the install method. Method 1 is Unix-like (and requires cat,
# cp, mkdir, sed, and sh); method 2 uses gawk and batch files.
install = 1
#========================================================================
# End of general configuration. Some platform-specific configuration
# notes appear below.


#========================================================================
#========================== DJGPP =======================================
#========================================================================

LDJG = $(CC) $(LF) -o gawk $(LDRSP) $(LF2)
#BDJG = coff2exe -s /djgpp/bin/go32.exe gawk
BDJG = coff2exe gawk

djgpp:
	$(MAK) all \
	CC=gcc O=.o CF=-O \
	LINK=LDJG LF=-s LF2=-lm \
	BIND=BDJG

djgpp-debug:
	$(MAK) all \
	CC=gcc O=.o CF=-g \
	LINK=LDJG LF2=-lm \
	BIND=BDJG

#========================================================================
#========================== EMX =========================================
#========================================================================

# Link command for OS/2 versions.
LEMX = $(CC) $(LF) -o $@ $(GAWKOBJS) gawk.def -lbsd $(LF2)

# Link and bind for DOS and OS/2 versions.
# emx-09 needs '-p' emx option here or in EMXOPT environ var.
LEMXBND = $(CC) $(LF) -o a.out $(LDRSP) gawk.def -lbsd $(LF2)
BEMX = emxbind -b /emx/bin/emxl.exe a.out $@ -p
#BEMX = emxbind -b /emx/bin/emx.exe a.out $@ -p

emx:
	$(MAK) all \
	"CC=gcc -Zomf" O=.obj "CF=-O -DOS2" \
	LINK=LEMX "LF=-s -Zcrtdll -Zstack 512" RSP=

emxbnd:
	$(MAK) all \
	CC=gcc O=.o "CF=-O -DOS2 -DMSDOS" OBJ=popen.o \
	LINK=LEMXBND LF=-s \
	BIND=BEMX "P=|tr \" \" \"\n\""

emxbnd-debug:
	$(MAK) all \
	CC=gcc O=.o CF="-g -DOS2 -DMSDOS" OBJ=popen.o \
	LINK=LEMXBND \
	BIND=BEMX "P=|tr \" \" \"\n\""

#========================================================================
#========================== MSC =========================================
#========================================================================

# stdargv, glob, and director are from Stewartson's sh. These provide
# globbing and enhanced argument-passing. MSC setargv.obj is a 
# more limited alternative (and it will permit a bound version).
#STDARGV = stdargv.obj glob.obj director.obj 
STDARGV = setargv.obj

# Optimization and library options:
# Os == optimize for size, Ot == optimize for speed, G2 == 286 or better
#MSCOPT = -Os -G2
MSCOPT = -Ot # -G2
# Alternate lib, does not use math coprocessor.
#MSCLIB = llibca
#MSCCL = -FPa
# Emulator lib, uses math coprocessor if present.
MSCLIB = llibce
MSCCL = -FPi
#MSCCL = -FPc

LMSC = link $(LF) $(LINKRSP) $(STDARGV)/NOE,$@,,/NOD:llibce $(MSCLIB)$(LF2)/STACK:0x6f00;

# CLMSC-linking works when building under OS/2
CLMSC = $(CC) -o $@ $(LF) $(GAWKOBJS) $(STDARGV) $(LF2) -link /NOE/NOI/STACK:0x6f00

BMSC = bind $@ /n DOSMAKEPIPE DOSCWAIT

# Ugly hack: config.h defines __STDC__ if not defined on command-line.
# OS/2 versions can't use -Za in getid.c. MSC7 uses stub headers in pc/ 
# due to ANSI conflicts. MSC 5.1 defines __STDC__=0 regardless of ANSI flag.

# dmake-3.8 runs out of memory under DOS. Request that dmake
# swap itself out on these targets. Note that this won't have
# any affect on the bound OS/2 and DOS version of dmake-3.8.

.SWAP: msc msc-debug msc6 msc6os2 msc6bnd msc51 check

msc: 
	$(MAK) all \
	"CC=cl -nologo $(MSCCL)" O=.obj "CF=-AL -Ze -Ipc/include $(MSCOPT)" \
	OBJ=popen.obj \
	LINK=LMSC P=+

msc-debug: 
	$(MAK) all \
	"CC=cl $(MSCCL)" O=.obj "CF=-AL -Ze -Ipc/include -W2 -Zi -Od" \
	OBJ=popen.obj \
	LINK=LMSC LF2=/CO P=+

msc6: 
	$(MAK) all \
	"CC=cl -nologo $(MSCCL)" O=.obj "CF=-AL -Za $(MSCOPT)" \
	OBJ=popen.obj \
	LINK=LMSC P=+

msc6os2: 
	$(MAK) all \
	"CC=cl $(MSCCL)" O=.obj "CF=-AL -DOS2 -UMSDOS $(MSCOPT)" \
	LINK=LMSC "LF2=p,gawk.def" P=+

msc6bnd:
	$(MAK) all \
	"CC=cl $(MSCCL)" O=.obj "CF=-AL -DOS2 $(MSCOPT)" \
	OBJ=popen.obj \
	LINK=LMSC "LF2=p,gawk.def" P=+ \
	BIND=BMSC

# Support dropped in 3.0
#msc51: 
#	$(MAK) all \
#	"CC=cl $(MSCCL)" O=.obj "CF=-AL -Za -D_MSC_VER=510 $(MSCOPT)" \
#	OBJ=popen.obj \
#	LINK=LMSC P=+
#
#msc51bnd:
#	$(MAK) all \
#	"CC=cl -AL ($MSCCL)" O=.obj "CF=-DOS2 -D_MSC_VER=510 $(MSCOPT)" \
#	OBJ=popen.obj \
#	LINK=CLMSC "LF=-Lp -Fb" "LF2=gawk.def"

#========================================================================

# Define BIND for BINDless compiles, otherwise $($(BIND)) may break.
BIND = EMPTY
EMPTY=

CFLAGS = $(CF) -DGAWK -I. -DHAVE_CONFIG_H

# object files
AWKOBJS1 = array$O builtin$O eval$O field$O gawkmisc$O io$O main$O 
AWKOBJS2 = missing$O msg$O node$O re$O version$O
AWKOBJS = $(AWKOBJS1) $(AWKOBJS2)

ALLOBJS = $(AWKOBJS) awktab$O getid$O $(OBJ)

# GNUOBJS
#	GNU stuff that gawk uses as library routines.
GNUOBJS= getopt$O getopt1$O regex$O dfa$O

GAWKOBJS = $(ALLOBJS) $(GNUOBJS)

# clear out suffixes list
# .SUFFIXES:
.SUFFIXES: .c $O

.c$O:
	$(CC) -c $(CFLAGS) $<

# rules to build gawk
all : gawk.exe

gawk.exe:: $(ALLOBJS) $(GNUOBJS) $(RSP)
	$($(LINK))
	$($(BIND))
	
$(RSPFILE) : $(GAWKOBJS)
	echo $(AWKOBJS1)$P > $@
	echo $(AWKOBJS2)$P >> $@
	echo awktab$O getid$O $(OBJ) $(GNUOBJS)$P >> $@

$(ALLOBJS):	awk.h dfa.h regex.h config.h

gawkmisc$O:	pc/gawkmisc.pc

getopt$O:	getopt.h

getopt1$O:	getopt.h

main$O:	patchlevel.h

# A bug in ndmake requires the following rule
awktab$O: awk.h awktab.c
	$(CC) -c $(CFLAGS) awktab.c

awktab.c:	awk.y
	bison -o $@ awk.y

alloca$O:	alloca.c

#.PRECIOUS: install
#.PHONY: install

install: install$(install)

install1: 
	echo extproc sh $(prefix)/bin/igawk.cmd > igawk.cmd
	echo shift >> igawk.cmd
	cat pc/awklib/igawk >> igawk.cmd
	sed "s;igawk;$(prefix)/bin/igawk;" pc/awklib/igawk.bat > igawk.bat
	sh mkinstal.sh $(prefix)/bin
	sh mkinstal.sh $(prefix)/lib/awk $(prefix)/man/man1 $(prefix)/info
	cp gawk.exe igawk.bat igawk.cmd pc/awklib/igawk $(prefix)/bin
	cp awklib/eg/lib/* pc/awklib/igawk.awk $(prefix)/lib/awk
	cp doc/*.1 $(prefix)/man/man1
	cp doc/gawk.info $(prefix)/info

# install2 is equivalent to install1, but doesn't require cp, sed, etc.
install2:
	gawk -v prefix=$(prefix) -f install.awk

clean:
	rm -rf gawk gawk.exe *.o *.obj core a.out $(RSPFILE)
#	cd doc && $(MAKE) clean
#	cd test && $(MAKE) clean
#	cd awklib && $(MAKE) clean

awklib/eg: doc/gawk.texi
	rm -fr awklib/eg
	sh -c "cd awklib && ../gawk -f extract.awk ../doc/gawk.texi"

check:
	cd test && $(MAK) -k AWK=../gawk.exe

test:	check
