update for HEAD-2003091401
[reactos.git] / tools / helper.mk
index f505a5a..84e8539 100644 (file)
@@ -19,6 +19,7 @@
 #   $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_CPPAPP     = C++ application (no,yes) (optional)
 #   $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)
@@ -42,8 +43,9 @@
 #   $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  = Wether this file is needed to bootstrap the installation (no,yes) (optional)
 #   $TARGET_BOOTSTRAP_NAME = Name on the installation medium (optional)
+#   $TARGET_GENREGTESTS = Generate regression test registrations (optional)
 #   $WINE_MODE         = Compile using WINE headers (no,yes) (optional)
 #   $WINE_RC           = Name of .rc file for WINE modules (optional)
 
@@ -317,6 +319,10 @@ ifeq ($(TARGET_TYPE),gdi_driver)
 endif
 
 
+# can be overidden with $(CXX) for linkage of c++ executables
+LD_CC = $(CC)
+
+
 ifeq ($(TARGET_TYPE),program)
   ifeq ($(TARGET_APPTYPE),windows)
     MK_DEFENTRY := _WinMainCRTStartup
@@ -436,7 +442,6 @@ else
   MK_FULLRES := $(TARGET_PATH)/$(MK_RESOURCE)
 endif
 
-
 ifeq ($(TARGET_DEFNAME),)
   MK_DEFBASE := $(TARGET_NAME)
 else
@@ -452,7 +457,11 @@ endif
 
 
 ifeq ($(MK_MODE),user)
-  MK_DEFBASE := 0x400000
+  ifeq ($(MK_EXETYPE),dll)
+    MK_DEFBASE := 0x10000000
+  else
+    MK_DEFBASE := 0x400000
+  endif
   ifneq ($(TARGET_SDKLIBS),)
     MK_LIBS := $(addprefix $(SDK_PATH_LIB)/, $(TARGET_SDKLIBS))
   else
@@ -522,7 +531,14 @@ MK_NOSTRIPNAME := $(MK_BASENAME).nostrip$(MK_EXT)
 
 # We don't want to link header files
 MK_OBJECTS := $(filter-out %.h,$(TARGET_OBJECTS))
-MK_STRIPPED_OBJECT := $(MK_BASENAME).stripped.o
+
+# There is problems with C++ applications and ld -r. Ld can cause errors like:
+#   reloc refers to symbol `.text$_ZN9CCABCodecC2Ev' which is not being output
+ifeq ($(TARGET_CPPAPP),yes)
+  MK_STRIPPED_OBJECT := $(MK_OBJECTS)
+else
+  MK_STRIPPED_OBJECT := $(MK_BASENAME).stripped.o
+endif
 
 ifeq ($(MK_IMPLIBONLY),yes)
 
@@ -530,7 +546,7 @@ TARGET_CLEAN += $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME)
 
 all: $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME)
 
-$(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(TARGET_OBJECTS)
+$(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(TARGET_OBJECTS) $(MK_DEFNAME)
        $(DLLTOOL) \
                --dllname $(MK_FULLNAME) \
                --def $(MK_DEFNAME) \
@@ -540,7 +556,21 @@ $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(TARGET_OBJECTS)
 else # MK_IMPLIBONLY
 
 
-all: $(MK_FULLNAME) $(MK_NOSTRIPNAME)
+all: $(MK_GENREGTESTS) $(MK_FULLNAME) $(MK_NOSTRIPNAME)
+
+
+ifeq ($(TARGET_GENREGTESTS),yes)
+_regtests_phony:
+       $(RM) _regtests.c
+.PHONY: _regtests_phony
+_regtests.c: _regtests_phony
+       $(REGTESTS) . _regtests.c
+  MK_GENREGTESTS := _regtests_phony
+  MK_GENREGTESTS_CLEAN := _regtests.c _regtests.o
+else
+  MK_GENREGTESTS := 
+  MK_GENREGTESTS_CLEAN :=
+endif
 
 
 ifeq ($(MK_IMPLIB),yes)
@@ -554,16 +584,29 @@ ifeq ($(MK_MODE),user)
 
 ifeq ($(MK_EXETYPE),dll)
   TARGET_LFLAGS += -mdll -Wl,--image-base,$(TARGET_BASE)
+  MK_EXTRADEP := $(MK_EDFNAME)
   MK_EXTRACMD2 := -Wl,temp.exp
 else
+  MK_EXTRADEP :=
   MK_EXTRACMD2 :=
 endif
 
-$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS)
+$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS)
 ifeq ($(MK_EXETYPE),dll)
-       $(CC) -Wl,--base-file,base.tmp \
+       $(LD_CC) -Wl,--base-file,base.tmp \
+               -Wl,--entry,$(TARGET_ENTRY) \
+               $(TARGET_LFLAGS) \
+               -o junk.tmp \
+               $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
+       - $(RM) junk.tmp
+       $(DLLTOOL) --dllname $(MK_FULLNAME) \
+               --base-file base.tmp \
+               --output-exp temp.exp $(MK_EXTRACMD)
+       - $(RM) base.tmp
+       $(LD_CC) -Wl,--base-file,base.tmp \
                -Wl,--entry,$(TARGET_ENTRY) \
                $(TARGET_LFLAGS) \
