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 = 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 # subsystem = Kernel subsystem
18 # kmdll = Kernel mode DLL
19 # $TARGET_APPTYPE = Application type (windows,native,console)
20 # $TARGET_NAME = Base name of output file and .rc, .def, and .edf files
21 # $TARGET_OBJECTS = Object files that compose the module
22 # $TARGET_CPPAPP = C++ application (no,yes) (optional)
23 # $TARGET_HEADERS = Header files that the object files depend on (optional)
24 # $TARGET_DEFNAME = Base name of .def and .edf files (optional)
25 # $TARGET_BASENAME = Base name of output file (overrides $TARGET_NAME if it exists) (optional)
26 # $TARGET_EXTENSION = Extension of the output file (optional)
27 # $TARGET_DDKLIBS = DDK libraries that are to be imported by the module (optional)
28 # $TARGET_SDKLIBS = SDK libraries that are to be imported by the module (optional)
29 # $TARGET_LIBS = Other libraries that are to be imported by the module (optional)
30 # $TARGET_GCCLIBS = GCC libraries imported with -l (optional)
31 # $TARGET_LFLAGS = GCC flags when linking (optional)
32 # $TARGET_CFLAGS = GCC flags (optional)
33 # $TARGET_CPPFLAGS = G++ flags (optional)
34 # $TARGET_ASFLAGS = GCC assembler flags (optional)
35 # $TARGET_NFLAGS = NASM flags (optional)
36 # $TARGET_RCFLAGS = Windres flags (optional)
37 # $TARGET_CLEAN = Files that are part of the clean rule (optional)
38 # $TARGET_PATH = Relative path for *.def, *.edf, and *.rc (optional)
39 # $TARGET_BASE = Default base address (optional)
40 # $TARGET_ENTRY = Entry point (optional)
41 # $TARGET_DEFONLY = Use .def instead of .edf extension (no,yes) (optional)
42 # $TARGET_NORC = Do not include standard resource file (no,yes) (optional)
43 # $TARGET_LIBPATH = Destination path for import libraries (optional)
44 # $TARGET_INSTALLDIR = Destination path when installed (optional)
45 # $TARGET_PCH = Filename of header to use to generate a PCH if supported by the compiler (optional)
46 # $TARGET_BOOTSTRAP = Wether this file is needed to bootstrap the installation (no,yes) (optional)
47 # $TARGET_BOOTSTRAP_NAME = Name on the installation medium (optional)
48 # $TARGET_GENREGTESTS = Generate regression test registrations (optional)
49 # $WINE_MODE = Compile using WINE headers (no,yes) (optional)
50 # $WINE_RC = Name of .rc file for WINE modules (optional)
52 include $(PATH_TO_TOP)/config
55 ifeq ($(TARGET_PATH),)
64 MK_ARCH_ID := _M_ALPHA
71 ifeq ($(ARCH),powerpc)
75 # unknown architecture
77 MK_ARCH_ID := _M_UNKNOWN
80 ifeq ($(TARGET_TYPE),program)
84 MK_DEFENTRY := _DEFINE_TARGET_APPTYPE
87 ifneq ($(WINE_MODE),yes)
88 MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
89 MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
90 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
92 MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE)
93 MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE)
94 MK_RCFLAGS := --include-dir $(PATH_TO_TOP)/include/wine --include-dir $(WINE_INCLUDE)
101 MK_BOOTCDDIR := system32
104 MK_RES_BASE := $(TARGET_NAME)
106 MK_RES_BASE := $(WINE_RC)
110 ifeq ($(TARGET_TYPE),proglib)
114 MK_DEFENTRY := _WinMain@16
117 MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
118 MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
119 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
122 MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
125 MK_BOOTCDDIR := system32
127 MK_RES_BASE := $(TARGET_NAME)
130 ifeq ($(TARGET_TYPE),dynlink)
134 MK_DEFENTRY := _DllMain@12
137 ifneq ($(WINE_MODE),yes)
138 MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
139 MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
140 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
142 MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE)
143 MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE)
144 MK_RCFLAGS := --include-dir $(PATH_TO_TOP)/include/wine --include-dir $(WINE_INCLUDE)
148 MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
150 MK_INSTALLDIR := system32
151 MK_BOOTCDDIR := system32
154 MK_RES_BASE := $(TARGET_NAME)
156 MK_RES_BASE := $(WINE_RC)
160 ifeq ($(TARGET_TYPE),library)
168 MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
169 MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
170 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
175 MK_INSTALLDIR := # none
176 MK_BOOTCDDIR := system32
181 ifeq ($(TARGET_TYPE),driver_library)
188 MK_CFLAGS := -I./ -I$(DDK_PATH_INC)
189 MK_CPPFLAGS := -I./ -I$(DDK_PATH_INC)
190 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
193 MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
195 MK_INSTALLDIR := $(DDK_PATH_INC)
197 MK_DISTDIR := # FIXME
201 ifeq ($(TARGET_TYPE),driver)
205 MK_DEFENTRY := _DriverEntry@8
206 MK_DDKLIBS := ntoskrnl.a hal.a
208 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
209 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
210 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
215 MK_INSTALLDIR := system32/drivers
217 MK_DISTDIR := drivers
218 MK_RES_BASE := $(TARGET_NAME)
221 ifeq ($(TARGET_TYPE),export_driver)
225 MK_DEFENTRY := _DriverEntry@8
226 MK_DDKLIBS := ntoskrnl.a hal.a
228 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
229 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
230 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
233 MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
235 MK_INSTALLDIR := system32/drivers
237 MK_DISTDIR := drivers
238 MK_RES_BASE := $(TARGET_NAME)
241 ifeq ($(TARGET_TYPE),hal)
245 MK_DEFENTRY := _DriverEntry@8
246 MK_DDKLIBS := ntoskrnl.a
248 MK_CFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC)
249 MK_CPPFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC)
250 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
255 MK_INSTALLDIR := system32
258 MK_RES_BASE := $(TARGET_NAME)
261 ifeq ($(TARGET_TYPE),bootpgm)
265 MK_DEFENTRY := _DriverEntry@8
268 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
269 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
270 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
275 MK_INSTALLDIR := system32
276 MK_BOOTCDDIR := system32
277 MK_DISTDIR := # FIXME
278 MK_RES_BASE := $(TARGET_NAME)
281 ifeq ($(TARGET_TYPE),miniport)
285 MK_DEFENTRY := _DriverEntry@8
288 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
289 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
290 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
295 MK_INSTALLDIR := system32/drivers
297 MK_DISTDIR := drivers
298 MK_RES_BASE := $(TARGET_NAME)
301 ifeq ($(TARGET_TYPE),gdi_driver)
305 MK_DEFENTRY := _DrvEnableDriver@12
306 MK_DDKLIBS := ntoskrnl.a hal.a win32k.a
308 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
309 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
310 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
313 MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
315 MK_INSTALLDIR := system32
318 MK_RES_BASE := $(TARGET_NAME)
322 # can be overidden with $(CXX) for linkage of c++ executables
326 ifeq ($(TARGET_TYPE),program)
327 ifeq ($(TARGET_APPTYPE),windows)
328 MK_DEFENTRY := _WinMainCRTStartup
329 MK_SDKLIBS := ntdll.a kernel32.a gdi32.a user32.a
330 TARGET_LFLAGS += -Wl,--subsystem,windows
333 ifeq ($(TARGET_APPTYPE),native)
334 MK_DEFENTRY := _NtProcessStartup@4
335 MK_SDKLIBS := ntdll.a
336 TARGET_LFLAGS += -Wl,--subsystem,native -nostartfiles
339 ifeq ($(TARGET_APPTYPE),console)
340 MK_DEFENTRY := _mainCRTStartup
342 TARGET_LFLAGS += -Wl,--subsystem,console
346 ifeq ($(TARGET_TYPE),proglib)
347 ifeq ($(TARGET_APPTYPE),windows)
348 MK_DEFENTRY := _WinMainCRTStartup
349 MK_SDKLIBS := ntdll.a kernel32.a gdi32.a user32.a
350 TARGET_LFLAGS += -Wl,--subsystem,windows
353 ifeq ($(TARGET_APPTYPE),native)
354 MK_DEFENTRY := _NtProcessStartup@4
355 MK_SDKLIBS := ntdll.a
356 TARGET_LFLAGS += -Wl,--subsystem,native -nostartfiles
359 ifeq ($(TARGET_APPTYPE),console)
360 MK_DEFENTRY := _mainCRTStartup
362 TARGET_LFLAGS += -Wl,--subsystem,console
366 ifeq ($(TARGET_TYPE),subsystem)
370 MK_DEFENTRY := _DriverEntry@8
371 MK_DDKLIBS := ntoskrnl.a hal.a
373 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
374 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
375 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
378 MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
380 MK_INSTALLDIR := system32
381 MK_DISTDIR := drivers
382 MK_RES_BASE := $(TARGET_NAME)
385 ifeq ($(TARGET_TYPE),kmdll)
390 MK_DDKLIBS := ntoskrnl.a hal.a
392 MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
393 MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
394 MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
397 MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
399 MK_INSTALLDIR := system32
400 MK_DISTDIR := drivers
401 MK_RES_BASE := $(TARGET_NAME)
405 MK_RESOURCE := $(MK_RES_BASE).coff
408 ifneq ($(TARGET_INSTALLDIR),)
409 MK_INSTALLDIR := $(TARGET_INSTALLDIR)
413 ifneq ($(BOOTCD_INSTALL),)
418 ifeq ($(TARGET_LIBPATH),)
419 MK_IMPLIBPATH := $(MK_IMPLIBDEFPATH)
421 MK_IMPLIBPATH := $(TARGET_LIBPATH)
425 ifeq ($(TARGET_BASENAME),)
426 MK_BASENAME := $(TARGET_NAME)
428 MK_BASENAME := $(TARGET_BASENAME)
432 ifeq ($(TARGET_EXTENSION),)
433 MK_EXT := $(MK_DEFEXT)
435 MK_EXT := $(TARGET_EXTENSION)
439 ifeq ($(TARGET_NORC),yes)
442 MK_FULLRES := $(TARGET_PATH)/$(MK_RESOURCE)
445 ifeq ($(TARGET_DEFNAME),)
446 MK_DEFBASE := $(TARGET_NAME)
448 MK_DEFBASE := $(TARGET_DEFNAME)
451 MK_DEFNAME := $(TARGET_PATH)/$(MK_DEFBASE).def
452 ifeq ($(TARGET_DEFONLY),yes)
453 MK_EDFNAME := $(MK_DEFNAME)
455 MK_EDFNAME := $(TARGET_PATH)/$(MK_DEFBASE).edf
459 ifeq ($(MK_MODE),user)
460 ifeq ($(MK_EXETYPE),dll)
461 MK_DEFBASE := 0x10000000
463 MK_DEFBASE := 0x400000
465 ifneq ($(TARGET_SDKLIBS),)
466 MK_LIBS := $(addprefix $(SDK_PATH_LIB)/, $(TARGET_SDKLIBS))
468 MK_LIBS := $(addprefix $(SDK_PATH_LIB)/, $(MK_SDKLIBS))
473 ifeq ($(MK_MODE),kernel)
474 MK_DEFBASE := 0x10000
475 MK_LIBS := $(addprefix $(DDK_PATH_LIB)/, $(MK_DDKLIBS) $(TARGET_DDKLIBS))
479 ifneq ($(TARGET_LIBS),)
480 MK_LIBS := $(TARGET_LIBS) $(MK_LIBS)
484 ifeq ($(TARGET_BASE),)
485 TARGET_BASE := $(MK_DEFBASE)
489 ifeq ($(TARGET_ENTRY),)
490 TARGET_ENTRY := $(MK_DEFENTRY)
495 # Include details of the OS configuration
497 include $(PATH_TO_TOP)/config
500 TARGET_ASFLAGS += -march=$(ARCH) -D$(MK_ARCH_ID)
501 TARGET_CFLAGS += $(MK_CFLAGS)
502 TARGET_CFLAGS += -pipe -march=$(ARCH) -D$(MK_ARCH_ID)
509 TARGET_CPPFLAGS += $(MK_CPPFLAGS)
510 TARGET_CPPFLAGS += -pipe -march=$(ARCH) -D$(MK_ARCH_ID)
512 TARGET_RCFLAGS += $(MK_RCFLAGS)
514 TARGET_ASFLAGS += $(MK_ASFLAGS)
515 TARGET_ASFLAGS += -pipe -march=$(ARCH)
517 TARGET_NFLAGS += $(MK_NFLAGS)
520 MK_GCCLIBS := $(addprefix -l, $(TARGET_GCCLIBS))
522 ifeq ($(MK_MODE),static)
523 MK_FULLNAME := $(SDK_PATH_LIB)/$(MK_BASENAME)$(MK_EXT)
525 MK_FULLNAME := $(MK_BASENAME)$(MK_EXT)
528 MK_IMPLIB_FULLNAME := $(MK_BASENAME)$(MK_IMPLIB_EXT)
530 MK_NOSTRIPNAME := $(MK_BASENAME).nostrip$(MK_EXT)
532 # We don't want to link header files
533 MK_OBJECTS := $(filter-out %.h,$(TARGET_OBJECTS))
535 # There is problems with C++ applications and ld -r. Ld can cause errors like:
536 # reloc refers to symbol `.text$_ZN9CCABCodecC2Ev' which is not being output
537 ifeq ($(TARGET_CPPAPP),yes)
538 MK_STRIPPED_OBJECT := $(MK_OBJECTS)
540 MK_STRIPPED_OBJECT := $(MK_BASENAME).stripped.o
543 ifeq ($(MK_IMPLIBONLY),yes)
545 TARGET_CLEAN += $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME)
547 all: $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME)
549 $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(TARGET_OBJECTS) $(MK_DEFNAME)
551 --dllname $(MK_FULLNAME) \
552 --def $(MK_DEFNAME) \
553 --output-lib $(MK_IMPLIBPATH)/$(MK_BASENAME).a \
559 all: $(MK_GENREGTESTS) $(MK_FULLNAME) $(MK_NOSTRIPNAME)
562 ifeq ($(TARGET_GENREGTESTS),yes)
565 .PHONY: _regtests_phony
566 _regtests.c: _regtests_phony
567 $(REGTESTS) . _regtests.c
568 MK_GENREGTESTS := _regtests_phony
569 MK_GENREGTESTS_CLEAN := _regtests.c _regtests.o
572 MK_GENREGTESTS_CLEAN :=
576 ifeq ($(MK_IMPLIB),yes)
577 MK_EXTRACMD := --def $(MK_EDFNAME)
583 ifeq ($(MK_MODE),user)
585 ifeq ($(MK_EXETYPE),dll)
586 TARGET_LFLAGS += -mdll -Wl,--image-base,$(TARGET_BASE)
587 MK_EXTRADEP := $(MK_EDFNAME)
588 MK_EXTRACMD2 := -Wl,temp.exp
594 $(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS)
595 ifeq ($(MK_EXETYPE),dll)
596 $(LD_CC) -Wl,--base-file,base.tmp \
597 -Wl,--entry,$(TARGET_ENTRY) \
600 $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
602 $(DLLTOOL) --dllname $(MK_FULLNAME) \
603 --base-file base.tmp \
604 --output-exp temp.exp $(MK_EXTRACMD)
606 $(LD_CC) -Wl,--base-file,base.tmp \
607 -Wl,--entry,$(TARGET_ENTRY) \
611 $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
613 $(DLLTOOL) --dllname $(MK_FULLNAME) \
614 --base-file base.tmp \
615 --output-exp temp.exp $(MK_EXTRACMD)
618 $(LD_CC) $(TARGET_LFLAGS) \
619 -Wl,--entry,$(TARGET_ENTRY) $(MK_EXTRACMD2) \
620 -o $(MK_NOSTRIPNAME) \
621 $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
623 - $(RSYM) $(MK_NOSTRIPNAME) $(MK_BASENAME).sym
624 ifeq ($(FULL_MAP),yes)
625 $(OBJDUMP) -d -S $(MK_NOSTRIPNAME) > $(MK_BASENAME).map
627 $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).map
630 $(MK_FULLNAME): $(MK_NOSTRIPNAME) $(MK_EXTRADEP)
632 ifneq ($(TARGET_CPPAPP),yes)
633 $(LD) -r -o $(MK_STRIPPED_OBJECT) $(MK_OBJECTS)
634 $(STRIP) --strip-debug $(MK_STRIPPED_OBJECT)
636 ifeq ($(MK_EXETYPE),dll)
637 $(LD_CC) -Wl,--base-file,base.tmp \
638 -Wl,--entry,$(TARGET_ENTRY) \
642 $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
644 $(DLLTOOL) --dllname $(MK_FULLNAME) \
645 --base-file base.tmp \
646 --output-exp temp.exp $(MK_EXTRACMD)
648 $(LD_CC) -Wl,--base-file,base.tmp \
649 -Wl,--entry,$(TARGET_ENTRY) \
654 $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
656 $(DLLTOOL) --dllname $(MK_FULLNAME) \
657 --base-file base.tmp \
658 --output-exp temp.exp $(MK_EXTRACMD)
661 $(LD_CC) $(TARGET_LFLAGS) \
662 -Wl,--entry,$(TARGET_ENTRY) \
666 $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
667 ifneq ($(TARGET_CPPAPP),yes)
668 - $(RM) temp.exp $(MK_STRIPPED_OBJECT)
675 # Kernel mode targets
676 ifeq ($(MK_MODE),kernel)
678 ifeq ($(MK_IMPLIB),yes)
679 MK_EXTRACMD := --def $(MK_EDFNAME)
680 MK_EXTRADEP := $(MK_EDFNAME)
686 $(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS)
687 $(LD_CC) -Wl,--base-file,base.tmp \
688 -Wl,--entry,$(TARGET_ENTRY) \
690 -nostartfiles -nostdlib \
692 $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
694 $(DLLTOOL) --dllname $(MK_FULLNAME) \
695 --base-file base.tmp \
696 --output-exp temp.exp $(MK_EXTRACMD)
698 $(LD_CC) $(TARGET_LFLAGS) \
699 -Wl,--subsystem,native \
700 -Wl,--image-base,$(TARGET_BASE) \
701 -Wl,--file-alignment,0x1000 \
702 -Wl,--section-alignment,0x1000 \
703 -Wl,--entry,$(TARGET_ENTRY) \
705 -mdll -nostartfiles -nostdlib \
706 -o $(MK_NOSTRIPNAME) \
707 $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
709 $(RSYM) $(MK_NOSTRIPNAME) $(MK_BASENAME).sym
710 ifeq ($(FULL_MAP),yes)
711 $(OBJDUMP) -d -S $(MK_NOSTRIPNAME) > $(MK_BASENAME).map
713 $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).map
716 $(MK_FULLNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) $(MK_NOSTRIPNAME)
718 ifneq ($(TARGET_CPPAPP),yes)
719 $(LD) -r -o $(MK_STRIPPED_OBJECT) $(MK_OBJECTS)
720 $(STRIP) --strip-debug $(MK_STRIPPED_OBJECT)
722 $(LD_CC) -Wl,--base-file,base.tmp \
723 -Wl,--entry,$(TARGET_ENTRY) \
725 -nostartfiles -nostdlib \
727 $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
729 $(DLLTOOL) --dllname $(MK_FULLNAME) \
730 --base-file base.tmp \
731 --output-exp temp.exp $(MK_EXTRACMD)
733 $(LD_CC) $(TARGET_LFLAGS) \
734 -Wl,--subsystem,native \
735 -Wl,--image-base,$(TARGET_BASE) \
736 -Wl,--file-alignment,0x1000 \
737 -Wl,--section-alignment,0x1000 \
738 -Wl,--entry,$(TARGET_ENTRY) \
740 -mdll -nostartfiles -nostdlib \
742 $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
743 ifneq ($(TARGET_CPPAPP),yes)
744 - $(RM) temp.exp $(MK_STRIPPED_OBJECT)
751 # Static library target
752 ifeq ($(MK_MODE),static)
754 $(MK_FULLNAME): $(TARGET_OBJECTS)
755 $(AR) -r $(MK_FULLNAME) $(TARGET_OBJECTS)
757 # Static libraries dont have a nostrip version
761 .phony: $(MK_NOSTRIPNAME)
765 endif # MK_IMPLIBONLY
768 $(MK_FULLRES): $(PATH_TO_TOP)/include/reactos/buildno.h $(TARGET_PATH)/$(MK_RES_BASE).rc
770 ifeq ($(MK_DEPENDS),yes)
776 ifeq ($(MK_IMPLIB),yes)
777 $(MK_IMPLIBPATH)/$(MK_BASENAME).a: $(MK_DEFNAME)
778 $(DLLTOOL) --dllname $(MK_FULLNAME) \
779 --def $(MK_DEFNAME) \
780 --output-lib $(MK_IMPLIBPATH)/$(MK_BASENAME).a \
783 implib: $(MK_IMPLIBPATH)/$(MK_BASENAME).a
788 # Be carefull not to clean non-object files
789 MK_CLEANFILES := $(filter %.o,$(MK_OBJECTS))
790 MK_CLEANFILTERED := $(MK_OBJECTS:.o=.d)
791 MK_CLEANDEPS := $(join $(dir $(MK_CLEANFILTERED)), $(addprefix ., $(notdir $(MK_CLEANFILTERED))))
794 - $(RM) *.o depend.d *.pch $(MK_BASENAME).sym $(MK_BASENAME).a $(TARGET_PATH)/$(MK_RES_BASE).coff \
795 $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(MK_CLEANFILES) $(MK_CLEANDEPS) $(MK_GENREGTESTS_CLEAN) $(MK_BASENAME).map \
796 junk.tmp base.tmp temp.exp \
799 ifneq ($(TARGET_HEADERS),)
800 $(TARGET_OBJECTS): $(TARGET_HEADERS)
803 # install, dist and bootcd rules
805 ifeq ($(MK_IMPLIBONLY),yes)
807 # Don't install import libraries
818 # Don't install static libraries
819 ifeq ($(MK_MODE),static)
829 install: $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
831 ifeq ($(INSTALL_SYMBOLS),no)
833 $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME):
834 $(CP) $(MK_FULLNAME) $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
836 else # INSTALL_SYMBOLS
838 $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME): $(MK_FULLNAME) $(MK_BASENAME).sym
839 $(CP) $(MK_FULLNAME) $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
840 $(CP) $(MK_BASENAME).sym $(INSTALL_DIR)/symbols/$(MK_BASENAME).sym
842 endif # INSTALL_SYMBOLS
844 dist: $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME)
846 $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME): $(MK_FULLNAME)
847 $(CP) $(MK_FULLNAME) $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME)
848 $(CP) $(MK_BASENAME).sym $(DIST_DIR)/symbols/$(MK_BASENAME).sym
850 # Bootstrap files for the bootable CD
851 ifeq ($(TARGET_BOOTSTRAP),yes)
853 ifneq ($(TARGET_BOOTSTRAP_NAME),)
854 MK_BOOTSTRAP_NAME := $(TARGET_BOOTSTRAP_NAME)
855 else # TARGET_BOOTSTRAP_NAME
856 MK_BOOTSTRAP_NAME := $(MK_FULLNAME)
857 endif # TARGET_BOOTSTRAP_NAME
859 bootcd: $(BOOTCD_DIR)/reactos/$(MK_BOOTCDDIR)/$(MK_BOOTSTRAP_NAME)
861 $(BOOTCD_DIR)/reactos/$(MK_BOOTCDDIR)/$(MK_BOOTSTRAP_NAME):
862 $(CP) $(MK_FULLNAME) $(BOOTCD_DIR)/reactos/$(MK_BOOTCDDIR)/$(MK_BOOTSTRAP_NAME)
864 else # TARGET_BOOTSTRAP
868 endif # TARGET_BOOTSTRAP
872 endif # MK_IMPLIBONLY
875 .phony: all depends implib clean install dist bootcd depends
878 # Precompiled header support
879 # When using PCHs, use dependency tracking to keep the .pch files up-to-date.
882 ifeq ($(ROS_USE_PCH),yes)
883 ifneq ($(TARGET_PCH),)
884 MK_PCHNAME = $(TARGET_PCH).pch
886 # GCC generates wrong dependencies for header files.
887 MK_PCHFAKE = $(TARGET_PCH:.h=.o)
889 - $(RTOUCH) $(MK_PCHFAKE)
891 $(MK_PCHNAME): depend.d
892 - $(RTOUCH) $(MK_PCHNAME)
893 - $(CC) $(TARGET_CFLAGS) $(TARGET_PCH)
895 depend.d: $(MK_PCHFAKE)
897 - $(CC) $(TARGET_CFLAGS) $(TARGET_PCH) -M -MF depend.d
905 %.o: %.c $(MK_PCHNAME)
906 $(CC) $(TARGET_CFLAGS) -c $< -o $@
908 $(CXX) $(TARGET_CPPFLAGS) -c $< -o $@
910 $(CXX) $(TARGET_CPPFLAGS) -c $< -o $@
912 $(CXX) $(TARGET_CPPFLAGS) -c $< -o $@
914 $(AS) $(TARGET_ASFLAGS) -c $< -o $@
916 $(AS) $(TARGET_ASFLAGS) -c $< -o $@
918 $(NASM_CMD) $(NFLAGS) $(TARGET_NFLAGS) $< -o $@
920 $(RC) $(TARGET_RCFLAGS) $(RCINC) $< -o $@
925 CFLAGS := $(TARGET_CFLAGS)