# $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)
# $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)
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
MK_FULLRES := $(TARGET_PATH)/$(MK_RESOURCE)
endif
-
ifeq ($(TARGET_DEFNAME),)
MK_DEFBASE := $(TARGET_NAME)
else
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
# 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)
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) \
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)
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
--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
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 \
--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 \
-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 \
--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 \
-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
# 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)
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):
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)
bootcd:
endif # TARGET_BOOTSTRAP
+
+endif # MK_MODE
endif # MK_IMPLIBONLY
%.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
$(NASM_CMD) $(NFLAGS) $(TARGET_NFLAGS) $< -o $@
%.coff: %.rc
$(RC) $(TARGET_RCFLAGS) $(RCINC) $< -o $@
-
+# Kill implicit rule
+.o:;
# Compatibility
CFLAGS := $(TARGET_CFLAGS)