# pc/Makefile
# This file is part of RCS.
#
# RCS 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.
#
# RCS 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 RCS; see the file COPYING.  If not, write to
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#
# Report problems and direct all questions to:
#
#    rcs-bugs@cs.purdue.edu

# Supported MAKE programs:
# - IBM or Microsoft NMAKE
# - DMAKE 3.8 or 4.0
# - GNU make 3.64 or higher

# Supported compilers and target environments:
# - emx+gcc 0.9c for OS/2, DOS or Win95/NT 32-bit (with RSXNT 1.3)
# - Microsoft C 10.0 (Visual C++ 4.0) for Win95/NT 32-bit
# - Microsoft C 6.00A for OS/2 or DOS 16-bit
# - Watcom C/C++ 10.6 for OS/2, DOS or Win95/NT 32-bit
# - Watcom C/C++ 10.6 for OS/2 or DOS 16-bit

# The PC-specific source code subdirectory.
D = pc

# default target
default:
	@echo "Available targets:"
	@echo "	emxos2 emxos2-static emxos2-debug emxdos"
	@echo "	emxnt emxnt-static emxnt-debug"
	@echo "	mscos2 mscos2-debug mscdos mscdos-debug"
	@echo "	mscnt mscnt-static mscnt-debug"
	@echo "	w32os2 w32os2-static w32os2-debug"
	@echo "	w32nt w32nt-static w32nt-debug"
	@echo "	w16os2 w16os2-debug w16dos w16dos-debug"

# emx 0.9c (gcc) -> 32-bit OS/2 executables
emxos2:
	$(MAKE) all -f $D/Makefile EMXO="" OS="os2" \
	CC="gcc -Zomf" CCFLAGS="-O -D__OS2__ -DRCSDLL" \
	LDFLAGS="-Zstack 512 -Zcrtdll -s $D/rcs.def -o ./" \
	DLDFLAGS="-Zdll -Zcrtdll -s -o ./"
emxos2-static:
	$(MAKE) all -f $D/Makefile EMXS="" OS="os2" \
	CC="gcc -Zomf" CCFLAGS="-O -D__OS2__" \
	LDFLAGS="-Zstack 512 -Zsys -s $D/rcs.def -o ./"
emxos2-debug:
	$(MAKE) all -f $D/Makefile EMXS="" OS="os2" \
	CC="gcc -g" CCFLAGS="-D__OS2__" \
	LDFLAGS="-o ./" O=".o" A=".a" AR="ar"

# emx 0.9c (gcc) -> 32-bit DOS executables
emxdos:
	$(MAKE) all -f $D/Makefile EMXS="" OS="dos" \
	CC="gcc" CCFLAGS="-O -D__MSDOS__" \
	LDFLAGS="-s -o ./" O=".o" A=".a" AR="ar"

# emx 0.9c (gcc) -> 32-bit Win95/NT executables
emxnt:
	$(MAKE) all -f $D/Makefile EMXN="" OS="nt" \
	CC="gcc -Zwin32 -Zcrtdll=rsxntcs" CCFLAGS="-O -D__MSDOS__ -DRCSDLL" \
	LDFLAGS="-s -o ./" O=".o" A=".a" AR="ar" \
	DLDFLAGS="-Zdll -ladvapi32 -s -o ./"
emxnt-static:
	$(MAKE) all -f $D/Makefile EMXS="" OS="nt" \
	CC="gcc -Zwin32" CCFLAGS="-O -D__MSDOS__" \
	LDFLAGS="-ladvapi32 -s -o ./" O=".o" A=".a" AR="ar"
emxnt-debug:
	$(MAKE) all -f $D/Makefile EMXS="" OS="nt" \
	CC="gcc -Zwin32 -g" CCFLAGS="-D__MSDOS__" \
	LDFLAGS="-ladvapi32 -o ./" O=".o" A=".a" AR="ar"

# Microsoft C 6.00A -> 16-bit OS/2 executables
# remove the -Lp option if the default libraries are the protected mode ones
mscos2:
	$(MAKE) all -f $D/Makefile MSC="" OS="os2" \
	CC="cl -nologo -AS" CCFLAGS="-Zp -G2s -Ocegit -D__OS2__" \
	LDFLAGS="-F 4000 -Lp setargv.obj $D\rcs.def -Fe" LINK="/NOE"
mscos2-debug:
	$(MAKE) all -f $D/Makefile MSC="" OS="os2" \
	CC="cl -nologo -Zi -AM" CCFLAGS="-Zp -G2 -Od -D__OS2__" \
	LDFLAGS="-F 4000 -Lp $D\rcs.def -Fe" LINK="/NOE"

