update for HEAD-2003050101
[reactos.git] / tools / helper.mk
index 646bdd9..f505a5a 100644 (file)
 #                        bootpgm = Boot program
 #                        miniport = Kernel mode driver that does not link with ntoskrnl.exe or hal.dll
 #                        gdi_driver = Kernel mode graphics driver that link with win32k.sys
+#                        subsystem = Kernel subsystem
+#                        kmdll = Kernel mode DLL
 #   $TARGET_APPTYPE    = Application type (windows,native,console)
 #   $TARGET_NAME       = Base name of output file and .rc, .def, and .edf files
 #   $TARGET_OBJECTS    = Object files that compose the module
 #   $TARGET_HEADERS    = Header files that the object files depend on (optional)
 #   $TARGET_DEFNAME    = Base name of .def and .edf files (optional)
 #   $TARGET_BASENAME   = Base name of output file (overrides $TARGET_NAME if it exists) (optional)
-#   $TARGET_EXTENSION  = Extesion of the output file (optional)
+#   $TARGET_EXTENSION  = Extension of the output file (optional)
 #   $TARGET_DDKLIBS    = DDK libraries that are to be imported by the module (optional)
 #   $TARGET_SDKLIBS    = SDK libraries that are to be imported by the module (optional)
 #   $TARGET_LIBS       = Other libraries that are to be imported by the module (optional)
@@ -40,6 +42,8 @@
 #   $TARGET_LIBPATH    = Destination path for import libraries (optional)
 #   $TARGET_INSTALLDIR = Destination path when installed (optional)
 #   $TARGET_PCH        = Filename of header to use to generate a PCH if supported by the compiler (optional)
+#   $TARGET_BOOTSTRAP   = Wether this file is needed to bootstrap the installation (no,yes) (optional)
+#   $TARGET_BOOTSTRAP_NAME = Name on the installation medium (optional)
 #   $WINE_MODE         = Compile using WINE headers (no,yes) (optional)
 #   $WINE_RC           = Name of .rc file for WINE modules (optional)
 
@@ -50,6 +54,26 @@ ifeq ($(TARGET_PATH),)
 TARGET_PATH := .
 endif
 
+ifeq ($(ARCH),i386)
+ MK_ARCH_ID := _M_IX86
+endif
+
+ifeq ($(ARCH),alpha)
+ MK_ARCH_ID := _M_ALPHA
+endif
+
+ifeq ($(ARCH),mips)
+ MK_ARCH_ID := _M_MIPS
+endif
+
+ifeq ($(ARCH),powerpc)
+ MK_ARCH_ID := _M_PPC
+endif
+
+# unknown architecture
+ifeq ($(MK_ARCH_ID),)
+ MK_ARCH_ID := _M_UNKNOWN
+endif
 
 ifeq ($(TARGET_TYPE),program)
   MK_MODE := user
@@ -72,6 +96,7 @@ endif
   MK_IMPLIBDEFPATH :=
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := bin
+  MK_BOOTCDDIR := system32
   MK_DISTDIR := apps
 ifeq ($(WINE_RC),)
   MK_RES_BASE := $(TARGET_NAME)
@@ -95,6 +120,7 @@ ifeq ($(TARGET_TYPE),proglib)
   MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := bin
+  MK_BOOTCDDIR := system32
   MK_DISTDIR := apps
   MK_RES_BASE := $(TARGET_NAME)
 endif
@@ -120,6 +146,7 @@ endif
   MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := system32
+  MK_BOOTCDDIR := system32
   MK_DISTDIR := dlls
 ifeq ($(WINE_RC),)
   MK_RES_BASE := $(TARGET_NAME)
@@ -129,6 +156,7 @@ endif
 endif
 
 ifeq ($(TARGET_TYPE),library)
+  TARGET_NORC := yes
   MK_MODE := static
   MK_EXETYPE :=
   MK_DEFEXT := .a
@@ -142,8 +170,9 @@ ifeq ($(TARGET_TYPE),library)
   MK_IMPLIBONLY := no
   MK_IMPLIBDEFPATH :=
   MK_IMPLIB_EXT :=
-  MK_INSTALLDIR := system32
-  MK_DISTDIR := # FIXME
+  MK_INSTALLDIR := # none
+  MK_BOOTCDDIR := system32
+  MK_DISTDIR := # none
   MK_RES_BASE :=
 endif
 
@@ -162,6 +191,7 @@ ifeq ($(TARGET_TYPE),driver_library)
   MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := $(DDK_PATH_INC)
+  MK_BOOTCDDIR := .
   MK_DISTDIR := # FIXME
   MK_RES_BASE :=
 endif
