1# Build Makefile for Microsoft NMake
2
3# Engine options - these may be overridden by game makefiles
4#  USE_POLYMOST   - enables Polymost renderer
5#  USE_OPENGL     - enables OpenGL support in Polymost
6#     Define as 0 to disable OpenGL
7#     Define as 1 (or 2) for GL 2.0/2.1 profile
8#     Define as 3 for GL 3.2 Core profile
9#  USE_ASM        - enables the use of assembly code
10USE_POLYMOST=1
11USE_OPENGL=1
12USE_ASM=1
13
14RELEASE=1
15
16# Create Makefile.msvcuser yourself to provide your own overrides
17# for configurable values
18!if EXIST(Makefile.msvcuser)
19!include Makefile.msvcuser
20!endif
21
22SRC=src
23GAME=kenbuild
24GAMEDATA=kenbuild-data
25TOOLS=tools
26INC=include
27
28o=obj
29res=res
30asm=masm
31
32ENGINELIB=engine.lib
33EDITORLIB=build.lib
34
35LIBSQUISH=libsquish
36
37flags_cl=
38flags_rc=
39!if "$(PLATFORM)" == "X64" || "$(PLATFORM)" == "x64"
40flags_rc=/d_M_AMD64
41USE_ASM=0
42!elseif "$(PLATFORM)" == "ARM"
43# Some day, perhaps.
44USE_ASM=0
45!else
46flags_cl=/arch:IA32
47!endif
48
49!if $(RELEASE)
50# release options
51flags_cl=$(flags_cl) /O2
52flags_link=/RELEASE
53!else
54# debugging options
55flags_cl=$(flags_cl) /Ot /Z7 /DDEBUGGINGAIDS
56flags_link=/DEBUG
57!endif
58
59CC=cl
60AS=ml
61RC=rc
62LINK=link
63OURCFLAGS=/nologo /MD $(flags_cl) /DKSFORBUILD /I$(INC) /I$(LIBSQUISH) /I$(SRC)
64GAMECFLAGS=/I$(GAME)
65ASFLAGS=/nologo /coff
66LINKFLAGS=/opt:ref /nologo $(flags_link)
67RFLAGS=/nologo /i$(INC) /i$(GAME) $(flags_rc)
68EXESUFFIX=.exe
69
70ENGINEOBJS=$(SRC)\a-c.$o \
71	$(SRC)\asmprot.$o \
72	$(SRC)\baselayer.$o \
73	$(SRC)\cache1d.$o \
74	$(SRC)\compat.$o \
75	$(SRC)\crc32.$o \
76	$(SRC)\defs.$o \
77	$(SRC)\engine.$o \
78	$(SRC)\polymost.$o \
79	$(SRC)\polymost_fs.$o \
80	$(SRC)\polymost_vs.$o \
81	$(SRC)\polymostaux_fs.$o \
82	$(SRC)\polymostaux_vs.$o \
83	$(SRC)\polymosttex.$o \
84	$(SRC)\polymosttexcache.$o \
85	$(SRC)\polymosttexcompress.$o \
86	$(SRC)\hightile.$o \
87	$(SRC)\mdsprite.$o \
88	$(SRC)\glbuild.$o \
89	$(SRC)\glbuild_fs.$o \
90	$(SRC)\glbuild_vs.$o \
91	$(SRC)\kplib.$o \
92	$(SRC)\mmulti.$o \
93	$(SRC)\osd.$o \
94	$(SRC)\pragmas.$o \
95	$(SRC)\scriptfile.$o \
96	$(SRC)\textfont.$o \
97	$(SRC)\smalltextfont.$o \
98	$(SRC)\winlayer.$o
99
100LIBSQUISHOBJS=$(LIBSQUISH)\alpha.$o $(LIBSQUISH)\clusterfit.$o \
101	      $(LIBSQUISH)\colourblock.$o $(LIBSQUISH)\colourfit.$o \
102	      $(LIBSQUISH)\colourset.$o $(LIBSQUISH)\maths.$o \
103	      $(LIBSQUISH)\rangefit.$o $(LIBSQUISH)\singlecolourfit.$o \
104	      $(LIBSQUISH)\squish.$o $(SRC)\rg_etc1.$o
105
106EDITOROBJS=$(SRC)\build.$o \
107	$(SRC)\startwin_editor.$o \
108	$(SRC)\config.$o
109
110GAMEEXEOBJS=$(GAME)\config.$o \
111	$(GAME)\game.$o \
112	$(GAME)\gameres.$(res) \
113	$(GAME)\startwin_game.$o \
114	$(GAME)\kdmsound.$o \
115	$(GAME)\kdmsound_stub.$o \
116	$(SRC)\$(ENGINELIB)
117
118EDITOREXEOBJS=$(GAME)\bstub.$o \
119	$(GAME)\buildres.$(res) \
120	$(SRC)\$(EDITORLIB) \
121	$(SRC)\$(ENGINELIB)
122
123!if $(USE_ASM)
124ENGINEOBJS=$(ENGINEOBJS) $(SRC)\a.$o
125!endif
126
127RENDERTYPE=WIN
128BUILDCFLAGS=/DRENDERTYPEWIN=1
129BUILDLIBS=user32.lib gdi32.lib shell32.lib ws2_32.lib comctl32.lib comdlg32.lib uxtheme.lib xinput9_1_0.lib
130
131!if $(USE_POLYMOST)
132BUILDCFLAGS=$(BUILDCFLAGS) /DUSE_POLYMOST=$(USE_POLYMOST)
133!endif
134!if $(USE_OPENGL)
135BUILDCFLAGS=$(BUILDCFLAGS) /DUSE_OPENGL=$(USE_OPENGL)
136!endif
137!if $(USE_ASM)
138BUILDCFLAGS=$(BUILDCFLAGS) /DUSE_ASM=$(USE_ASM)
139!endif
140
141LIBS=$(LIBS) $(BUILDLIBS)
142CFLAGS=$(CFLAGS) $(BUILDCFLAGS)
143
144# Source-control version stamping
145!if [git --version >nul] == 0
146ENGINEOBJS=$(ENGINEOBJS) $(SRC)\version-auto.$o
147!else
148ENGINEOBJS=$(ENGINEOBJS) $(SRC)\version.$o
149!endif
150
151# RULES
152.SUFFIXES: .masm .cc .glsl
153
154{$(SRC)}.masm{$(SRC)}.$o:
155	$(AS) /c $(ASFLAGS) /Fo$@ $<
156
157{$(SRC)}.c{$(SRC)}.$o:
158	$(CC) /c $(CFLAGS) $(OURCFLAGS) /Fo$@ $<
159
160{$(SRC)}.cc{$(SRC)}.$o:
161	$(CC) /TP /c $(CFLAGS) $(OURCFLAGS) /Fo$@ $<
162
163{$(SRC)}.cpp{$(SRC)}.$o:
164	$(CC) /c $(CFLAGS) $(OURCFLAGS) /Fo$@ $<
165
166{$(LIBSQUISH)}.cpp{$(LIBSQUISH)}.$o:
167	$(CC) /TP /c $(CFLAGS) $(OURCFLAGS) /Fo$@ $<
168
169{$(TOOLS)}.c{$(TOOLS)}.$o:
170	$(CC) /c $(CFLAGS) $(OURCFLAGS) /Fo$@ $<
171
172{$(TOOLS)}.cc{$(TOOLS)}.$o:
173	$(CC) /TP /c $(CFLAGS) $(OURCFLAGS) /Fo$@ $<
174
175{$(GAME)}.c{$(GAME)}.$o:
176	$(CC) /c $(CFLAGS) $(OURCFLAGS) $(GAMECFLAGS) /Fo$@ $<
177
178{$(GAME)}.cpp{$(GAME)}.$o:
179	$(CC) /c $(CFLAGS) $(OURCFLAGS) $(GAMECFLAGS) /Fo$@ $<
180
181{$(GAME)}.rc{$(GAME)}.$(res):
182	$(RC) $(RFLAGS) /fo$@ /r $<
183
184{$(SRC)}.glsl{$(SRC)}.c:
185	if not exist bin2c$(EXESUFFIX) $(MAKE) /f Makefile.msvc /$(MAKEFLAGS) /nologo bin2c$(EXESUFFIX)
186	bin2c$(EXESUFFIX) -text $< default_$(@B)_glsl > $@
187
188# TARGETS
189UTILS=kextract$(EXESUFFIX) kgroup$(EXESUFFIX) transpal$(EXESUFFIX) wad2map$(EXESUFFIX) wad2map$(EXESUFFIX)
190
191all: enginelib editorlib $(GAMEDATA)\game$(EXESUFFIX) $(GAMEDATA)\build$(EXESUFFIX) ;
192utils: $(UTILS) ;
193
194enginelib: $(SRC)\$(ENGINELIB) ;
195$(SRC)\$(ENGINELIB): $(ENGINEOBJS) $(LIBSQUISHOBJS)
196	lib /out:$@ /nologo $**
197
198editorlib: $(SRC)\$(EDITORLIB) ;
199$(SRC)\$(EDITORLIB): $(EDITOROBJS)
200	lib /out:$@ /nologo $**
201
202
203$(GAMEDATA)\game$(EXESUFFIX): $(GAMEEXEOBJS)
204	$(LINK) /OUT:$@ /SUBSYSTEM:WINDOWS "/LIBPATH:$(DXROOT)\lib" $(LINKFLAGS) /MAP $** $(LIBS) msvcrt.lib
205
206$(GAMEDATA)\build$(EXESUFFIX): $(EDITOREXEOBJS)
207	$(LINK) /OUT:$@ /SUBSYSTEM:WINDOWS "/LIBPATH:$(DXROOT)\lib" $(LINKFLAGS) /MAP $** $(LIBS) msvcrt.lib
208
209# the tools
210kextract$(EXESUFFIX): $(TOOLS)\kextract.$o $(SRC)\compat.$o
211	$(LINK) /OUT:$@ /SUBSYSTEM:CONSOLE $(LINKFLAGS) /MAP $** $(LIBS) msvcrt.lib
212
213kgroup$(EXESUFFIX): $(TOOLS)\kgroup.$o $(SRC)\compat.$o
214	$(LINK) /OUT:$@ /SUBSYSTEM:CONSOLE $(LINKFLAGS) /MAP $** $(LIBS) msvcrt.lib
215
216transpal$(EXESUFFIX): $(TOOLS)\transpal.$o $(SRC)\pragmas.$o $(SRC)\compat.$o
217	$(LINK) /OUT:$@ /SUBSYSTEM:CONSOLE $(LINKFLAGS) /MAP $** $(LIBS) msvcrt.lib
218
219wad2map$(EXESUFFIX): $(TOOLS)\wad2map.$o $(SRC)\pragmas.$o $(SRC)\compat.$o
220	$(LINK) /OUT:$@ /SUBSYSTEM:CONSOLE $(LINKFLAGS) /MAP $** $(LIBS) msvcrt.lib
221
222wad2art$(EXESUFFIX): $(TOOLS)\wad2art.$o $(SRC)\pragmas.$o $(SRC)\compat.$o
223	$(LINK) /OUT:$@ /SUBSYSTEM:CONSOLE $(LINKFLAGS) /MAP $** $(LIBS) msvcrt.lib
224
225bin2c$(EXESUFFIX): $(TOOLS)\bin2c.$o
226	$(LINK) /OUT:$@ /SUBSYSTEM:CONSOLE $(LINKFLAGS) /MAP $** msvcrt.lib
227
228$(SRC)\version-auto.c: AlwaysBuild
229	cmd /c $(TOOLS)\generateversion.cmd > $@
230
231AlwaysBuild: ;
232
233# DEPENDENCIES
234!include Makefile.deps
235
236# PHONIES
237clean:
238	-del /q $(ENGINEOBJS) $(LIBSQUISHOBJS) $(EDITOROBJS) $(GAMEEXEOBJS) $(EDITOREXEOBJS)
239veryclean: clean
240	-del /q $(SRC)\$(ENGINELIB) $(SRC)\$(EDITORLIB) $(GAMEDATA)\game$(EXESUFFIX) $(GAMEDATA)\build$(EXESUFFIX) $(UTILS)
241
242