# Microsoft C 6.00A -> 16-bit DOS executables
# remove the -Lr option if the default libraries are the real mode ones
mscdos:
	$(MAKE) all -f $D/Makefile MSC="" OS="dos" \
	CC="cl -nologo -AS" CCFLAGS="-Zp -G2s -Ocegit -D__MSDOS__" \
	LDFLAGS="-F 4000 -Lr setargv.obj -Fe" LINK="/NOE"
mscdos-debug:
	$(MAKE) all -f $D/Makefile MSC="" OS="dos" \
	CC="cl -nologo -Zi -AM" CCFLAGS="-Zp -G2s -Od -D__MSDOS__" \
	LDFLAGS="-F 4000 -Lr -Fe" LINK="/NOE"

# Microsoft C 10.00 -> 32-bit Win32 executables
mscnt:
	$(MAKE) lib -f $D/Makefile MSCD="" OS="nt" \
	CC="cl -nologo -MD" DLDFLAGS="advapi32.lib -Fe" \
	CCFLAGS="-Zp -Gs -Ogti -D__MSDOS__ -D__32BIT__"
	$(MAKE) exe -f $D/Makefile MSCD="" OS="nt" \
	CC="cl -nologo -MD" LDFLAGS="-F 50000 setargv.obj -Fe" \
	CCFLAGS="-Zp -Gs -Ogti -D__MSDOS__ -D__32BIT__ -DRCSDLL -DRCSIMP"
mscnt-static:
	$(MAKE) all -f $D/Makefile MSCS="" OS="nt" \
	CC="cl -nologo -MD" CCFLAGS="-Zp -Gs -Ogti -D__MSDOS__ -D__32BIT__" \
	LDFLAGS="advapi32.lib -F 50000 setargv.obj -Fe"
mscnt-debug:
	$(MAKE) all -f $D/Makefile MSCS="" OS="nt" \
	CC="cl -nologo -Zi" CCFLAGS="-Zp -Gs -Od -D__MSDOS__ -D__32BIT__" \
	LDFLAGS="advapi32.lib -F 50000 setargv.obj -Fe"

# Watcom C/C++ 10.6 -> 32-bit OS/2 executables
w32os2:
	$(MAKE) lib -f $D/Makefile WCD="" OS="os2" \
	CC="wcl386 -bd -bt=os2v2 -zq" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Ox -D__OS2__ -D__32BIT__" EXTRA="mktemp.obj" \
	DLDFLAGS="-l=os2v2dll @pc\rcs.lnk -Fe="
	$(MAKE) exe -f $D/Makefile WCD="" OS="os2" \
	CC="wcl386 -bt=os2v2 -zq" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Ox -D__OS2__ -D__32BIT__ -DRCSDLL" \
	LDFLAGS="-l=os2v2exe -k0x50000 @pc\rcs.lnk -Fe="
w32os2-static:
	$(MAKE) all -f $D/Makefile WCS="" OS="os2" \
	CC="wcl386 -bt=os2v2 -zq" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Ox -D__OS2__ -D__32BIT__" EXTRA="mktemp.obj" \
	LDFLAGS="-l=os2v2exe -k0x50000 @pc\rcs.lnk -Fe="
w32os2-debug:
	$(MAKE) all -f $D/Makefile WCS="" OS="os2" \
	CC="wcl386 -bt=os2v2 -zq -d2" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Od -D__OS2__ -D__32BIT__" EXTRA="mktemp.obj" \
	LDFLAGS="-l=os2v2exe -k0x50000 @pc\rcs.lnk -Fe="

# Watcom C/C++ 10.6 -> 32-bit Win95/NT executables
w32nt:
	$(MAKE) lib -f $D/Makefile WCD="" OS="nt" \
	CC="wcl386 -bd -bt=nt -zq" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Ox -D__MSDOS__ -D__32BIT__" EXTRA="mktemp.obj" \
	DLDFLAGS="-l=nt_dll -Fe="
	$(MAKE) exe -f $D/Makefile WCD="" OS="nt" \
	CC="wcl386 -bt=nt -zq" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Ox -D__MSDOS__ -D__32BIT__ -DRCSDLL" \
	LDFLAGS="-l=nt -k0x50000 -Fe="
w32nt-static:
	$(MAKE) all -f $D/Makefile WCS="" OS="nt" \
	CC="wcl386 -bt=nt -zq" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Ox -D__MSDOS__ -D__32BIT__" EXTRA="mktemp.obj" \
	LDFLAGS="-l=nt -k0x50000 -Fe="
