Integrated winhello into new build system
[reactos.git] / reactos / tools / helper.mk
1 # $Id: helper.mk,v 1.4 2001/08/23 16:14:47 chorns Exp $
2 #
3 # Helper makefile for ReactOS modules
4 # Variables this makefile accepts:
5 # $TARGET_TYPE = Type of target:
6 # program = User mode program
7 # proglib = Executable program that have exported functions
8 # dynlink = Dynamic Link Library (DLL)
9 # library = Import library that will be linked with other code
10 # driver_library = Import library for a driver
11 # driver = Kernel mode driver
12 # export_driver = Kernel mode driver that have exported functions
13 # hal = Hardware Abstraction Layer
14 # bootpgm = Boot program
15 # miniport = Kernel mode driver that does not link with ntoskrnl.exe or hal.dll
16 # gdi_driver = Kernel mode graphics driver that link with win32k.sys
17 # $TARGET_APPTYPE = Application type (windows,native,console)
18 # $TARGET_NAME = Base name of output file and .rc, .def, and .edf files
19 # $TARGET_OBJECTS = Object files that compose the module
20 # $TARGET_HEADERS = Header files that the object files depend on (optional)
21 # $TARGET_DEFNAME = Base name of .def and .edf files (optional)
22 # $TARGET_BASENAME = Base name of output file (overrides $TARGET_NAME if it exists) (optional)
23 # $TARGET_EXTENSION = Extesion of the output file (optional)
24 # $TARGET_DDKLIBS = DDK libraries that are to be imported by the module (optional)
25 # $TARGET_SDKLIBS = SDK libraries that are to be imported by the module (optional)
26 # $TARGET_LIBS = Other libraries that are to be imported by the module (optional)
27 # $TARGET_GCCLIBS = GCC libraries imported with -l (optional)
28 # $TARGET_LFLAGS = GCC flags when linking (optional)
29 # $TARGET_CFLAGS = GCC flags (optional)
30 # $TARGET_CPPFLAGS = G++ flags (optional)
31 # $TARGET_ASFLAGS = GCC assembler flags (optional)
32 # $TARGET_NFLAGS = NASM flags (optional)
33 # $TARGET_CLEAN = Files that are part of the clean rule (optional)
34 # $TARGET_PATH = Relative path for *.def, *.edf, and *.rc (optional)
35 # $TARGET_BASE = Default base address (optional)
36 # $TARGET_ENTRY = Entry point (optional)
37 # $TARGET_DEFONLY = Use .def instead of .edf extension (no,yes) (optional)
38 # $TARGET_NORC = Do not include standard resource file (no,yes) (optional)
39 # $TARGET_LIBPATH = Destination path for import libraries (optional)
40 # $TARGET_INSTALLDIR = Destination path when installed (optional)
41
42 ifeq ($(TARGET_PATH),)
43 TARGET_PATH := .
44 endif
45
46
47 # FIXME: MK_DEFENTRY may not be correct
48 ifeq ($(TARGET_TYPE),program)
49 MK_MODE := user
50 MK_EXETYPE := exe
51 MK_DEFEXT := .exe
52 MK_DEFENTRY := _DEFINE_TARGET_APPTYPE
53 MK_DDKLIBS :=
54 MK_SDKLIBS :=
55 MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
56 MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
57 MK_IMPLIB := no
58 MK_IMPLIBONLY := no
59 MK_IMPLIBDEFPATH :=
60 MK_INSTALLDIR := bin
61 MK_DISTDIR := apps
62 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
63 endif
64
65 ifeq ($(TARGET_TYPE),proglib)
66 MK_MODE := user
67 MK_EXETYPE := dll
68 MK_DEFEXT := .exe
69 MK_DEFENTRY := _WinMain@16
70 MK_DDKLIBS :=
71 MK_SDKLIBS :=
72 MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
73 MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
74 MK_IMPLIB := yes
75 MK_IMPLIBONLY := no
76 MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
77 MK_INSTALLDIR := bin
78 MK_DISTDIR := apps
79 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
80 endif
81
82 ifeq ($(TARGET_TYPE),dynlink)
83 MK_MODE := user
84 MK_EXETYPE := dll
85 MK_DEFEXT := .dll
86 MK_DEFENTRY := _DllMain@12
87 MK_DDKLIBS :=
88 MK_SDKLIBS :=
89 MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
90 MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
91 MK_IMPLIB := yes
92 MK_IMPLIBONLY := no
93 MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
94 MK_INSTALLDIR := system32
95 MK_DISTDIR := dlls
96 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
97 endif
98
99 ifeq ($(TARGET_TYPE),library)
100 MK_MODE := user
101 MK_EXETYPE := dll
102 MK_DEFEXT := .a
103 MK_DEFENTRY :=
104 MK_DDKLIBS :=
105 MK_SDKLIBS :=
106 MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
107 MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
108 MK_IMPLIB := no
109 MK_IMPLIBONLY := yes
110 MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
111 MK_INSTALLDIR := $(SDK_PATH_INC)
112 MK_DISTDIR := # FIXME
113 MK_RESOURCE :=
114 endif
115
116 ifeq ($(TARGET_TYPE),driver_library)
117 MK_MODE := kernel
118 MK_EXETYPE := dll
119 MK_DEFEXT := .dll
120 MK_DEFENTRY :=
121 MK_DDKLIBS :=
122 MK_SDKLIBS :=
123 MK_CFLAGS := -I./ -I$(DDK_PATH_INC)
124 MK_CPPFLAGS := -I./ -I$(DDK_PATH_INC)
125 MK_IMPLIB := no
126 MK_IMPLIBONLY := yes
127 MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
128 MK_INSTALLDIR := $(DDK_PATH_INC)
129 MK_DISTDIR := # FIXME
130 MK_RESOURCE :=
131 endif
132
133 ifeq ($(TARGET_TYPE),driver)
134 MK_MODE := kernel
135 MK_EXETYPE := dll
136 MK_DEFEXT := .sys
137 MK_DEFENTRY := _DriverEntry@8
138 MK_DDKLIBS := ntoskrnl.a hal.a
139 MK_SDKLIBS :=
140 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
141 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
142 MK_IMPLIB := no
143 MK_IMPLIBONLY := no
144 MK_IMPLIBDEFPATH :=
145 MK_INSTALLDIR := system32/drivers
146 MK_DISTDIR := drivers
147 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
148 endif
149
150 ifeq ($(TARGET_TYPE),export_driver)
151 MK_MODE := kernel
152 MK_EXETYPE := dll
153 MK_DEFEXT := .sys
154 MK_DEFENTRY := _DriverEntry@8
155 MK_DDKLIBS := ntoskrnl.a hal.a
156 MK_SDKLIBS :=
157 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
158 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
159 MK_IMPLIB := yes
160 MK_IMPLIBONLY := no
161 MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
162 MK_INSTALLDIR := system32/drivers
163 MK_DISTDIR := drivers
164 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
165 endif
166
167 ifeq ($(TARGET_TYPE),hal)
168 MK_MODE := kernel
169 MK_EXETYPE := dll
170 MK_DEFEXT := .dll
171 MK_DEFENTRY := _DriverEntry@8
172 MK_DDKLIBS := ntoskrnl.a
173 MK_SDKLIBS :=
174 MK_CFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC)
175 MK_CPPFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC)
176 MK_IMPLIB := yes
177 MK_IMPLIBONLY := no
178 MK_IMPLIBDEFPATH :=
179 MK_INSTALLDIR := system32
180 MK_DISTDIR := dlls
181 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
182 endif
183
184 ifeq ($(TARGET_TYPE),bootpgm)
185 MK_MODE := kernel
186 MK_EXETYPE := exe
187 MK_DEFEXT := .exe
188 MK_DEFENTRY := _DriverEntry@8
189 MK_DDKLIBS :=
190 MK_SDKLIBS :=
191 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
192 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
193 MK_IMPLIB := no
194 MK_IMPLIBONLY := no
195 MK_IMPLIBDEFPATH :=
196 MK_INSTALLDIR := system32
197 MK_DISTDIR := # FIXME
198 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
199 endif
200
201 ifeq ($(TARGET_TYPE),miniport)
202 MK_MODE := kernel
203 MK_EXETYPE := dll
204 MK_DEFEXT := .sys
205 MK_DEFENTRY := _DriverEntry@8
206 MK_DDKLIBS :=
207 MK_SDKLIBS :=
208 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
209 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
210 MK_IMPLIB := no
211 MK_IMPLIBONLY := no
212 MK_IMPLIBDEFPATH :=
213 MK_INSTALLDIR := system32/drivers
214 MK_DISTDIR := drivers
215 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
216 endif
217
218 ifeq ($(TARGET_TYPE),gdi_driver)
219 MK_MODE := kernel
220 MK_EXETYPE := dll
221 MK_DEFEXT := .dll
222 MK_DEFENTRY := _DrvEnableDriver@12
223 # MK_DEFENTRY := _DriverEntry@8
224 MK_DDKLIBS := ntoskrnl.a hal.a win32k.a
225 MK_SDKLIBS :=
226 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
227 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
228 MK_IMPLIB := yes
229 MK_IMPLIBONLY := no
230 MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
231 MK_INSTALLDIR := system32/drivers
232 MK_DISTDIR := drivers
233 MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
234 endif
235
236
237 ifeq ($(TARGET_TYPE),program)
238 ifeq ($(TARGET_APPTYPE),windows)
239 MK_DEFENTRY := _WinMainCRTStartup
240 MK_SDKLIBS :=
241 TARGET_LFLAGS += -Wl,--subsystem,windows
242 endif
243
244 ifeq ($(TARGET_APPTYPE),native)
245 MK_DEFENTRY := _NtProcessStartup
246 MK_SDKLIBS := ntdll.a
247 TARGET_LFLAGS += -Wl,--subsystem,native -nostartfiles
248 endif
249
250 ifeq ($(TARGET_APPTYPE),console)
251 MK_DEFENTRY := _mainCRTStartup
252 MK_SDKLIBS :=
253 TARGET_LFLAGS += -Wl,--subsystem,console
254 endif
255 endif
256
257
258 ifneq ($(TARGET_INSTALLDIR),)
259 MK_INSTALLDIR := $(TARGET_INSTALLDIR)
260 endif
261
262
263 ifeq ($(TARGET_LIBPATH),)
264 MK_IMPLIBPATH := $(MK_IMPLIBDEFPATH)
265 else
266 MK_IMPLIBPATH := $(TARGET_LIBPATH)
267 endif
268
269
270 ifeq ($(TARGET_BASENAME),)
271 MK_BASENAME := $(TARGET_NAME)
272 else
273 MK_BASENAME := $(TARGET_BASENAME)
274 endif
275
276
277 ifeq ($(TARGET_EXTENSION),)
278 MK_EXT := $(MK_DEFEXT)
279 else
280 MK_EXT := $(TARGET_EXTENSION)
281 endif
282
283
284 ifeq ($(TARGET_NORC),yes)
285 MK_RESOURCE :=
286 endif
287
288
289 ifeq ($(TARGET_DEFNAME),)
290 MK_DEFBASE := $(TARGET_NAME)
291 else
292 MK_DEFBASE := $(TARGET_DEFNAME)
293 endif
294
295 MK_DEFNAME := $(TARGET_PATH)/$(MK_DEFBASE).def
296 ifeq ($(TARGET_DEFONLY),yes)
297 MK_EDFNAME := $(MK_DEFNAME)
298 else
299 MK_EDFNAME := $(TARGET_PATH)/$(MK_DEFBASE).edf
300 endif
301
302
303 ifeq ($(MK_MODE),user)
304 MK_DEFBASE := 0x400000
305 MK_LIBS := $(addprefix $(SDK_PATH_LIB)/, $(MK_SDKLIBS) $(TARGET_SDKLIBS))
306 endif
307
308 ifeq ($(MK_MODE),kernel)
309 MK_DEFBASE := 0x10000
310 MK_LIBS := $(addprefix $(DDK_PATH_LIB)/, $(MK_DDKLIBS) $(TARGET_DDKLIBS))
311 endif
312
313
314 ifeq ($(TARGET_BASE),)
315 TARGET_BASE := $(MK_DEFBASE)
316 endif
317
318
319 ifeq ($(TARGET_ENTRY),)
320 TARGET_ENTRY := $(MK_DEFENTRY)
321 endif
322
323
324 #
325 # Include details of the OS configuration
326 #
327 include $(PATH_TO_TOP)/config
328
329
330 TARGET_CFLAGS += $(MK_CFLAGS)
331 TARGET_CFLAGS += -pipe -march=$(ARCH)
332
333 TARGET_CPPFLAGS += $(MK_CPPFLAGS)
334 TARGET_CPPFLAGS += -pipe -march=$(ARCH)
335
336 TARGET_ASFLAGS += $(MK_ASFLAGS)
337 TARGET_ASFLAGS += -pipe -march=$(ARCH)
338
339 TARGET_NFLAGS += $(MK_NFLAGS)
340
341
342 MK_GCCLIBS := $(addprefix -l, $(TARGET_GCCLIBS))
343
344 MK_FULLNAME := $(MK_BASENAME)$(MK_EXT)
345
346 MK_NOSTRIPNAME := $(MK_BASENAME).nostrip$(MK_EXT)
347
348 # We don't want to link header files
349 MK_OBJECTS := $(filter-out %.h,$(TARGET_OBJECTS))
350
351 ifeq ($(MK_IMPLIBONLY),yes)
352
353 TARGET_CLEAN += $(MK_IMPLIBPATH)/$(MK_FULLNAME)
354
355 all: $(MK_IMPLIBPATH)/$(MK_FULLNAME)
356
357 $(MK_IMPLIBPATH)/$(MK_FULLNAME): $(TARGET_OBJECTS)
358 $(DLLTOOL) \
359 --dllname $(MK_FULLNAME) \
360 --def $(MK_DEFNAME) \
361 --output-lib $(MK_IMPLIBPATH)/$(MK_BASENAME).a \
362 --kill-at
363
364 else # MK_IMPLIBONLY
365
366
367 all: $(MK_FULLNAME)
368
369
370 ifeq ($(MK_IMPLIB),yes)
371 MK_EXTRACMD := --def $(MK_EDFNAME)
372 else
373 MK_EXTRACMD :=
374 endif
375
376 # User mode targets
377 ifeq ($(MK_MODE),user)
378
379 ifeq ($(MK_EXETYPE),dll)
380 TARGET_LFLAGS += -mdll -Wl,--image-base,$(TARGET_BASE)
381 MK_EXTRACMD2 := -Wl,temp.exp
382 else
383 MK_EXTRACMD2 :=
384 endif
385
386 $(MK_NOSTRIPNAME): $(MK_RESOURCE) $(TARGET_OBJECTS) $(MK_LIBS)
387 ifeq ($(MK_IMPLIB),yes)
388 $(DLLTOOL) --dllname $(MK_FULLNAME) \
389 --def $(MK_DEFNAME) \
390 --output-lib $(MK_IMPLIBPATH)/$(MK_BASENAME).a \
391 --kill-at
392 endif
393 ifeq ($(MK_EXETYPE),dll)
394 $(CC) -Wl,--base-file,base.tmp \
395 -Wl,--entry,$(TARGET_ENTRY) \
396 $(TARGET_LFLAGS) \
397 -o junk.tmp $(MK_GCCLIBS) \
398 $(MK_RESOURCE) $(MK_OBJECTS) $(MK_LIBS)
399 - $(RM) junk.tmp
400 $(DLLTOOL) --dllname $(MK_FULLNAME) \
401 --base-file base.tmp \
402 --output-exp temp.exp $(MK_EXTRACMD)
403 - $(RM) base.tmp
404 endif
405 $(CC) $(TARGET_LFLAGS) \
406 -Wl,--entry,$(TARGET_ENTRY) $(MK_EXTRACMD2) \
407 -o $(MK_NOSTRIPNAME) $(MK_GCCLIBS) \
408 $(MK_RESOURCE) $(MK_OBJECTS) $(MK_LIBS)
409 - $(RM) temp.exp
410 - $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).sym
411 endif # KM_MODE
412
413 # Kernel mode targets
414 ifeq ($(MK_MODE),kernel)
415
416 ifeq ($(MK_IMPLIB),yes)
417 MK_EXTRACMD := --def $(MK_EDFNAME)
418 else
419 MK_EXTRACMD :=
420 endif
421
422 $(MK_NOSTRIPNAME): $(MK_RESOURCE) $(TARGET_OBJECTS) $(MK_LIBS)
423 ifeq ($(MK_IMPLIB),yes)
424 $(DLLTOOL) --dllname $(MK_FULLNAME) \
425 --def $(MK_DEFNAME) \
426 --output-lib $(MK_IMPLIBPATH)/$(MK_BASENAME).a \
427 --kill-at
428 endif
429 $(CC) -Wl,--base-file,base.tmp \
430 -Wl,--entry,$(TARGET_ENTRY) \
431 $(TARGET_LFLAGS) \
432 -nostartfiles -nostdlib \
433 -o junk.tmp $(MK_GCCLIBS) \
434 $(MK_RESOURCE) $(MK_OBJECTS) $(MK_LIBS)
435 - $(RM) junk.tmp
436 $(DLLTOOL) --dllname $(MK_FULLNAME) \
437 --base-file base.tmp \
438 --output-exp temp.exp $(MK_EXTRACMD)
439 - $(RM) base.tmp
440 $(CC) $(TARGET_LFLAGS) \
441 -Wl,--subsystem,native \
442 -Wl,--image-base,$(TARGET_BASE) \
443 -Wl,--file-alignment,0x1000 \
444 -Wl,--section-alignment,0x1000 \
445 -Wl,--entry,$(TARGET_ENTRY) \
446 -Wl,temp.exp \
447 -mdll -nostartfiles -nostdlib \
448 -o $(MK_NOSTRIPNAME) $(MK_GCCLIBS) \
449 $(MK_RESOURCE) $(MK_OBJECTS) $(MK_LIBS)
450 - $(RM) temp.exp
451 - $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).sym
452
453 endif # MK_MODE
454
455 $(MK_FULLNAME): $(MK_NOSTRIPNAME)
456 $(CP) $(MK_NOSTRIPNAME) $(MK_FULLNAME)
457 # $(STRIP) --strip-debug $(MK_FULLNAME)
458
459 endif # MK_IMPLIBONLY
460
461
462 $(MK_RESOURCE): $(PATH_TO_TOP)/include/reactos/buildno.h $(TARGET_PATH)/$(TARGET_NAME).rc
463
464 # Be carefull not to clean non-object files
465 MK_CLEANFILES := $(filter %.o,$(MK_OBJECTS))
466
467 clean:
468 - $(RM) *.o $(MK_BASENAME).sym $(MK_BASENAME).a $(TARGET_PATH)/$(TARGET_NAME).coff \
469 $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(MK_CLEANFILES) \
470 junk.tmp base.tmp temp.exp \
471 $(TARGET_CLEAN)
472
473 ifneq ($(TARGET_HEADERS),)
474 $(TARGET_OBJECTS): $(TARGET_HEADERS)
475 endif
476
477 # install and dist rules
478
479 ifeq ($(MK_IMPLIBONLY),yes)
480
481 # Don't install import libraries
482
483 install:
484
485 dist:
486
487 else # MK_IMPLIBONLY
488
489
490 install: $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
491
492 $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME): $(MK_FULLNAME)
493 $(CP) $(MK_FULLNAME) $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
494 $(CP) $(MK_BASENAME).sym $(INSTALL_DIR)/symbols/$(MK_BASENAME).sym
495
496 dist: $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME)
497
498 $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME): $(MK_FULLNAME)
499 $(CP) $(MK_FULLNAME) $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME)
500 $(CP) $(MK_BASENAME).sym $(DIST_DIR)/symbols/$(MK_BASENAME).sym
501
502
503 endif # MK_IMPLIBONLY
504
505
506 .phony: all clean install dist
507
508
509 %.o: %.c
510 $(CC) $(TARGET_CFLAGS) -c $< -o $@
511 %.o: %.cc
512 $(CC) $(TARGET_CPPFLAGS) -c $< -o $@
513 %.o: %.cpp
514 $(CC) $(TARGET_CPPFLAGS) -c $< -o $@
515 %.o: %.S
516 $(AS) $(TARGET_ASFLAGS) -c $< -o $@
517 %.o: %.s
518 $(AS) $(TARGET_ASFLAGS) -c $< -o $@
519 %.o: %.asm
520 $(NASM_CMD) $(TARGET_NFLAGS) $< -o $@
521 %.coff: %.rc
522 $(RC) $(RCINC) $< -o $@
523
524
525 # Compatibility
526 CFLAGS := $(TARGET_CFLAGS)
527
528 # EOF