@@ -181,6 +211,7 @@ ifeq ($(TARGET_TYPE),driver)
   MK_IMPLIBDEFPATH :=
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := system32/drivers
+  MK_BOOTCDDIR := .
   MK_DISTDIR := drivers
   MK_RES_BASE := $(TARGET_NAME)
 endif
@@ -200,6 +231,7 @@ ifeq ($(TARGET_TYPE),export_driver)
   MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := system32/drivers
+  MK_BOOTCDDIR := .
   MK_DISTDIR := drivers
   MK_RES_BASE := $(TARGET_NAME)
 endif
@@ -219,6 +251,7 @@ ifeq ($(TARGET_TYPE),hal)
   MK_IMPLIBDEFPATH :=
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := system32
+  MK_BOOTCDDIR := .
   MK_DISTDIR := dlls
   MK_RES_BASE := $(TARGET_NAME)
 endif
@@ -238,6 +271,7 @@ ifeq ($(TARGET_TYPE),bootpgm)
   MK_IMPLIBDEFPATH :=
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := system32
+  MK_BOOTCDDIR := system32
   MK_DISTDIR := # FIXME
   MK_RES_BASE := $(TARGET_NAME)
 endif
@@ -257,6 +291,7 @@ ifeq ($(TARGET_TYPE),miniport)
   MK_IMPLIBDEFPATH :=
   MK_IMPLIB_EXT := .a
   MK_INSTALLDIR := system32/drivers
+  MK_BOOTCDDIR := .
   MK_DISTDIR := drivers
   MK_RES_BASE := $(TARGET_NAME)
 endif
@@ -275,8 +310,9 @@ ifeq ($(TARGET_TYPE),gdi_driver)
   MK_IMPLIBONLY := no
   MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
   MK_IMPLIB_EXT := .a
-  MK_INSTALLDIR := system32/drivers
-  MK_DISTDIR := drivers
+  MK_INSTALLDIR := system32
+  MK_BOOTCDDIR := .
+  MK_DISTDIR := dlls
   MK_RES_BASE := $(TARGET_NAME)
 endif
 
@@ -321,6 +357,44 @@ ifeq ($(TARGET_TYPE),proglib)
   endif
 endif
 
+ifeq ($(TARGET_TYPE),subsystem)
+  MK_MODE := kernel
+  MK_EXETYPE := dll
+  MK_DEFEXT := .sys
+  MK_DEFENTRY := _DriverEntry@8
+  MK_DDKLIBS := ntoskrnl.a hal.a
+  MK_SDKLIBS :=
+  MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
+  MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
+  MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
+  MK_IMPLIB := yes
+  MK_IMPLIBONLY := no
+  MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
+  MK_IMPLIB_EXT := .a
+  MK_INSTALLDIR := system32
+  MK_DISTDIR := drivers
+  MK_RES_BASE := $(TARGET_NAME)
+endif
+
+ifeq ($(TARGET_TYPE),kmdll)
+  MK_MODE := kernel
+  MK_EXETYPE := dll
+  MK_DEFEXT := .dll
+  MK_DEFENTRY := 0x0
+  MK_DDKLIBS := ntoskrnl.a hal.a
+  MK_SDKLIBS :=
+  MK_CFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
+  MK_CPPFLAGS := -D__NTDRIVER__ -I./ -I$(DDK_PATH_INC)
+  MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
+  MK_IMPLIB := yes
+  MK_IMPLIBONLY := no
+  MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
+  MK_IMPLIB_EXT := .a
+  MK_INSTALLDIR := system32
+  MK_DISTDIR := drivers
+  MK_RES_BASE := $(TARGET_NAME)
+endif
+
 
 MK_RESOURCE := $(MK_RES_BASE).coff
 
@@ -330,6 +404,11 @@ ifneq ($(TARGET_INSTALLDIR),)
 endif
 
 
+ifneq ($(BOOTCD_INSTALL),)
+  MK_INSTALLDIR := .
+endif
+
+
 ifeq ($(TARGET_LIBPATH),)
   MK_IMPLIBPATH := $(MK_IMPLIBDEFPATH)
 else
@@ -388,6 +467,11 @@ ifeq ($(MK_MODE),kernel)
 endif
 
 
+ifneq ($(TARGET_LIBS),)
+  MK_LIBS := $(TARGET_LIBS) $(MK_LIBS)
+endif
+
+
 ifeq ($(TARGET_BASE),)
   TARGET_BASE := $(MK_DEFBASE)
 endif
@@ -404,8 +488,9 @@ endif
 include $(PATH_TO_TOP)/config
 
 
+TARGET_ASFLAGS += -march=$(ARCH) -D$(MK_ARCH_ID)
 TARGET_CFLAGS += $(MK_CFLAGS)
-TARGET_CFLAGS += -pipe -march=$(ARCH)
+TARGET_CFLAGS += -pipe -march=$(ARCH) -D$(MK_ARCH_ID)
 ifeq ($(DBG),1)
 TARGET_ASFLAGS += -g
 TARGET_CFLAGS += -g