w32nt-debug:
	$(MAKE) all -f $D/Makefile WCS="" OS="nt" \
	CC="wcl386 -bt=nt -zq -d2" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Od -D__MSDOS__ -D__32BIT__" EXTRA="mktemp.obj" \
	LDFLAGS="-l=nt -k0x50000 -Fe="

# Watcom C/C++ 10.6 -> 16-bit OS/2 executables
w16os2:
	$(MAKE) all -f $D/Makefile WCS="" OS="os2" \
	CC="wcl -mm -bt=os2 -zq" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Ox -D__OS2__" EXTRA="mktemp.obj" \
	LDFLAGS="-l=os2v1exe -k0x4000 @pc\rcs.lnk -Fe="
w16os2-debug:
	$(MAKE) all -f $D/Makefile WCS="" OS="os2" \
	CC="wcl -mm -bt=os2 -zq -d2" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Od -D__OS2__" EXTRA="mktemp.obj" \
	LDFLAGS="-l=os2v1exe -k0x4000 @pc\rcs.lnk -Fe="

# Watcom C/C++ 10.6 -> 16-bit DOS executables
w16dos:
	$(MAKE) all -f $D/Makefile WCS="" OS="dos" \
	CC="wcl -mm -bt=dos -zq" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Ox -D__MSDOS__" EXTRA="mktemp.obj" \
	LDFLAGS="-l=dos -k0x4000 -Fe="
w16dos-debug:
	$(MAKE) all -f $D/Makefile WCS="" OS="dos" \
	CC="wcl -mm -bt=dos -zq -d2" DIRSEP="\\" \
	CCFLAGS="-Zp1 -s -Od -D__MSDOS__" EXTRA="mktemp.obj" \
	LDFLAGS="-l=dos -k0x4000 -Fe="

# defaults:
O = .obj
A = .lib
X = .exe
AR = emxomfar
DIRSEP = /

# target hiding macros, one of them is always pre-set to be empty
EMXS = emxs
EMXO = emxo
EMXN = emxn
MSC = msc
MSCS = mscs
MSCD = mscd
WCS = wcs
WCD = wcd

# other macros:
CFLAGS = $(CCFLAGS) -I$D -Dmain=rcsmain -Dhas_conf_h
LIBOBJS = getcwdsl$O spawnvpq$O login$(OS)$O $(EXTRA)
REMOVE = del

# ----- end of configuration section -----
# You shouldn't have to change anything past this point.

# all commands
PROGRAMS = ci.exe co.exe ident.exe merge.exe rcs.exe \
	rcsclean.exe rcsdiff.exe rcsmerge.exe rlog.exe

.SUFFIXES: .c $O .exe

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

$O.exe:
	$(CC) $< libinit$O rcslib$A $(LDFLAGS)$@

all: lib exe
exe: $(PROGRAMS)
lib: rcslib$A
$(PROGRAMS): libinit$O rcslib$A

RCSLIB1 = rcslex$O rcssyn$O rcsgen$O rcsedit$O rcskeys$O rcsmap$O
RCSLIB2 = rcsrev$O rcsutil$O rcsfnms$O partime$O maketime$O
RCSLIB3 = rcskeep$O rcsfcmp$O rcstime$O merger$O version$O
RCSLIB = $(RCSLIB1) $(RCSLIB2) $(RCSLIB3) $(LIBOBJS)

# For the library targets to work under DOS too, we need to get around
# the stupid DOS command line length limit by using multiple commands.

# dynamic/shared library variant, emx, OS/2 only
$(EMXO)rcslib$A: $D/rcslib.def $(EMXO)rcslib.dll
	-$(REMOVE) $@
	emximp -o $@ $D/rcslib.def
$(EMXO)rcslib.dll: dllmain$O $(RCSLIB) $D/rcslib.def
	$(CC) dllmain$O $(RCSLIB) $(DLDFLAGS)$@ $D/rcslib.def

# dynamic/shared library variant, emx, NT only
$(EMXN)rcslib$A: $(EMXN)rcslib.dll
	-$(REMOVE) $@
	makelib $(EMXN)rcslib.dll -o $@
$(EMXN)rcslib.dll: dllmain$O $(RCSLIB) $D/rcslib.def
	$(CC) dllmain$O $(RCSLIB) $(DLDFLAGS)$@ $D/rcslib.def

# static library variant, emx
$(EMXS)rcslib$A: $(RCSLIB)
	-$(REMOVE) $@
	$(AR) cr $@ $(RCSLIB1)
	$(AR) cr $@ $(RCSLIB2)
	$(AR) cr $@ $(RCSLIB3)
	$(AR) cr $@ $(LIBOBJS)
	$(AR) s $@

