ansicon/makefile.vc
Jason Hood f2843b1d10 Explicitly link the VC exe with MSVCRT.dll
Create an import library containing the necessary CRT functions and link
with that, rather than the compiler's own version.
2018-05-11 15:14:58 +10:00

165 lines
4.1 KiB
Plaintext

# 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).
#
# 30 April, 8 to 11 May 2018:
# use a batch rule (even if this project is too small to make a difference);
# add /nologo to RFLAGS if rc supports it;
# explicitly link the exe with MSVCRT.DLL.
#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
!ELSE
!ERROR BITS should be defined to 32 or 64.
!ENDIF
!ENDIF
# Disable security checks, but VC6 & 7 don't have /GS-.
!IF "$(_NMAKE_VER)" != "7.00.8882" || $(BITS) == 64
NOSECCHK = /GS-
!ENDIF
# 2008 (SDK v6) and earlier rc do not have /nologo.
!IF [cmd /d /c exit $(_NMAKE_VER)] <= 9
RFLAGS =
!ENDIF
# Link with MSVCRT.LIB by default.
!IFNDEF SHARE
SHARE = /MD
CRT = $(DIR)\acrt.lib
LINK = /entry:main /nod
# The 2003 Toolkit has chkstk in libc, but the rest have it as itself.
!IF "$(_NMAKE_VER)" == "7.00.8882" && $(BITS) == 32 && !DEFINED(MSVCDIR)
LIBS = libc.lib
!ELSE
LIBS = chkstk.obj
!ENDIF
!ENDIF
!IFNDEF RFLAGS
RFLAGS = /nologo
!ENDIF
!IF $(BITS) == 64
RFLAGS = $(RFLAGS) /D_WIN64
!ENDIF
CFLAGS = /nologo /W3 /O2 $(NOSECCHK) /D_CRT_SECURE_NO_WARNINGS
LIBS = $(LIBS) kernel32.lib advapi32.lib
# Identify ansicon.exe using "ANSI" as a version number.
LINK = /link /version:20033.18771 $(LINK) /fixed
X86OBJS = x86\injdll.obj x86\procrva.obj x86\proctype.obj x86\util.obj
X64OBJS = x64\injdll.obj x64\procrva.obj x64\proctype.obj x64\util.obj
X6432OBJS = x86\injdll.obj x86\procrva.obj x64\proctype32.obj x86\util.obj
!IF !DEFINED(V)
V = 0
!ENDIF
!IF $(V) == 0
CCmsg = @
RCmsg = @echo $<&
LDmsg = @echo $@&
!ENDIF
{}.c{$(DIR)}.obj::
$(CCmsg)$(CC) /c $(CFLAGS) /Fo$(DIR)\ $<
{}.rc{$(DIR)}.res:
$(RCmsg)$(RC) $(RFLAGS) /fo$@ $<
all: ansicon$(BITS)
ansicon32: x86 x86\ANSI32.dll x86\ansicon.exe x64 x64\ANSI32.dll
ansicon64: x64 x64\ANSI64.dll x64\ansicon.exe
x86:
mkdir x86
x86\ansicon.exe: x86\ansicon.obj x86\ansi32.lib $(CRT) x86\ansicon.res
$(LDmsg)$(CC) /nologo $(SHARE) /Fe$@ $** $(LIBS) $(LINK) /filealign:512
!IF "$(_NMAKE_VER)" == "9.00.30729.01"
@del $@.manifest
!ENDIF
x86\ANSI32.dll: x86\ANSI.obj $(X86OBJS) x86\ansi.res
$(LDmsg)$(CC) /nologo /LD /Fe$@ $** kernel32.lib /link \
/base:0xAC0000 /entry:DllMain /filealign:512
x64:
mkdir x64
x64\ansicon.exe: x64\ansicon.obj x64\ansi64.lib $(CRT) x64\ansicon.res
$(LDmsg)$(CC) /nologo $(SHARE) /Fe$@ $** $(LIBS) $(LINK)
x64\ANSI64.dll: x64\ANSI.obj $(X64OBJS) x64\ansi.res
$(LDmsg)$(CC) /nologo /LD /Fe$@ $** kernel32.lib /link \
/base:0xAC000000 /entry:DllMain
x64\ANSI32.dll: x64\ANSI32.obj $(X6432OBJS) x86\ansi.res
$(LDmsg)$(CC) /nologo /LD /Fe$@ $** kernel32.lib /link \
/base:0xAC0000 /entry:DllMain /filealign:512 \
/largeaddressaware
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
$(DIR)\ansicon.obj:
$(CCmsg)$(CC) /c $(CFLAGS) $(SHARE) /Fo$@ $?
x64\ANSI32.obj: ANSI.c
$(CCmsg)$(CC) /DW32ON64 /c $(CFLAGS) /Fo$@ $?
x64\proctype32.obj: proctype.c
$(CCmsg)$(CC) /DW32ON64 /c $(CFLAGS) /Fo$@ $?
x86\acrt.lib: acrt.def
$(LDmsg)link /lib /nologo /def:acrt.def /machine:ix86 /name:msvcrt /out:$@
x64\acrt.lib: acrt.def
$(LDmsg)link /lib /nologo /def:acrt.def /machine:amd64 /name:msvcrt /out:$@
clean:
-del $(DIR)\*.obj $(DIR)\*.res $(DIR)\*.lib $(DIR)\*.exp
!IF $(BITS) == 32
-del x64\ansi32.obj x64\proctype32.obj
!ENDIF