@@ -413,7 +498,7 @@ TARGET_LFLAGS += -g
 endif
 
 TARGET_CPPFLAGS += $(MK_CPPFLAGS)
-TARGET_CPPFLAGS += -pipe -march=$(ARCH)
+TARGET_CPPFLAGS += -pipe -march=$(ARCH) -D$(MK_ARCH_ID)
 
 TARGET_RCFLAGS += $(MK_RCFLAGS)
 
@@ -425,7 +510,12 @@ TARGET_NFLAGS += $(MK_NFLAGS)
 
 MK_GCCLIBS := $(addprefix -l, $(TARGET_GCCLIBS))
 
-MK_FULLNAME := $(MK_BASENAME)$(MK_EXT)
+ifeq ($(MK_MODE),static)
+  MK_FULLNAME := $(SDK_PATH_LIB)/$(MK_BASENAME)$(MK_EXT)
+else
+  MK_FULLNAME := $(MK_BASENAME)$(MK_EXT)
+endif
+
 MK_IMPLIB_FULLNAME := $(MK_BASENAME)$(MK_IMPLIB_EXT)
 
 MK_NOSTRIPNAME := $(MK_BASENAME).nostrip$(MK_EXT)
@@ -563,6 +653,12 @@ ifeq ($(MK_MODE),static)
 $(MK_FULLNAME): $(TARGET_OBJECTS)
        $(AR) -r $(MK_FULLNAME) $(TARGET_OBJECTS)
 
+# Static libraries dont have a nostrip version
+$(MK_NOSTRIPNAME):
+       -
+
+.phony: $(MK_NOSTRIPNAME)
+
 endif # MK_MODE
 
 endif # MK_IMPLIBONLY
@@ -601,7 +697,7 @@ ifneq ($(TARGET_HEADERS),)
 $(TARGET_OBJECTS): $(TARGET_HEADERS)
 endif
 
-# install and dist rules
+# install, dist and bootcd rules
 
 ifeq ($(MK_IMPLIBONLY),yes)
 
@@ -611,15 +707,46 @@ install:
 
 dist:
 
+bootcd:
+
 else # MK_IMPLIBONLY
 
 
+# Don't install static libraries
+ifeq ($(MK_MODE),static)
+
+install:
+       -
+
+else # MK_MODE
+
 install: $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
 
+endif # MK_MODE
+
+
+ifeq ($(INSTALL_SYMBOLS),no)
+
+$(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME):
+       $(CP) $(MK_FULLNAME) $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
+
+else # INSTALL_SYMBOLS
+
+# Don't install static libraries
+ifeq ($(MK_MODE),static)
+
+install:
+       -
+
+else # MK_MODE
+
 $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME): $(MK_FULLNAME) $(MK_BASENAME).sym
        $(CP) $(MK_FULLNAME) $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
        $(CP) $(MK_BASENAME).sym $(INSTALL_DIR)/symbols/$(MK_BASENAME).sym
 
+endif # MK_MODE
+
+endif # INSTALL_SYMBOLS
 
 dist: $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME)
 
@@ -627,10 +754,30 @@ $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME): $(MK_FULLNAME)
        $(CP) $(MK_FULLNAME) $(DIST_DIR)/$(MK_DISTDIR)/$(MK_FULLNAME)
        $(CP) $(MK_BASENAME).sym $(DIST_DIR)/symbols/$(MK_BASENAME).sym
 
+# Bootstrap files for the bootable CD
+ifeq ($(TARGET_BOOTSTRAP),yes)
+
+ifneq ($(TARGET_BOOTSTRAP_NAME),)
+MK_BOOTSTRAP_NAME := $(TARGET_BOOTSTRAP_NAME)
+else # TARGET_BOOTSTRAP_NAME
+MK_BOOTSTRAP_NAME := $(MK_FULLNAME)
+endif # TARGET_BOOTSTRAP_NAME
+
+bootcd: $(BOOTCD_DIR)/reactos/$(MK_BOOTCDDIR)/$(MK_BOOTSTRAP_NAME)
+
+$(BOOTCD_DIR)/reactos/$(MK_BOOTCDDIR)/$(MK_BOOTSTRAP_NAME):
+       $(CP) $(MK_FULLNAME) $(BOOTCD_DIR)/reactos/$(MK_BOOTCDDIR)/$(MK_BOOTSTRAP_NAME)
+
+else # TARGET_BOOTSTRAP
+
+bootcd:
+       
+endif # TARGET_BOOTSTRAP
+
 endif # MK_IMPLIBONLY
 
 
-.phony: all depends implib clean install dist depends
+.phony: all depends implib clean install dist bootcd depends
 
 
 # Precompiled header support