+               temp.exp \
                -o junk.tmp \
                $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
        - $(RM) junk.tmp
@@ -572,16 +615,60 @@ ifeq ($(MK_EXETYPE),dll)
                --output-exp temp.exp $(MK_EXTRACMD)
        - $(RM) base.tmp
 endif
-       $(CC) $(TARGET_LFLAGS) \
+       $(LD_CC) $(TARGET_LFLAGS) \
                -Wl,--entry,$(TARGET_ENTRY) $(MK_EXTRACMD2) \
-         -o $(MK_NOSTRIPNAME) \
-         $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
+               -o $(MK_NOSTRIPNAME) \
+               $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
        - $(RM) temp.exp
        - $(RSYM) $(MK_NOSTRIPNAME) $(MK_BASENAME).sym
+ifeq ($(FULL_MAP),yes)
+       $(OBJDUMP) -d -S $(MK_NOSTRIPNAME) > $(MK_BASENAME).map
+else
+       $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).map
+endif
 
-$(MK_FULLNAME): $(MK_NOSTRIPNAME)
-        $(CP) $(MK_NOSTRIPNAME) $(MK_FULLNAME)
-#       $(STRIP) --strip-debug $(MK_FULLNAME)
+$(MK_FULLNAME): $(MK_NOSTRIPNAME) $(MK_EXTRADEP)
+       -
+ifneq ($(TARGET_CPPAPP),yes)
+       $(LD) -r -o $(MK_STRIPPED_OBJECT) $(MK_OBJECTS)
+       $(STRIP) --strip-debug $(MK_STRIPPED_OBJECT)
+endif
+ifeq ($(MK_EXETYPE),dll)
+       $(LD_CC) -Wl,--base-file,base.tmp \
+               -Wl,--entry,$(TARGET_ENTRY) \
+               -Wl,--strip-debug \
+               $(TARGET_LFLAGS) \
+               -o junk.tmp \
+               $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
+       - $(RM) junk.tmp
+       $(DLLTOOL) --dllname $(MK_FULLNAME) \
+               --base-file base.tmp \
+               --output-exp temp.exp $(MK_EXTRACMD)
+       - $(RM) base.tmp
+       $(LD_CC) -Wl,--base-file,base.tmp \
+               -Wl,--entry,$(TARGET_ENTRY) \
+               -Wl,--strip-debug \
+               $(TARGET_LFLAGS) \
+               temp.exp \
+               -o junk.tmp \
+               $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
+       - $(RM) junk.tmp
+       $(DLLTOOL) --dllname $(MK_FULLNAME) \
+               --base-file base.tmp \
+               --output-exp temp.exp $(MK_EXTRACMD)
+       - $(RM) base.tmp
+endif
+       $(LD_CC) $(TARGET_LFLAGS) \
+               -Wl,--entry,$(TARGET_ENTRY) \
+               -Wl,--strip-debug \
+               $(MK_EXTRACMD2) \
+               -o $(MK_FULLNAME) \
+               $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
+ifneq ($(TARGET_CPPAPP),yes)
+       - $(RM) temp.exp $(MK_STRIPPED_OBJECT)
+else
+       - $(RM) temp.exp
+endif
 
 endif # KM_MODE
 
@@ -590,12 +677,14 @@ ifeq ($(MK_MODE),kernel)
 
 ifeq ($(MK_IMPLIB),yes)
   MK_EXTRACMD := --def $(MK_EDFNAME)
+  MK_EXTRADEP := $(MK_EDFNAME)
 else
   MK_EXTRACMD :=
+  MK_EXTRADEP :=
 endif
 
-$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS)
-       $(CC) -Wl,--base-file,base.tmp \
+$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS)
+       $(LD_CC) -Wl,--base-file,base.tmp \
                -Wl,--entry,$(TARGET_ENTRY) \
                $(TARGET_LFLAGS) \
                -nostartfiles -nostdlib \
@@ -606,7 +695,7 @@ $(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS)
                --base-file base.tmp \
                --output-exp temp.exp $(MK_EXTRACMD)
        - $(RM) base.tmp
-       $(CC) $(TARGET_LFLAGS) \
+       $(LD_CC) $(TARGET_LFLAGS) \
                -Wl,--subsystem,native \
                -Wl,--image-base,$(TARGET_BASE) \
                -Wl,--file-alignment,0x1000 \
@@ -615,14 +704,22 @@ $(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS)
                -Wl,temp.exp \
                -mdll -nostartfiles -nostdlib \
                -o $(MK_NOSTRIPNAME) \
