1
2# this makefile (NMake) creates the JWasm Win32 binary with MS Visual C++.
3#
4# optionally, a DOS binary can be created. Then the HXDEV package is needed.
5#
6# to use jwlink instead of MS link, enter: "nmake -f msvc.mak mslink=0
7# to additionally create a DOS binary, enter: "nmake -f msvc.mak dos=1 mslink=0"
8
9name = jwasm
10WIN=1
11
12!ifndef DOS
13DOS=0
14!endif
15!ifndef MSLINK
16MSLINK=1
17!endif
18
19# directory paths to adjust
20# VCDIR  - root directory for VC compiler, linker, include and lib files
21# W32LIB - directory for Win32 import library files (kernel32.lib).
22# HXDIR  - for DOS=1 only: root directory to search for stub LOADPEX.BIN,
23#          libs DKRNL32S.LIB + IMPHLP.LIB and tool PATCHPE.EXE.
24
25!ifndef VCDIR
26VCDIR  = %VCToolsInstallDir%
27!endif
28VCBIN=$(VCDIR)\bin\Hostx86\x86
29
30!ifndef W32LIB
31W32LIB = %WindowsSdkDir%\Lib\%WindowsSdkVersion%\um\x86
32W32LIBU = %WindowsSdkDir%\Lib\%WindowsSdkVersion%\ucrt\x86
33!endif
34
35!if $(DOS)
36HXDIR  = \HX
37!endif
38
39!ifndef DEBUG
40DEBUG=0
41!endif
42
43!ifndef OUTD
44!if $(DEBUG)
45OUTD=build\MSVCD
46!else
47OUTD=build\MSVCR
48!endif
49!endif
50
51inc_dirs  = -Isrc\H -I"$(VCDIR)\include"
52
53linker = link.exe
54lib = lib.exe
55
56!ifndef TRMEM
57TRMEM=0
58!endif
59
60!if $(DEBUG)
61#extra_c_flags = -Zi -Od -DDEBUG_OUT -FAa
62extra_c_flags = -Z7 -Od -DDEBUG_OUT
63!else
64extra_c_flags = -O2 -Gs -DNDEBUG
65!endif
66
67!if $(TRMEM)
68extra_c_flags = $(extra_c_flags) -DTRMEM -DFASTMEM=0
69!endif
70
71c_flags =-D__NT__ $(extra_c_flags)
72
73# linker option /OPT:NOWIN98 is not accepted by all MS linkers
74#LOPT = /NOLOGO /OPT:NOWIN98
75LOPT = /NOLOGO
76!if $(DEBUG)
77LOPTD = /debug
78!endif
79
80lflagsd = $(LOPTD) /SUBSYSTEM:CONSOLE $(LOPT) /map:$^*.map /Libpath:$(HXDIR)\lib
81lflagsw = $(LOPTD) /SUBSYSTEM:CONSOLE $(LOPT) /map:$^*.map
82
83CC="$(VCBIN)\cl.exe" -c -nologo $(inc_dirs) $(c_flags)
84
85{src}.c{$(OUTD)}.obj:
86	@$(CC) -Fo$* $<
87
88proj_obj = \
89!include msmod.inc
90
91!if $(TRMEM)
92proj_obj = $(proj_obj) $(OUTD)/trmem.obj
93!endif
94
95!if $(WIN)
96TARGET1=$(OUTD)\$(name).exe
97!endif
98!if $(DOS)
99TARGET2=$(OUTD)\$(name)d.exe
100!endif
101
102ALL: build $(OUTD) $(TARGET1) $(TARGET2)
103
104build:
105	@mkdir build
106
107$(OUTD):
108	@mkdir $(OUTD)
109
110$(OUTD)\$(name).exe : $(OUTD)/main.obj $(OUTD)/$(name).lib
111!if $(MSLINK)
112	@$(linker) $(lflagsw) $(OUTD)/main.obj $(OUTD)/$(name).lib /LibPath:"$(VCDIR)\lib\x86" /LibPath:"$(W32LIB)" /LibPath:"$(W32LIBU)" /OUT:$@
113!else
114	@jwlink @<<
115format windows pe file $(OUTD)/main.obj name $@
116lib $(OUTD)/$(name).lib libpath "$(VCDIR)\Lib\x86" libpath "$(W32LIB)" op start=_mainCRTStartup, norelocs, eliminate, map=$(OUTD)/$(name).map
117#sort global op statics
118disable 173
119<<
120!endif
121
122$(OUTD)\$(name)d.exe : $(OUTD)/main.obj $(OUTD)/$(name).lib
123!if $(MSLINK)
124	@$(linker) @<<
125$(lflagsd) /NODEFAULTLIB initw32.obj $(OUTD)/main.obj $(OUTD)/$(name).lib /LIBPATH:$(VCDIR)\Lib
126libc.lib oldnames.lib /LIBPATH:$(HXDIR)\Lib imphlp.lib dkrnl32s.lib /STUB:$(HXDIR)\Bin\LOADPEX.BIN
127/OUT:$@ /FIXED:NO
128<<
129	@$(HXDIR)\bin\patchpe $@
130!else
131	@jwlink @<<
132format windows pe hx file $(HXDIR)/lib/initw32.obj, $(OUTD)/main.obj name $@ lib $(OUTD)/$(name).lib
133libpath $(VCDIR)/Lib
134libpath $(HXDIR)/Lib lib imphlp.lib, dkrnl32s.lib, hxemu387.lib reference EMUInit
135op start=_start, eliminate, map=$(OUTD)/$(name)d.map, stub=$(HXDIR)\Bin\LOADPEX.BIN
136<<
137!endif
138
139$(OUTD)\$(name).lib : $(proj_obj)
140	@$(lib) /nologo /out:$(OUTD)\$(name).lib @<<
141$(proj_obj)
142<<
143
144$(OUTD)/msgtext.obj: src/msgtext.c src/H/msgdef.h src/H/globals.h
145	@$(CC) -Fo$* src/msgtext.c
146
147$(OUTD)/reswords.obj: src/reswords.c src/H/instruct.h src/H/special.h src/H/directve.h src/H/opndcls.h src/H/instravx.h
148	@$(CC) -Fo$* src/reswords.c
149
150######
151
152clean:
153	@erase $(OUTD)\*.exe
154	@erase $(OUTD)\*.obj
155	@erase $(OUTD)\*.map
156