1 # $Id: helper.mk,v 1.87 2004/10/18 19:11:09 chorns Exp $
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 = Kernel mode driver
11 # export_driver = Kernel mode driver that have exported functions
12 # driver_library = Import library for a driver
13 # kmlibrary = Static kernel-mode library
14 # hal = Hardware Abstraction Layer
15 # bootpgm = Boot program
16 # miniport = Kernel mode driver that does not link with ntoskrnl.exe or hal.dll
17 # gdi_driver = Kernel mode graphics driver that link with win32k.sys
18 # subsystem = Kernel subsystem
19 # kmdll = Kernel mode DLL
20 # winedll = DLL imported from wine
21 # kernel = ReactOS kernel
22 # $TARGET_APPTYPE = Application type (windows,native,console).
23 # Required only for TARGET_TYPEs program and proglib
24 # $TARGET_NAME = Base name of output file and .rc, .def, and .edf files
25 # $TARGET_OBJECTS = Object files that compose the module
26 # $TARGET_CPPAPP = C++ application (no,yes) (optional)
27 # $TARGET_HEADERS = Header files that the object files depend on (optional)
28 # $TARGET_DEFNAME = Base name of .def and .edf files (optional)
29 # $TARGET_BASENAME = Base name of output file (overrides $TARGET_NAME if it exists) (optional)
30 # $TARGET_EXTENSION = Extension of the output file (optional)
31 # $TARGET_DDKLIBS = DDK libraries that are to be imported by the module (optional)
32 # $TARGET_SDKLIBS = SDK libraries that are to be imported by the module (optional)
33 # $TARGET_LIBS = Other libraries that are to be imported by the module (optional)
34 # $TARGET_GCCLIBS = GCC libraries imported with -l (optional)
35 # $TARGET_LFLAGS = GCC flags when linking (optional)
36 # $TARGET_CFLAGS = GCC flags (optional)
37 # $TARGET_CPPFLAGS = G++ flags (optional)
38 # $TARGET_ASFLAGS = GCC assembler flags (optional)
39 # $TARGET_NFLAGS = NASM flags (optional)
40 # $TARGET_RCFLAGS = Windres flags (optional)
41 # $TARGET_CLEAN = Files that are part of the clean rule (optional)
42 # $TARGET_PATH = Relative path for *.def, *.edf, and *.rc (optional)
43 # $TARGET_BASE = Default base address (optional)
44 # $TARGET_ENTRY = Entry point (optional)
45 # $TARGET_NORC = Do not include standard resource file (no,yes) (optional)
46 # $TARGET_LIBPATH = Destination path for static libraries (optional)
47 # $TARGET_IMPLIBPATH = Destination path for import libraries (optional)
48 # $TARGET_INSTALLDIR = Destination path when installed (optional)
49 # $TARGET_PCH = Filename of header to use to generate a PCH if supported by the compiler (optional)
50 # $TARGET_BOOTSTRAP = Whether this file is needed to bootstrap the installation (no,yes) (optional)
51 # $TARGET_BOOTSTRAP_NAME = Name on the installation medium (optional)
52 # $TARGET_REGTESTS = This module has regression tests (no,yes) (optional)
53 # $TARGET_BUILDENV_TEST = Build this test to be run in the build environment (no,yes) (optional)
54 # $SUBDIRS = Subdirs in which to run make (optional)
56 include $(PATH_TO_TOP
)/config
57 include $(PATH_TO_TOP
)/baseaddress.cfg
59 ifeq ($(TARGET_PATH
),)
68 MK_ARCH_ID
:= _M_ALPHA
75 ifeq ($(ARCH
),powerpc
)
79 # unknown architecture
81 MK_ARCH_ID
:= _M_UNKNOWN
85 # VARIABLES IN USE BY VARIOUS TARGETS
87 # MK_BOOTCDDIR = Directory on the ReactOS ISO CD in which to place the file (subdir of reactos/)
88 # MK_CFLAGS = C compiler command-line flags for this target
89 # MK_CPPFLAGS = C++ compiler command-line flags for this target
90 # MK_DDKLIBS = Import libraries from the ReactOS DDK to link with
91 # MK_DEFENTRY = Module entry point:
92 # _WinMain@16 for windows EXE files that are export libraries
93 # _DriverEntry@8 for .SYS files
94 # _DllMain@12 for .DLL files
95 # _DrvEnableDriver@12 for GDI drivers
96 # _WinMainCRTStartup for Win32 EXE files
97 # _NtProcessStartup@4 for Native EXE files
98 # _mainCRTStartup for Console EXE files
99 # MK_DEFEXT = Extension to give compiled modules (.EXE, .DLL, .SYS, .a)
100 # MK_DISTDIR = (unused?)
101 # MK_EXETYPE = Compiler option packages based on type of PE file (exe, dll)
102 # MK_IMPLIB = Whether or not to generate a DLL import stub library (yes, no)
103 # MK_IMPLIB_EXT = Extension to give import libraries (.a always)
104 # MK_IMPLIBDEFPATH = Default place to put the import stub library when built
105 # MK_IMPLIBONLY = Whether the target is only an import library (yes, no; used only by generic hal)
106 # MK_INSTALLDIR = Where "make install" should put the target, relative to reactos/
107 # MK_MODE = Mode the target's code is intended to run in
108 # user - User-mode compiler settings
109 # kernel - Kernel-mode compiler settings
110 # static - Static library compiler settings
111 # MK_RCFLAGS = Flags to add to resource compiler command line
112 # MK_RES_BASE = Base name of resource files
113 # MK_SDKLIBS = Default SDK libriaries to link with
116 ifeq ($(TARGET_TYPE
),program
)
120 MK_DEFENTRY
:= _DEFINE_TARGET_APPTYPE
130 MK_BOOTCDDIR
:= system32
132 MK_RES_BASE
:= $(TARGET_NAME
)
135 ifeq ($(TARGET_TYPE
),proglib
)
139 MK_DEFENTRY
:= _WinMain@
16
146 MK_IMPLIBDEFPATH
:= $(SDK_PATH_LIB
)
149 MK_BOOTCDDIR
:= system32
151 MK_RES_BASE
:= $(TARGET_NAME
)
154 ifeq ($(TARGET_TYPE
),dynlink
)
158 MK_DEFENTRY
:= _DllMain@
12
165 MK_IMPLIBDEFPATH
:= $(SDK_PATH_LIB
)
167 MK_INSTALLDIR
:= system32
168 MK_BOOTCDDIR
:= system32
170 MK_RES_BASE
:= $(TARGET_NAME
)
173 ifeq ($(TARGET_TYPE
),library
)
187 MK_INSTALLDIR
:= # none
188 MK_BOOTCDDIR
:= system32
193 ifeq ($(TARGET_TYPE
),kmlibrary
)
201 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
205 ifeq ($(TARGET_TYPE
),driver_library
)
216 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
218 MK_INSTALLDIR
:= $(DDK_PATH_INC
)
220 MK_DISTDIR
:= # FIXME
224 ifeq ($(TARGET_TYPE
),driver
)
228 MK_DEFENTRY
:= _DriverEntry@
8
229 MK_DDKLIBS
:= ntoskrnl.a hal.a
231 MK_CFLAGS
:= -D__NTDRIVER__
-I.
232 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
237 MK_INSTALLDIR
:= system32
/drivers
239 MK_DISTDIR
:= drivers
240 MK_RES_BASE
:= $(TARGET_NAME
)
243 ifeq ($(TARGET_TYPE
),export_driver
)
247 MK_DEFENTRY
:= _DriverEntry@
8
248 MK_DDKLIBS
:= ntoskrnl.a hal.a
250 MK_CFLAGS
:= -D__NTDRIVER__
-I.
251 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
254 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
256 MK_INSTALLDIR
:= system32
/drivers
258 MK_DISTDIR
:= drivers
259 MK_RES_BASE
:= $(TARGET_NAME
)
262 ifeq ($(TARGET_TYPE
),hal
)
266 MK_DEFENTRY
:= _DriverEntry@
8
267 MK_DDKLIBS
:= ntoskrnl.a
269 MK_CFLAGS
:= -D__NTHAL__
-I.
270 MK_CPPFLAGS
:= -D__NTHAL__
-I.
275 MK_INSTALLDIR
:= system32
278 MK_RES_BASE
:= $(TARGET_NAME
)
281 ifeq ($(TARGET_TYPE
),bootpgm
)
285 MK_DEFENTRY
:= _DriverEntry@
8
288 MK_CFLAGS
:= -D__NTDRIVER__
-I.
289 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
294 MK_INSTALLDIR
:= system32
295 MK_BOOTCDDIR
:= system32
296 MK_DISTDIR
:= # FIXME
297 MK_RES_BASE
:= $(TARGET_NAME
)
300 ifeq ($(TARGET_TYPE
),miniport
)
304 MK_DEFENTRY
:= _DriverEntry@
8
307 MK_CFLAGS
:= -D__NTDRIVER__
-I.
308 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
313 MK_INSTALLDIR
:= system32
/drivers
315 MK_DISTDIR
:= drivers
316 MK_RES_BASE
:= $(TARGET_NAME
)
319 ifeq ($(TARGET_TYPE
),gdi_driver
)
323 MK_DEFENTRY
:= _DrvEnableDriver@
12
324 MK_DDKLIBS
:= ntoskrnl.a hal.a win32k.a
326 MK_CFLAGS
:= -D__NTDRIVER__
-I.
327 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
330 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
332 MK_INSTALLDIR
:= system32
335 MK_RES_BASE
:= $(TARGET_NAME
)
338 ifeq ($(TARGET_TYPE
),kernel
)
342 MK_DEFENTRY
:= _NtProcessStartup
345 MK_CFLAGS
:= -D__NTOSKRNL__
-I.
346 MK_CPPFLAGS
:= -D__NTOSKRNL__
-I.
349 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
351 MK_INSTALLDIR
:= system32
353 MK_RES_BASE
:= $(TARGET_NAME
)
357 # can be overidden with $(CXX) for linkage of c++ executables
360 ifeq ($(RM_AT_FROM_SYMBOLS
),no
)
363 MK_KILLAT
:= --kill-at
366 ifeq ($(TARGET_TYPE
),program
)
367 ifeq ($(TARGET_APPTYPE
),windows
)
368 MK_DEFENTRY
:= _WinMainCRTStartup
369 MK_SDKLIBS
:= ntdll.a kernel32.a gdi32.a user32.a
370 TARGET_LFLAGS
+= -Wl
,--subsystem
,windows
373 ifeq ($(TARGET_APPTYPE
),native
)
374 MK_DEFENTRY
:= _NtProcessStartup@
4
375 MK_SDKLIBS
:= ntdll.a
376 TARGET_LFLAGS
+= -Wl
,--subsystem
,native
-nostartfiles
379 ifeq ($(TARGET_APPTYPE
),console
)
380 MK_DEFENTRY
:= _mainCRTStartup
382 TARGET_LFLAGS
+= -Wl
,--subsystem
,console
386 ifeq ($(TARGET_TYPE
),proglib
)
387 ifeq ($(TARGET_APPTYPE
),windows
)
388 MK_DEFENTRY
:= _WinMainCRTStartup
389 MK_SDKLIBS
:= ntdll.a kernel32.a gdi32.a user32.a
390 TARGET_LFLAGS
+= -Wl
,--subsystem
,windows
393 ifeq ($(TARGET_APPTYPE
),native
)
394 MK_DEFENTRY
:= _NtProcessStartup@
4
395 MK_SDKLIBS
:= ntdll.a
396 TARGET_LFLAGS
+= -Wl
,--subsystem
,native
-nostartfiles
399 ifeq ($(TARGET_APPTYPE
),console
)
400 MK_DEFENTRY
:= _mainCRTStartup
402 TARGET_LFLAGS
+= -Wl
,--subsystem
,console
406 ifeq ($(TARGET_TYPE
),subsystem
)
410 MK_DEFENTRY
:= _DriverEntry@
8
411 MK_DDKLIBS
:= ntoskrnl.a hal.a
413 MK_CFLAGS
:= -D__NTDRIVER__
-I.
414 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
417 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
419 MK_INSTALLDIR
:= system32
420 MK_DISTDIR
:= drivers
421 MK_RES_BASE
:= $(TARGET_NAME
)
424 ifeq ($(TARGET_TYPE
),kmdll
)
429 MK_DDKLIBS
:= ntoskrnl.a hal.a
431 MK_CFLAGS
:= -D__NTDRIVER__
-I.
432 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
435 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
437 MK_INSTALLDIR
:= system32
438 MK_DISTDIR
:= drivers
439 MK_RES_BASE
:= $(TARGET_NAME
)
442 ifeq ($(TARGET_TYPE
),winedll
)
443 -include Makefile.ros
444 MK_GENERATED_MAKEFILE
= Makefile.ros
448 MK_DEFENTRY
:= _DllMain@
12
451 MK_CFLAGS
:= -D__USE_W32API
-D_WIN32_IE
=0x600 -D_WIN32_WINNT
=0x501 -DWINVER
=0x501 -D_STDDEF_H
-DCOBJMACROS
-I
$(PATH_TO_TOP
)/include/wine
452 MK_CPPFLAGS
:= -D__USE_W32API
-D_WIN32_IE
=0x600 -D_WIN32_WINNT
=0x501 -DWINVER
=0x501 -D__need_offsetof
-DCOBJMACROS
-I
$(PATH_TO_TOP
)/include -I
$(PATH_TO_TOP
)/include/wine
453 MK_RCFLAGS
:= --define __USE_W32API
--include-dir
$(PATH_TO_TOP
)/include/wine
456 MK_IMPLIBDEFPATH
:= $(SDK_PATH_LIB
)
458 MK_INSTALLDIR
:= system32
459 MK_BOOTCDDIR
:= system32
461 MK_RES_BASE
:= $(TARGET_NAME
)
462 ifeq ($(TARGET_DEFNAME
),)
463 MK_DEFBASENAME
:= $(TARGET_NAME
).spec
464 MK_SPECDEF
:= $(MK_DEFBASENAME
).def
466 MK_DEFBASENAME
:= $(TARGET_DEFNAME
)
468 MK_RC_BINARIES
= $(TARGET_RC_BINARIES
)
471 ifeq ($(TARGET_TYPE
),winedrv
)
472 -include Makefile.ros
473 MK_GENERATED_MAKEFILE
= Makefile.ros
477 # does this need changing?:
478 MK_DEFENTRY
:= _DllMain@
12
481 MK_CFLAGS
:= -D__USE_W32API
-D_WIN32_IE
=0x600 -D_WIN32_WINNT
=0x501 -DWINVER
=0x501 -D__need_offsetof
-DCOBJMACROS
-I
$(PATH_TO_TOP
)/include/wine
482 MK_CPPFLAGS
:= -D__USE_W32API
-D_WIN32_IE
=0x600 -D_WIN32_WINNT
=0x501 -DWINVER
=0x501 -D__need_offsetof
-DCOBJMACROS
-I
$(PATH_TO_TOP
)/include -I
$(PATH_TO_TOP
)/include/wine
483 MK_RCFLAGS
:= --define __USE_W32API
--include-dir
$(PATH_TO_TOP
)/include/wine
486 MK_IMPLIBDEFPATH
:= $(SDK_PATH_LIB
)
488 MK_INSTALLDIR
:= system32
489 MK_BOOTCDDIR
:= system32
491 MK_RES_BASE
:= $(TARGET_NAME
)
492 ifeq ($(TARGET_DEFNAME
),)
493 MK_DEFBASENAME
:= $(TARGET_NAME
).spec
494 MK_SPECDEF
:= $(MK_DEFBASENAME
).def
496 MK_DEFBASENAME
:= $(TARGET_DEFNAME
)
498 MK_RC_BINARIES
= $(TARGET_RC_BINARIES
)
501 ifeq ($(TARGET_RC_SRCS
),)
502 MK_RES_SRC
:= $(TARGET_PATH
)/$(MK_RES_BASE
).rc
503 MK_RESOURCE
:= $(TARGET_PATH
)/$(MK_RES_BASE
).coff
505 MK_RES_SRC
:= $(TARGET_RC_SRCS
)
506 MK_RESOURCE
:= $(TARGET_RC_SRCS
:.rc
=.coff
)
509 ifneq ($(TARGET_INSTALLDIR
),)
510 MK_INSTALLDIR
:= $(TARGET_INSTALLDIR
)
514 ifneq ($(BOOTCD_INSTALL
),)
519 ifeq ($(TARGET_LIBPATH
),)
520 MK_LIBPATH
:= $(SDK_PATH_LIB
)
522 MK_LIBPATH
:= $(TARGET_LIBPATH
)
525 ifeq ($(TARGET_IMPLIBPATH
),)
526 MK_IMPLIBPATH
:= $(MK_IMPLIBDEFPATH
)
528 MK_IMPLIBPATH
:= $(TARGET_IMPLIBPATH
)
532 ifeq ($(TARGET_BASENAME
),)
533 MK_BASENAME
:= $(TARGET_NAME
)
535 MK_BASENAME
:= $(TARGET_BASENAME
)
539 ifeq ($(TARGET_EXTENSION
),)
540 MK_EXT
:= $(MK_DEFEXT
)
542 MK_EXT
:= $(TARGET_EXTENSION
)
546 ifeq ($(TARGET_NORC
),yes
)
549 MK_FULLRES
:= $(MK_RESOURCE
)
552 ifneq ($(TARGET_TYPE
),winedll
)
553 ifeq ($(TARGET_DEFNAME
),)
554 MK_DEFBASENAME
:= $(TARGET_NAME
)
556 MK_DEFBASENAME
:= $(TARGET_DEFNAME
)
560 MK_DEFNAME
:= $(TARGET_PATH
)/$(MK_DEFBASENAME
).def
562 ifeq ($(MK_MODE
),user
)
563 ifeq ($(MK_EXETYPE
),dll
)
564 MK_DEFBASE
:= 0x10000000
566 MK_DEFBASE
:= 0x400000
568 ifneq ($(TARGET_SDKLIBS
),)
569 MK_LIBS
:= $(addprefix $(SDK_PATH_LIB
)/, $(TARGET_SDKLIBS
))
571 MK_LIBS
:= $(addprefix $(SDK_PATH_LIB
)/, $(MK_SDKLIBS
))
576 ifeq ($(MK_MODE
),kernel
)
577 MK_DEFBASE
:= 0x10000
578 MK_LIBS
:= $(addprefix $(DDK_PATH_LIB
)/, $(TARGET_DDKLIBS
) $(MK_DDKLIBS
))
579 MK_CFLAGS
+= -D_SEH_NO_NATIVE_NLG
580 MK_CPPFLAGS
+= -D_SEH_NO_NATIVE_NLG
581 MK_LFLAGS
+= -nostartfiles
582 ifneq ($(TARGET_TYPE
),kernel
)
583 MK_LFLAGS
+= -nostdlib
588 ifneq ($(TARGET_LIBS
),)
589 MK_LIBS
:= $(TARGET_LIBS
) $(MK_LIBS
)
593 ifeq ($(TARGET_BASE
),)
594 TARGET_BASE
:= $(MK_DEFBASE
)
598 ifeq ($(TARGET_ENTRY
),)
599 TARGET_ENTRY
:= $(MK_DEFENTRY
)
603 # Include details of the OS configuration
605 include $(PATH_TO_TOP
)/config
608 TARGET_CFLAGS
+= $(MK_CFLAGS
) $(STD_CFLAGS
)
615 TARGET_CPPFLAGS
+= $(MK_CPPFLAGS
) $(STD_CPPFLAGS
)
617 TARGET_RCFLAGS
+= $(MK_RCFLAGS
) $(STD_RCFLAGS
)
619 TARGET_ASFLAGS
+= $(MK_ASFLAGS
) $(STD_ASFLAGS
)
621 TARGET_NFLAGS
+= $(MK_NFLAGS
) $(STD_NFLAGS
)
623 TARGET_LFLAGS
+= $(MK_LFLAGS
) $(STD_LFLAGS
)
626 MK_GCCLIBS
:= $(addprefix -l
, $(TARGET_GCCLIBS
))
628 ifeq ($(MK_MODE
),static
)
629 MK_FULLNAME
:= $(MK_LIBPATH
)/$(MK_BASENAME
)$(MK_EXT
)
631 MK_FULLNAME
:= $(MK_BASENAME
)$(MK_EXT
)
634 ifeq ($(TARGET_TYPE
), kmlibrary
)
635 MK_FULLNAME
:= $(DDK_PATH_LIB
)/$(MK_BASENAME
)$(MK_EXT
)
638 MK_IMPLIB_FULLNAME
:= $(MK_BASENAME
)$(MK_IMPLIB_EXT
)
640 MK_NOSTRIPNAME
:= $(MK_BASENAME
).nostrip
$(MK_EXT
)
642 MK_EXTRADEP
:= $(filter %.h
,$(TARGET_OBJECTS
))
644 # We don't want to link header files
645 MK_OBJECTS
:= $(filter-out %.h
,$(TARGET_OBJECTS
))
647 # There is problems with C++ applications and ld -r. Ld can cause errors like:
648 # reloc refers to symbol `.text$_ZN9CCABCodecC2Ev' which is not being output
649 ifeq ($(TARGET_CPPAPP
),yes
)
650 MK_STRIPPED_OBJECT
:= $(MK_OBJECTS
)
652 MK_STRIPPED_OBJECT
:= $(MK_BASENAME
).stripped.o
655 ifeq ($(TARGET_REGTESTS
),yes
)
656 ifeq ($(TARGET_BUILDENV_TEST
),yes
)
657 REGTEST_TARGETS
:= tests
/_hooks.c tests
/_regtests.c tests
/_stubs.S tests
/Makefile.tests tests
/_rtstub.c
658 MK_REGTESTS_CLEAN
:= clean_regtests
660 REGTEST_TARGETS
:= tests
/_regtests.c tests
/Makefile.tests tests
/_rtstub.c
661 ifeq ($(MK_MODE
),user
)
662 MK_LIBS
:= $(SDK_PATH_LIB
)/rtshared.a
$(MK_LIBS
)
664 MK_REGTESTS_CLEAN
:= clean_regtests
665 MK_OBJECTS
+= tests
/_rtstub.o tests
/regtests.a
666 TARGET_CFLAGS
+= -I
$(REGTESTS_PATH_INC
)
673 ifeq ($(MK_IMPLIBONLY
),yes
)
675 TARGET_CLEAN
+= $(MK_IMPLIBPATH
)/$(MK_IMPLIB_FULLNAME
)
677 all: $(REGTEST_TARGETS
) $(MK_IMPLIBPATH
)/$(MK_IMPLIB_FULLNAME
)
679 $(MK_IMPLIBPATH
)/$(MK_IMPLIB_FULLNAME
): $(MK_OBJECTS
) $(MK_DEFNAME
)
681 --dllname
$(MK_FULLNAME
) \
682 --def
$(MK_DEFNAME
) \
683 --output-lib
$(MK_IMPLIBPATH
)/$(MK_BASENAME
).a \
688 all: $(REGTEST_TARGETS
) $(MK_FULLNAME
) $(MK_NOSTRIPNAME
) $(SUBDIRS
:%=%_all
)
691 ifeq ($(MK_IMPLIB
),yes
)
692 MK_EXTRACMD
:= --def
$(MK_DEFNAME
)
699 ifeq ($(MK_MODE
),user
)
701 ifeq ($(MK_EXETYPE
),dll
)
702 TARGET_LFLAGS
+= -mdll
-Wl
,--image-base
,$(TARGET_BASE
)
703 MK_EXTRADEP
+= $(MK_DEFNAME
)
704 MK_EXTRACMD2
:= -Wl
,temp.exp
709 $(MK_BASENAME
).a
: $(MK_OBJECTS
)
710 $(AR
) -r
$(MK_BASENAME
).a
$(MK_OBJECTS
)
712 $(MK_NOSTRIPNAME
): $(MK_EXTRADEP
) $(MK_FULLRES
) $(MK_BASENAME
).a
$(MK_LIBS
)
713 ifeq ($(MK_EXETYPE
),dll
)
714 $(LD_CC
) -Wl
,--base-file
,base.tmp \
715 -Wl
,--entry
,$(TARGET_ENTRY
) \
718 $(MK_FULLRES
) $(MK_OBJECTS
) $(MK_LIBS
) $(MK_GCCLIBS
)
720 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
721 --base-file base.tmp \
722 --output-exp temp.exp
$(MK_EXTRACMD
)
724 $(LD_CC
) -Wl
,--base-file
,base.tmp \
725 -Wl
,--entry
,$(TARGET_ENTRY
) \
729 $(MK_FULLRES
) $(MK_OBJECTS
) $(MK_LIBS
) $(MK_GCCLIBS
)
731 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
732 --base-file base.tmp \
733 --output-exp temp.exp
$(MK_KILLAT
) $(MK_EXTRACMD
)
736 $(LD_CC
) $(TARGET_LFLAGS
) \
737 -Wl
,--entry
,$(TARGET_ENTRY
) $(MK_EXTRACMD2
) \
738 -o
$(MK_NOSTRIPNAME
) \
739 $(MK_FULLRES
) $(MK_OBJECTS
) $(MK_LIBS
) $(MK_GCCLIBS
)
741 - $(RSYM
) $(MK_NOSTRIPNAME
) $(MK_BASENAME
).sym
742 ifeq ($(FULL_MAP
),yes
)
743 $(OBJDUMP
) -d
-S
$(MK_NOSTRIPNAME
) > $(MK_BASENAME
).map
745 $(NM
) --numeric-sort
$(MK_NOSTRIPNAME
) > $(MK_BASENAME
).map
748 $(MK_FULLNAME
): $(MK_NOSTRIPNAME
) $(MK_EXTRADEP
)
750 ifneq ($(TARGET_CPPAPP
),yes
)
751 $(LD
) --strip-debug
-r
-o
$(MK_STRIPPED_OBJECT
) $(MK_OBJECTS
)
753 ifeq ($(MK_EXETYPE
),dll
)
754 $(LD_CC
) -Wl
,--base-file
,base.tmp \
755 -Wl
,--entry
,$(TARGET_ENTRY
) \
759 $(MK_FULLRES
) $(MK_STRIPPED_OBJECT
) $(MK_LIBS
) $(MK_GCCLIBS
)
761 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
762 --base-file base.tmp \
763 --output-exp temp.exp
$(MK_EXTRACMD
)
765 $(LD_CC
) -Wl
,--base-file
,base.tmp \
766 -Wl
,--entry
,$(TARGET_ENTRY
) \
771 $(MK_FULLRES
) $(MK_STRIPPED_OBJECT
) $(MK_LIBS
) $(MK_GCCLIBS
)
773 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
774 --base-file base.tmp \
775 --output-exp temp.exp
$(MK_KILLAT
) $(MK_EXTRACMD
)
778 $(LD_CC
) $(TARGET_LFLAGS
) \
779 -Wl
,--entry
,$(TARGET_ENTRY
) \
783 $(MK_FULLRES
) $(MK_STRIPPED_OBJECT
) $(MK_LIBS
) $(MK_GCCLIBS
)
784 ifneq ($(TARGET_CPPAPP
),yes
)
785 - $(RM
) temp.exp
$(MK_STRIPPED_OBJECT
)
789 @echo
$(MK_FULLNAME
) was successfully built.
793 # Kernel mode targets
794 ifeq ($(MK_MODE
),kernel
)
796 ifeq ($(MK_IMPLIB
),yes
)
797 MK_EXTRACMD
:= --def
$(MK_DEFNAME
)
802 $(MK_BASENAME
).a
: $(MK_OBJECTS
)
803 $(AR
) -r
$(MK_BASENAME
).a
$(MK_OBJECTS
)
805 $(MK_NOSTRIPNAME
): $(MK_EXTRADEP
) $(MK_FULLRES
) $(MK_BASENAME
).a
$(MK_LIBS
)
806 $(LD_CC
) -Wl
,--base-file
,base.tmp \
807 -Wl
,--entry
,$(TARGET_ENTRY
) \
810 $(MK_FULLRES
) $(MK_OBJECTS
) $(MK_LIBS
) $(MK_GCCLIBS
)
812 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
813 --base-file base.tmp \
814 --output-exp temp.exp
$(MK_EXTRACMD
) $(MK_KILLAT
)
816 $(LD_CC
) $(TARGET_LFLAGS
) \
817 -Wl
,--subsystem
,native \
818 -Wl
,--image-base
,$(TARGET_BASE
) \
819 -Wl
,--file-alignment
,0x1000 \
820 -Wl
,--section-alignment
,0x1000 \
821 -Wl
,--entry
,$(TARGET_ENTRY
) \
823 -o
$(MK_NOSTRIPNAME
) \
824 $(MK_FULLRES
) $(MK_OBJECTS
) $(MK_LIBS
) $(MK_GCCLIBS
)
826 $(RSYM
) $(MK_NOSTRIPNAME
) $(MK_BASENAME
).sym
827 ifeq ($(FULL_MAP
),yes
)
828 $(OBJDUMP
) -d
-S
$(MK_NOSTRIPNAME
) > $(MK_BASENAME
).map
830 $(NM
) --numeric-sort
$(MK_NOSTRIPNAME
) > $(MK_BASENAME
).map
833 $(MK_FULLNAME
): $(MK_EXTRADEP
) $(MK_FULLRES
) $(MK_BASENAME
).a
$(MK_LIBS
) $(MK_NOSTRIPNAME
)
835 ifneq ($(TARGET_CPPAPP
),yes
)
836 $(LD
) --strip-debug
-r
-o
$(MK_STRIPPED_OBJECT
) $(MK_OBJECTS
)
838 $(LD_CC
) -Wl
,--base-file
,base.tmp \
839 -Wl
,--entry
,$(TARGET_ENTRY
) \
842 $(MK_FULLRES
) $(MK_STRIPPED_OBJECT
) $(MK_LIBS
) $(MK_GCCLIBS
)
844 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
845 --base-file base.tmp \
846 --output-exp temp.exp
$(MK_EXTRACMD
) $(MK_KILLAT
)
848 $(LD_CC
) $(TARGET_LFLAGS
) \
849 -Wl
,--subsystem
,native \
850 -Wl
,--image-base
,$(TARGET_BASE
) \
851 -Wl
,--file-alignment
,0x1000 \
852 -Wl
,--section-alignment
,0x1000 \
853 -Wl
,--entry
,$(TARGET_ENTRY
) \
856 $(MK_FULLRES
) $(MK_STRIPPED_OBJECT
) $(MK_LIBS
) $(MK_GCCLIBS
)
857 ifneq ($(TARGET_CPPAPP
),yes
)
858 - $(RM
) temp.exp
$(MK_STRIPPED_OBJECT
)
862 @echo
$(MK_FULLNAME
) was successfully built.
866 # Static library target
867 ifeq ($(MK_MODE
),static
)
869 $(MK_FULLNAME
): $(TARGET_OBJECTS
)
870 $(AR
) -r
$(MK_FULLNAME
) $(TARGET_OBJECTS
)
871 @echo
$(MK_BASENAME
)$(MK_EXT
) was successfully built.
873 # Static libraries dont have a nostrip version
877 .PHONY
: $(MK_NOSTRIPNAME
)
881 endif # MK_IMPLIBONLY
884 $(MK_FULLRES
): $(PATH_TO_TOP
)/include/reactos
/buildno.h
$(MK_RES_SRC
)
886 ifeq ($(MK_DEPENDS
),yes
)
892 ifeq ($(MK_IMPLIB
),yes
)
893 $(MK_IMPLIBPATH
)/$(MK_BASENAME
).a
: $(MK_DEFNAME
)
894 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
895 --def
$(MK_DEFNAME
) \
896 --output-lib
$(MK_IMPLIBPATH
)/$(MK_BASENAME
).a \
899 implib
: $(MK_IMPLIBPATH
)/$(MK_BASENAME
).a
901 implib
: $(SUBDIRS
:%=%_implib
)
904 # Precompiled header support
905 # When using PCHs, use dependency tracking to keep the .gch files up-to-date.
908 ifeq ($(ROS_USE_PCH
),yes
)
909 ifneq ($(TARGET_PCH
),)
910 MK_PCHNAME
= $(TARGET_PCH
).gch
912 ifeq ($(TARGET_CPPAPP
),yes
)
924 # Be carefull not to clean non-object files
925 MK_CLEANFILES
:= $(filter %.o
,$(MK_OBJECTS
))
926 MK_CLEANFILTERED
:= $(MK_OBJECTS
:.o
=.d
) $(TARGET_PCH
:.h
=.d
)
927 MK_CLEANDEPS
:= $(join $(dir $(MK_CLEANFILTERED
)), $(addprefix .
, $(notdir $(MK_CLEANFILTERED
))))
929 clean: $(MK_REGTESTS_CLEAN
) $(SUBDIRS
:%=%_clean
)
930 - $(RM
) *.o
$(MK_PCHNAME
) $(MK_BASENAME
).sym
$(MK_BASENAME
).a
$(MK_RESOURCE
) \
931 $(MK_FULLNAME
) $(MK_NOSTRIPNAME
) $(MK_CLEANFILES
) $(MK_CLEANDEPS
) $(MK_BASENAME
).map \
932 junk.tmp base.tmp temp.exp
$(MK_RC_BINARIES
) $(MK_SPECDEF
) $(MK_GENERATED_MAKEFILE
) \
935 ifneq ($(TARGET_HEADERS
),)
936 $(TARGET_OBJECTS
): $(TARGET_HEADERS
)
939 # install and bootcd rules
941 ifeq ($(MK_IMPLIBONLY
),yes
)
943 # Don't install import libraries
952 # Don't install static libraries
953 ifeq ($(MK_MODE
),static
)
961 ifeq ($(INSTALL_SYMBOLS
),yes
)
963 install: $(SUBDIRS
:%=%_install
) $(MK_FULLNAME
) $(MK_BASENAME
).sym
964 -$(CP
) $(MK_FULLNAME
) $(INSTALL_DIR
)/$(MK_INSTALLDIR
)/$(MK_FULLNAME
)
965 -$(CP
) $(MK_BASENAME
).sym
$(INSTALL_DIR
)/symbols
/$(MK_BASENAME
).sym
966 @echo
$(MK_FULLNAME
) was successfully installed.
968 else # INSTALL_SYMBOLS
970 install: $(SUBDIRS
:%=%_install
) $(MK_FULLNAME
)
971 -$(CP
) $(MK_FULLNAME
) $(INSTALL_DIR
)/$(MK_INSTALLDIR
)/$(MK_FULLNAME
)
973 endif # INSTALL_SYMBOLS
976 # Bootstrap files for the bootable CD
977 ifeq ($(TARGET_BOOTSTRAP
),yes
)
979 ifneq ($(TARGET_BOOTSTRAP_NAME
),)
980 MK_BOOTSTRAP_NAME
:= $(TARGET_BOOTSTRAP_NAME
)
981 else # TARGET_BOOTSTRAP_NAME
982 MK_BOOTSTRAP_NAME
:= $(MK_FULLNAME
)
983 endif # TARGET_BOOTSTRAP_NAME
985 bootcd
: $(SUBDIRS
:%=%_bootcd
)
986 - $(CP
) $(MK_FULLNAME
) $(BOOTCD_DIR
)/reactos
/$(MK_BOOTCDDIR
)/$(MK_BOOTSTRAP_NAME
)
988 else # TARGET_BOOTSTRAP
992 endif # TARGET_BOOTSTRAP
996 endif # MK_IMPLIBONLY
998 ifeq ($(TARGET_TYPE
),winedll
)
999 Makefile.ros
: Makefile.in Makefile.ros-template
1000 $(WINE2ROS
) Makefile.in Makefile.ros-template Makefile.ros
1002 $(MK_RC_BINARIES
): $(TARGET_RC_BINSRC
)
1003 $(BIN2RES
) -f
-o
$@
$(TARGET_RC_BINSRC
)
1005 $(MK_RESOURCE
): $(MK_RC_BINARIES
)
1008 REGTEST_TESTS
= $(wildcard tests
/tests
/*.c
)
1010 $(REGTEST_TARGETS
): $(REGTEST_TESTS
)
1011 ifeq ($(TARGET_BUILDENV_TEST
),yes
)
1012 $(REGTESTS
) .
/tests
/tests .
/tests
/_regtests.c .
/tests
/Makefile.tests
-e .
/tests
/_rtstub.c
1013 $(REGTESTS
) -s .
/tests
/stubs.tst .
/tests
/_stubs.S .
/tests
/_hooks.c
1015 ifeq ($(MK_MODE
),user
)
1016 $(REGTESTS
) .
/tests
/tests .
/tests
/_regtests.c .
/tests
/Makefile.tests
-u .
/tests
/_rtstub.c
1017 $(MAKE
) -C tests TARGET_REGTESTS
=no
all
1019 ifeq ($(MK_MODE
),kernel
)
1020 $(REGTESTS
) .
/tests
/tests .
/tests
/_regtests.c .
/tests
/Makefile.tests
-k .
/tests
/_rtstub.c
1021 $(MAKE
) -C tests TARGET_REGTESTS
=no
all
1027 ifeq ($(TARGET_BUILDENV_TEST
),yes
)
1028 - $(MAKE
) -C tests TARGET_REGTESTS
=no
clean
1029 - $(RM
) .
/tests
/_rtstub.c .
/tests
/_hooks.c .
/tests
/_regtests.c .
/tests
/_stubs.S .
/tests
/Makefile.tests
1031 $(MAKE
) -C tests TARGET_REGTESTS
=no
clean
1032 $(RM
) .
/tests
/_rtstub.c .
/tests
/_regtests.c .
/tests
/_hooks.c .
/tests
/_stubs.S .
/tests
/Makefile.tests
1035 .PHONY
: all depends implib
clean install dist bootcd depends gen_regtests clean_regtests
1038 $(SUBDIRS
:%=%_all
): %_all
:
1039 $(MAKE
) -C
$* SUBDIRS
= all
1041 $(SUBDIRS
:%=%_implib
): %_implib
:
1042 $(MAKE
) -C
$* SUBDIRS
= implib
1044 $(SUBDIRS
:%=%_test
): %_test
:
1045 $(MAKE
) -C
$* SUBDIRS
= test
1047 $(SUBDIRS
:%=%_clean
): %_clean
:
1048 $(MAKE
) -C
$* SUBDIRS
= clean
1050 $(SUBDIRS
:%=%_install
): %_install
:
1051 $(MAKE
) -C
$* SUBDIRS
= install
1053 $(SUBDIRS
:%=%_dist
): %_dist
:
1054 $(MAKE
) -C
$* SUBDIRS
= dist
1056 $(SUBDIRS
:%=%_bootcd
): %_bootcd
:
1057 $(MAKE
) -C
$* SUBDIRS
= bootcd
1059 .PHONY
: $(SUBDIRS
:%=%_all
) $(SUBDIRS
:%=%_implib
) $(SUBDIRS
:%=%_test
) \
1060 $(SUBDIRS
:%=%_clean
) $(SUBDIRS
:%=%_install
) $(SUBDIRS
:%=%_dist
) \
1061 $(SUBDIRS
:%=%_bootcd
)
1064 ifeq ($(TARGET_REGTESTS
),yes
)
1065 ifeq ($(TARGET_BUILDENV_TEST
),yes
)
1067 $(MAKE
) -C tests run
1078 %.o
: %.c
$(MK_PCHNAME
)
1079 $(CC
) $(TARGET_CFLAGS
) -c
$< -o
$@
1080 %.o
: %.
cc $(MK_PCHNAME
)
1081 $(CXX
) $(TARGET_CPPFLAGS
) -c
$< -o
$@
1082 %.o
: %.
cxx $(MK_PCHNAME
)
1083 $(CXX
) $(TARGET_CPPFLAGS
) -c
$< -o
$@
1084 %.o
: %.
cpp $(MK_PCHNANE
)
1085 $(CXX
) $(TARGET_CPPFLAGS
) -c
$< -o
$@
1087 $(AS
) $(TARGET_ASFLAGS
) -c
$< -o
$@
1089 $(AS
) $(TARGET_ASFLAGS
) -c
$< -o
$@
1091 $(NASM_CMD
) $(TARGET_NFLAGS
) $< -o
$@
1093 $(RC
) $(TARGET_RCFLAGS
) $< -o
$@
1095 $(WINEBUILD
) $(DEFS
) -o
$@
--def
$<
1096 %.drv.spec.def
: %.spec
1097 $(WINEBUILD
) $(DEFS
) -o
$@
--def
$<
1099 $(CC
) $(TARGET_CFLAGS
) -E
$< > $@
1101 $(PCH_CC
) $(CFLAGS
) $<
1102 # rule for msvc conversion
1104 $(subst /,$(SEP
),$(MS2PS
)) -try try
-except except
-finally finally
< $< > $@
1106 # Kill implicit rule
1110 CFLAGS
:= $(TARGET_CFLAGS
)
1111 NFLAGS
:= $(TARGET_NFLAGS
)