# VC makefile for ANSICON.
# Jason Hood, 15 November, 2010.
#
# Tested with:
# * Visual Studio 6.0 (VC6);
# * Visual C++ 2003 Toolkit (VC7);
# * Platform SDK for Windows Server 2003 R2 (VC8 64-bit);
# * Visual Studio 2008 Express SP1 (VC9);
# * Visual Studio 2010 Professional (VC10).
#
# Note that the 64-bit version still requires a 32-bit compiler.
#
# 22 & 23 November, 2012:
#   determine if the PSDK is used automatically;
#   use AC0000[00] (AnsiCon) as the base address;
#   twiddle stuff around to support VC6 (with 2003 PSDK) for the 32-bit version;
#   determine BITS automatically.
#
# 18 July, 2013:
#   hide the commands (use V=1 to show them).

#BITS = 32
#BITS = 64

!IFNDEF BITS
!IF "$(CPU)" == "AMD64" || "$(PLATFORM)" == "x64" || "$(PLATFORM)" == "X64"
BITS = 64
!ELSE
BITS = 32
!ENDIF
!ENDIF

!IF $(BITS) == 32
DIR = x86
!ELSE
!IF $(BITS) == 64
DIR = x64
RFLAGS = /D_WIN64
!ELSE
!ERROR BITS should be defined to 32 or 64.
!ENDIF
!ENDIF

# This is required for the 2003 Platform SDK, but not for Visual Studio 2010.
!IF "$(_NMAKE_VER)" == "7.00.8882"
!IF $(BITS) == 64
LIBS64 = bufferoverflowu.lib
# The 2003 Toolkit doesn't have MSVCRT.LIB, but VC98 does.
!ELSEIF !DEFINED(SHARE) && !DEFINED(MSVCDIR)
SHARE =
!ENDIF
!ENDIF

# Link with MSVCRT.LIB by default.
!IFNDEF SHARE
SHARE = /MD
!ENDIF

# Manifest tool to embed the manifest required by 2008.
MT = mt.exe

CFLAGS = /nologo /W3 /O2 $(SHARE) /D_CRT_SECURE_NO_WARNINGS
LIBS = advapi32.lib user32.lib winmm.lib $(LIBS64)

# Identify ansicon.exe using "ANSI" as a version number.
LINK = /link /version:20033.18771

X86OBJS = x86\injdll.obj x86\proctype.obj x86\util.obj
X64OBJS = x64\injdll.obj x64\proctype.obj x64\util.obj x64\procrva.obj

!IF !DEFINED(V)
V = 0
!ENDIF
!IF $(V) == 0
CCmsg = @
RCmsg = @echo $<&
LDmsg = @echo $@&
MTmsg = @echo Embedding manifest&
!ENDIF

{}.c{$(DIR)}.obj:
	$(CCmsg)$(CC) /c $(CFLAGS) /Fo$@ $<

{}.rc{$(DIR)}.res:
	$(RCmsg)$(RC) $(RFLAGS) /fo$@ $<

all: ansicon$(BITS)

ansicon32: x86 x86\ansicon.exe x86\ANSI32.dll x64 x64\ANSI32.dll

ansicon64: x64 x64\ansicon.exe x64\ANSI64.dll

x86:
	mkdir x86

x86\ansicon.exe: x86\ansicon.obj $(X86OBJS) x86\procrva.obj x86\ansicon.res
	$(LDmsg)$(CC) /nologo $(SHARE) /Fe$@ $** $(LIBS) $(LINK) /filealign:512
!IF "$(_NMAKE_VER)" == "9.00.30729.01"
	$(MTmsg)$(MT) /nologo -manifest $@.manifest -outputresource:$@;1
	@del $@.manifest
!ENDIF

x86\ANSI32.dll: x86\ANSI.obj $(X86OBJS) x86\ansi.res
	$(LDmsg)$(CC) /nologo $(SHARE) /LD /Fe$@ $** $(LIBS) /link \
		      /base:0xAC0000 /filealign:512
!IF "$(_NMAKE_VER)" == "9.00.30729.01"
	$(MTmsg)$(MT) /nologo -manifest $@.manifest -outputresource:$@;2
	@del $@.manifest
!ENDIF

x64:
	mkdir x64

x64\ansicon.exe: x64\ansicon.obj $(X64OBJS) x64\ansicon.res
	$(LDmsg)$(CC) /nologo $(SHARE) /Fe$@ $** $(LIBS) $(LINK)

x64\ANSI64.dll: x64\ANSI.obj $(X64OBJS) x64\ansi.res
	$(LDmsg)$(CC) /nologo $(SHARE) /LD /Fe$@ $** $(LIBS) /link \
		      /base:0xAC000000

x64\ANSI32.dll: x64\ANSI32.obj x64\proctype32.obj x86\injdll.obj x86\util.obj x86\ansi.res
	$(LDmsg)$(CC) /nologo $(SHARE) /LD /Fe$@ $** $(LIBS) /link \
		      /base:0xAC0000 /filealign:512 /largeaddressaware
!IF "$(_NMAKE_VER)" == "9.00.30729.01"
	$(MTmsg)$(MT) /nologo -manifest $@.manifest -outputresource:$@;2
	@del $@.manifest
!ENDIF

ansicon.c:  ansicon.h version.h
ansicon.rc: version.h
ANSI.c:     ansicon.h version.h
ANSI.rc:    version.h
util.c:     ansicon.h version.h
injdll.c:   ansicon.h
proctype.c: ansicon.h
procrva.c:  ansicon.h

x64\ANSI32.obj: ANSI.c
	$(CCmsg)$(CC) /DW32ON64 /c $(CFLAGS) /Fo$@ $?

x64\proctype32.obj: proctype.c
	$(CCmsg)$(CC) /DW32ON64 /c $(CFLAGS) /Fo$@ $?

clean:
	-del $(DIR)\*.obj $(DIR)\*.res $(DIR)\*.lib $(DIR)\*.exp
!IF $(BITS) == 32
	-del x64\ansi32.obj x64\proctype32.obj
!ENDIF