-         $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
+               $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
        - $(RM) temp.exp
        $(RSYM) $(MK_NOSTRIPNAME) $(MK_BASENAME).sym
+ifeq ($(FULL_MAP),yes)
+       $(OBJDUMP) -d -S $(MK_NOSTRIPNAME) > $(MK_BASENAME).map
+else
+       $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).map
+endif
 
-$(MK_FULLNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS) $(MK_NOSTRIPNAME)
+$(MK_FULLNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) $(MK_NOSTRIPNAME)
+       -
+ifneq ($(TARGET_CPPAPP),yes)
        $(LD) -r -o $(MK_STRIPPED_OBJECT) $(MK_OBJECTS)
        $(STRIP) --strip-debug $(MK_STRIPPED_OBJECT)
-       $(CC) -Wl,--base-file,base.tmp \
+endif
+       $(LD_CC) -Wl,--base-file,base.tmp \
                -Wl,--entry,$(TARGET_ENTRY) \
                $(TARGET_LFLAGS) \
                -nostartfiles -nostdlib \
@@ -633,7 +730,7 @@ $(MK_FULLNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS) $(MK_NOSTRIPNAME)
                --base-file base.tmp \
                --output-exp temp.exp $(MK_EXTRACMD)
        - $(RM) base.tmp
-       $(CC) $(TARGET_LFLAGS) \
+       $(LD_CC) $(TARGET_LFLAGS) \
                -Wl,--subsystem,native \
                -Wl,--image-base,$(TARGET_BASE) \
                -Wl,--file-alignment,0x1000 \
@@ -642,8 +739,12 @@ $(MK_FULLNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS) $(MK_NOSTRIPNAME)
                -Wl,temp.exp \
                -mdll -nostartfiles -nostdlib \
                -o $(MK_FULLNAME) \
-         $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
+               $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
+ifneq ($(TARGET_CPPAPP),yes)
+       - $(RM) temp.exp $(MK_STRIPPED_OBJECT)
+else
        - $(RM) temp.exp
+endif
 
 endif # MK_MODE
 
@@ -686,10 +787,12 @@ endif
 
 # Be carefull not to clean non-object files
 MK_CLEANFILES := $(filter %.o,$(MK_OBJECTS))
+MK_CLEANFILTERED := $(MK_OBJECTS:.o=.d)
+MK_CLEANDEPS := $(join $(dir $(MK_CLEANFILTERED)), $(addprefix ., $(notdir $(MK_CLEANFILTERED))))
 
 clean:
        - $(RM) *.o depend.d *.pch $(MK_BASENAME).sym $(MK_BASENAME).a $(TARGET_PATH)/$(MK_RES_BASE).coff \
-         $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(MK_CLEANFILES) \
+         $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(MK_CLEANFILES) $(MK_CLEANDEPS) $(MK_GENREGTESTS_CLEAN) $(MK_BASENAME).map \
          junk.tmp base.tmp temp.exp \
          $(TARGET_CLEAN)
 
@@ -716,15 +819,15 @@ else # MK_IMPLIBONLY
 ifeq ($(MK_MODE),static)
 
 install:
-       -
+       
+dist:
+
+bootcd:        
 
 else # MK_MODE
 
 install: $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME)
 
-endif # MK_MODE
-
-
 ifeq ($(INSTALL_SYMBOLS),no)
 
 $(INSTALL_DIR)/$(MK_INSTALLDIR)/$(MK_FULLNAME):
@@ -732,20 +835,10 @@ $(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)
@@ -773,6 +866,8 @@ else # TARGET_BOOTSTRAP
 bootcd:
        
 endif # TARGET_BOOTSTRAP
+    
+endif # MK_MODE     
 
 endif # MK_IMPLIBONLY
 
@@ -810,9 +905,11 @@ endif # ROS_USE_PCH
 %.o: %.c $(MK_PCHNAME)
        $(CC) $(TARGET_CFLAGS) -c $< -o $@
 %.o: %.cc
-       $(CC) $(TARGET_CPPFLAGS) -c $< -o $@
+       $(CXX) $(TARGET_CPPFLAGS) -c $< -o $@
+%.o: %.cxx
+       $(CXX) $(TARGET_CPPFLAGS) -c $< -o $@
 %.o: %.cpp
-       $(CC) $(TARGET_CPPFLAGS) -c $< -o $@
+       $(CXX) $(TARGET_CPPFLAGS) -c $< -o $@
 %.o: %.S
        $(AS) $(TARGET_ASFLAGS) -c $< -o $@
 %.o: %.s
@@ -821,7 +918,8 @@ endif # ROS_USE_PCH
        $(NASM_CMD) $(NFLAGS) $(TARGET_NFLAGS) $< -o $@
 %.coff: %.rc
        $(RC) $(TARGET_RCFLAGS) $(RCINC) $< -o $@
-
+# Kill implicit rule
+.o:;
 
 # Compatibility
 CFLAGS := $(TARGET_CFLAGS)