1 # $Id: helper.mk,v 1.4 2001/08/23 16:14:47 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 = 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)
42 ifeq ($(TARGET_PATH
),)
47 # FIXME: MK_DEFENTRY may not be correct
48 ifeq ($(TARGET_TYPE
),program
)
52 MK_DEFENTRY
:= _DEFINE_TARGET_APPTYPE
55 MK_CFLAGS
:= -I.
/ -I
$(SDK_PATH_INC
)
56 MK_CPPFLAGS
:= -I.
/ -I
$(SDK_PATH_INC
)
62 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
65 ifeq ($(TARGET_TYPE
),proglib
)
69 MK_DEFENTRY
:= _WinMain@
16
72 MK_CFLAGS
:= -I.
/ -I
$(SDK_PATH_INC
)
73 MK_CPPFLAGS
:= -I.
/ -I
$(SDK_PATH_INC
)
76 MK_IMPLIBDEFPATH
:= $(SDK_PATH_LIB
)
79 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
82 ifeq ($(TARGET_TYPE
),dynlink
)
86 MK_DEFENTRY
:= _DllMain@
12
89 MK_CFLAGS
:= -I.
/ -I
$(SDK_PATH_INC
)
90 MK_CPPFLAGS
:= -I.
/ -I
$(SDK_PATH_INC
)
93 MK_IMPLIBDEFPATH
:= $(SDK_PATH_LIB
)
94 MK_INSTALLDIR
:= system32
96 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
99 ifeq ($(TARGET_TYPE
),library
)
106 MK_CFLAGS
:= -I.
/ -I
$(SDK_PATH_INC
)
107 MK_CPPFLAGS
:= -I.
/ -I
$(SDK_PATH_INC
)
110 MK_IMPLIBDEFPATH
:= $(SDK_PATH_LIB
)
111 MK_INSTALLDIR
:= $(SDK_PATH_INC
)
112 MK_DISTDIR
:= # FIXME
116 ifeq ($(TARGET_TYPE
),driver_library
)
123 MK_CFLAGS
:= -I.
/ -I
$(DDK_PATH_INC
)
124 MK_CPPFLAGS
:= -I.
/ -I
$(DDK_PATH_INC
)
127 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
128 MK_INSTALLDIR
:= $(DDK_PATH_INC
)
129 MK_DISTDIR
:= # FIXME
133 ifeq ($(TARGET_TYPE
),driver
)
137 MK_DEFENTRY
:= _DriverEntry@
8
138 MK_DDKLIBS
:= ntoskrnl.a hal.a
140 MK_CFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
141 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
145 MK_INSTALLDIR
:= system32
/drivers
146 MK_DISTDIR
:= drivers
147 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
150 ifeq ($(TARGET_TYPE
),export_driver
)
154 MK_DEFENTRY
:= _DriverEntry@
8
155 MK_DDKLIBS
:= ntoskrnl.a hal.a
157 MK_CFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
158 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
161 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
162 MK_INSTALLDIR
:= system32
/drivers
163 MK_DISTDIR
:= drivers
164 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
167 ifeq ($(TARGET_TYPE
),hal
)
171 MK_DEFENTRY
:= _DriverEntry@
8
172 MK_DDKLIBS
:= ntoskrnl.a
174 MK_CFLAGS
:= -D__NTHAL__
-I.
/ -I
$(DDK_PATH_INC
)
175 MK_CPPFLAGS
:= -D__NTHAL__
-I.
/ -I
$(DDK_PATH_INC
)
179 MK_INSTALLDIR
:= system32
181 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
184 ifeq ($(TARGET_TYPE
),bootpgm
)
188 MK_DEFENTRY
:= _DriverEntry@
8
191 MK_CFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
192 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
196 MK_INSTALLDIR
:= system32
197 MK_DISTDIR
:= # FIXME
198 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
201 ifeq ($(TARGET_TYPE
),miniport
)
205 MK_DEFENTRY
:= _DriverEntry@
8
208 MK_CFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
209 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
213 MK_INSTALLDIR
:= system32
/drivers
214 MK_DISTDIR
:= drivers
215 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
218 ifeq ($(TARGET_TYPE
),gdi_driver
)
222 MK_DEFENTRY
:= _DrvEnableDriver@
12
223 # MK_DEFENTRY := _DriverEntry@8
224 MK_DDKLIBS
:= ntoskrnl.a hal.a win32k.a
226 MK_CFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
227 MK_CPPFLAGS
:= -D__NTDRIVER__
-I.
/ -I
$(DDK_PATH_INC
)
230 MK_IMPLIBDEFPATH
:= $(DDK_PATH_LIB
)
231 MK_INSTALLDIR
:= system32
/drivers
232 MK_DISTDIR
:= drivers
233 MK_RESOURCE
:= $(TARGET_PATH
)/$(TARGET_NAME
).coff
237 ifeq ($(TARGET_TYPE
),program
)
238 ifeq ($(TARGET_APPTYPE
),windows
)
239 MK_DEFENTRY
:= _WinMainCRTStartup
241 TARGET_LFLAGS
+= -Wl
,--subsystem
,windows
244 ifeq ($(TARGET_APPTYPE
),native
)
245 MK_DEFENTRY
:= _NtProcessStartup
246 MK_SDKLIBS
:= ntdll.a
247 TARGET_LFLAGS
+= -Wl
,--subsystem
,native
-nostartfiles
250 ifeq ($(TARGET_APPTYPE
),console
)
251 MK_DEFENTRY
:= _mainCRTStartup
253 TARGET_LFLAGS
+= -Wl
,--subsystem
,console
258 ifneq ($(TARGET_INSTALLDIR
),)
259 MK_INSTALLDIR
:= $(TARGET_INSTALLDIR
)
263 ifeq ($(TARGET_LIBPATH
),)
264 MK_IMPLIBPATH
:= $(MK_IMPLIBDEFPATH
)
266 MK_IMPLIBPATH
:= $(TARGET_LIBPATH
)
270 ifeq ($(TARGET_BASENAME
),)
271 MK_BASENAME
:= $(TARGET_NAME
)
273 MK_BASENAME
:= $(TARGET_BASENAME
)
277 ifeq ($(TARGET_EXTENSION
),)
278 MK_EXT
:= $(MK_DEFEXT
)
280 MK_EXT
:= $(TARGET_EXTENSION
)
284 ifeq ($(TARGET_NORC
),yes
)
289 ifeq ($(TARGET_DEFNAME
),)
290 MK_DEFBASE
:= $(TARGET_NAME
)
292 MK_DEFBASE
:= $(TARGET_DEFNAME
)
295 MK_DEFNAME
:= $(TARGET_PATH
)/$(MK_DEFBASE
).def
296 ifeq ($(TARGET_DEFONLY
),yes
)
297 MK_EDFNAME
:= $(MK_DEFNAME
)
299 MK_EDFNAME
:= $(TARGET_PATH
)/$(MK_DEFBASE
).edf
303 ifeq ($(MK_MODE
),user
)
304 MK_DEFBASE
:= 0x400000
305 MK_LIBS
:= $(addprefix $(SDK_PATH_LIB
)/, $(MK_SDKLIBS
) $(TARGET_SDKLIBS
))
308 ifeq ($(MK_MODE
),kernel
)
309 MK_DEFBASE
:= 0x10000
310 MK_LIBS
:= $(addprefix $(DDK_PATH_LIB
)/, $(MK_DDKLIBS
) $(TARGET_DDKLIBS
))
314 ifeq ($(TARGET_BASE
),)
315 TARGET_BASE
:= $(MK_DEFBASE
)
319 ifeq ($(TARGET_ENTRY
),)
320 TARGET_ENTRY
:= $(MK_DEFENTRY
)
325 # Include details of the OS configuration
327 include $(PATH_TO_TOP
)/config
330 TARGET_CFLAGS
+= $(MK_CFLAGS
)
331 TARGET_CFLAGS
+= -pipe
-march
=$(ARCH
)
333 TARGET_CPPFLAGS
+= $(MK_CPPFLAGS
)
334 TARGET_CPPFLAGS
+= -pipe
-march
=$(ARCH
)
336 TARGET_ASFLAGS
+= $(MK_ASFLAGS
)
337 TARGET_ASFLAGS
+= -pipe
-march
=$(ARCH
)
339 TARGET_NFLAGS
+= $(MK_NFLAGS
)
342 MK_GCCLIBS
:= $(addprefix -l
, $(TARGET_GCCLIBS
))
344 MK_FULLNAME
:= $(MK_BASENAME
)$(MK_EXT
)
346 MK_NOSTRIPNAME
:= $(MK_BASENAME
).nostrip
$(MK_EXT
)
348 # We don't want to link header files
349 MK_OBJECTS
:= $(filter-out %.h
,$(TARGET_OBJECTS
))
351 ifeq ($(MK_IMPLIBONLY
),yes
)
353 TARGET_CLEAN
+= $(MK_IMPLIBPATH
)/$(MK_FULLNAME
)
355 all: $(MK_IMPLIBPATH
)/$(MK_FULLNAME
)
357 $(MK_IMPLIBPATH
)/$(MK_FULLNAME
): $(TARGET_OBJECTS
)
359 --dllname
$(MK_FULLNAME
) \
360 --def
$(MK_DEFNAME
) \
361 --output-lib
$(MK_IMPLIBPATH
)/$(MK_BASENAME
).a \
370 ifeq ($(MK_IMPLIB
),yes
)
371 MK_EXTRACMD
:= --def
$(MK_EDFNAME
)
377 ifeq ($(MK_MODE
),user
)
379 ifeq ($(MK_EXETYPE
),dll
)
380 TARGET_LFLAGS
+= -mdll
-Wl
,--image-base
,$(TARGET_BASE
)
381 MK_EXTRACMD2
:= -Wl
,temp.exp
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 \
393 ifeq ($(MK_EXETYPE
),dll
)
394 $(CC
) -Wl
,--base-file
,base.tmp \
395 -Wl
,--entry
,$(TARGET_ENTRY
) \
397 -o junk.tmp
$(MK_GCCLIBS
) \
398 $(MK_RESOURCE
) $(MK_OBJECTS
) $(MK_LIBS
)
400 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
401 --base-file base.tmp \
402 --output-exp temp.exp
$(MK_EXTRACMD
)
405 $(CC
) $(TARGET_LFLAGS
) \
406 -Wl
,--entry
,$(TARGET_ENTRY
) $(MK_EXTRACMD2
) \
407 -o
$(MK_NOSTRIPNAME
) $(MK_GCCLIBS
) \
408 $(MK_RESOURCE
) $(MK_OBJECTS
) $(MK_LIBS
)
410 - $(NM
) --numeric-sort
$(MK_NOSTRIPNAME
) > $(MK_BASENAME
).sym
413 # Kernel mode targets
414 ifeq ($(MK_MODE
),kernel
)
416 ifeq ($(MK_IMPLIB
),yes
)
417 MK_EXTRACMD
:= --def
$(MK_EDFNAME
)
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 \
429 $(CC
) -Wl
,--base-file
,base.tmp \
430 -Wl
,--entry
,$(TARGET_ENTRY
) \
432 -nostartfiles
-nostdlib \
433 -o junk.tmp
$(MK_GCCLIBS
) \
434 $(MK_RESOURCE
) $(MK_OBJECTS
) $(MK_LIBS
)
436 $(DLLTOOL
) --dllname
$(MK_FULLNAME
) \
437 --base-file base.tmp \
438 --output-exp temp.exp
$(MK_EXTRACMD
)
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
) \
447 -mdll
-nostartfiles
-nostdlib \
448 -o
$(MK_NOSTRIPNAME
) $(MK_GCCLIBS
) \
449 $(MK_RESOURCE
) $(MK_OBJECTS
) $(MK_LIBS
)
451 - $(NM
) --numeric-sort
$(MK_NOSTRIPNAME
) > $(MK_BASENAME
).sym
455 $(MK_FULLNAME
): $(MK_NOSTRIPNAME
)
456 $(CP
) $(MK_NOSTRIPNAME
) $(MK_FULLNAME
)
457 # $(STRIP) --strip-debug $(MK_FULLNAME)
459 endif # MK_IMPLIBONLY
462 $(MK_RESOURCE
): $(PATH_TO_TOP
)/include/reactos
/buildno.h
$(TARGET_PATH
)/$(TARGET_NAME
).rc
464 # Be carefull not to clean non-object files
465 MK_CLEANFILES
:= $(filter %.o
,$(MK_OBJECTS
))
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 \
473 ifneq ($(TARGET_HEADERS
),)
474 $(TARGET_OBJECTS
): $(TARGET_HEADERS
)
477 # install and dist rules
479 ifeq ($(MK_IMPLIBONLY
),yes
)
481 # Don't install import libraries
490 install: $(INSTALL_DIR
)/$(MK_INSTALLDIR
)/$(MK_FULLNAME
)
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
496 dist: $(DIST_DIR
)/$(MK_DISTDIR
)/$(MK_FULLNAME
)
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
503 endif # MK_IMPLIBONLY
506 .phony
: all clean install dist
510 $(CC
) $(TARGET_CFLAGS
) -c
$< -o
$@
512 $(CC
) $(TARGET_CPPFLAGS
) -c
$< -o
$@
514 $(CC
) $(TARGET_CPPFLAGS
) -c
$< -o
$@
516 $(AS
) $(TARGET_ASFLAGS
) -c
$< -o
$@
518 $(AS
) $(TARGET_ASFLAGS
) -c
$< -o
$@
520 $(NASM_CMD
) $(TARGET_NFLAGS
) $< -o
$@
522 $(RC
) $(RCINC
) $< -o
$@
526 CFLAGS
:= $(TARGET_CFLAGS
)