# static library variant, MS C 6.00
$(MSC)rcslib$A: $(RCSLIB)
	-$(REMOVE) $@
	lib /nologo /noi $@ $(RCSLIB1);
	lib /nologo /noi $@ $(RCSLIB2);
	lib /nologo /noi $@ $(RCSLIB3);
	lib /nologo /noi $@ $(LIBOBJS);

# dynamic/shared library variant, MS C 10.00
$(MSCD)rcslib$A: $D/rcslib.def $(MSCD)rcslib.dll
	-$(REMOVE) $@
	lib /out:$@ /def:$D/rcslib.def
$(MSCD)rcslib.dll: dllmain$O $(RCSLIB) $D/rcslib.def
	$(CC) dllmain$O $(RCSLIB) $(DLDFLAGS)$@ $D/rcslib.def

# static library variant, MS C 10.00
$(MSCS)rcslib$A: $(RCSLIB)
	-$(REMOVE) $@
	lib /nologo /out:$@ $(RCSLIB1)
	lib /nologo $@ $(RCSLIB2)
	lib /nologo $@ $(RCSLIB3)
	lib /nologo $@ $(LIBOBJS)

# dynamic/shared library variant, Watcom C/C++ OS/2 and Win95/NT only
$(WCD)rcslib.lib: $D/rcslib.lnk $(WCD)rcslib.dll
	-$(REMOVE) $@
	wlib -q -c $@ +rcslib.dll
$(WCD)rcslib.dll: dllmain$O $(RCSLIB) $D/rcslib.lnk
	$(CC) dllmain$O $(RCSLIB) $(DLDFLAGS)$@ @$D$(DIRSEP)rcslib.lnk

# static library variant, Watcom C/C++
$(WCS)rcslib$A: $(RCSLIB)
	-$(REMOVE) $@
	wlib -q -c -b $@ + $(RCSLIB1)
	wlib -q -c -b $@ + $(RCSLIB2)
	wlib -q -c -b $@ + $(RCSLIB3)
	wlib -q -c -b $@ + $(LIBOBJS)

OBJECTS=ci$O co$O ident$O maketime$O merge$O merger$O partime$O \
	rcs$O rcsclean$O rcsdiff$O rcsedit$O rcsfcmp$O rcsfnms$O \
	rcsgen$O rcskeep$O rcskeys$O rcslex$O rcsmap$O rcsmerge$O \
	rcsrev$O rcssyn$O rcsutil$O rlog$O version$O

$(OBJECTS): $D/conf.h rcsbase.h

ci$O: ci.c
	$(CC) $(CFLAGS) -DRCSMAIN -c ci.c
co$O: co.c
	$(CC) $(CFLAGS) -DRCSMAIN -c co.c
ident$O: ident.c
	$(CC) $(CFLAGS) -DRCSMAIN -c ident.c
merge$O: merge.c
	$(CC) $(CFLAGS) -DRCSMAIN -c merge.c
rcs$O: rcs.c
	$(CC) $(CFLAGS) -DRCSMAIN -c rcs.c
rcsclean$O: rcsclean.c
	$(CC) $(CFLAGS) -DRCSMAIN -c rcsclean.c
rcsdiff$O: rcsdiff.c
	$(CC) $(CFLAGS) -DRCSMAIN -c rcsdiff.c
rcsmerge$O: rcsmerge.c
	$(CC) $(CFLAGS) -DRCSMAIN -c rcsmerge.c
rlog$O: rlog.c
	$(CC) $(CFLAGS) -DRCSMAIN -c rlog.c

getcwdsl$O: $D/getcwdsl.c
	$(CC) $(CFLAGS) -c $D$(DIRSEP)getcwdsl.c
spawnvpq$O: $D/spawnvpq.c
	$(CC) $(CFLAGS) -c $D$(DIRSEP)spawnvpq.c
login$(OS)$O: $D/login$(OS).c
	$(CC) $(CFLAGS) -c $D$(DIRSEP)login$(OS).c
mktemp$O: $D/mktemp.c
	$(CC) $(CFLAGS) -c $D$(DIRSEP)mktemp.c

libinit$O: $D/libinit.c
	$(CC) $(CFLAGS) -c $D$(DIRSEP)libinit.c
dllmain$O: $D/dllmain.c
	$(CC) $(CFLAGS) -c $D$(DIRSEP)dllmain.c

clean:
	-$(REMOVE) *.o *.a *.obj *.lib *.exp *.bak conf.err $(PROGRAMS)
