-# $Id: helper.mk,v 1.7 2001/09/01 11:55:38 dwelch Exp $
+# $Id: helper.mk,v 1.12 2002/04/29 23:02:12 hyperion Exp $
#
# Helper makefile for ReactOS modules
# Variables this makefile accepts:
# program = User mode program
# proglib = Executable program that have exported functions
# dynlink = Dynamic Link Library (DLL)
-# library = Import library that will be linked with other code
+# library = Library that will be linked with other code
# driver_library = Import library for a driver
# driver = Kernel mode driver
# export_driver = Kernel mode driver that have exported functions
# $TARGET_CPPFLAGS = G++ flags (optional)
# $TARGET_ASFLAGS = GCC assembler flags (optional)
# $TARGET_NFLAGS = NASM flags (optional)
+# $TARGET_RCFLAGS = Windres flags (optional)
# $TARGET_CLEAN = Files that are part of the clean rule (optional)
# $TARGET_PATH = Relative path for *.def, *.edf, and *.rc (optional)
# $TARGET_BASE = Default base address (optional)
# $TARGET_NORC = Do not include standard resource file (no,yes) (optional)
# $TARGET_LIBPATH = Destination path for import libraries (optional)
# $TARGET_INSTALLDIR = Destination path when installed (optional)
+# $WINE_MODE = Compile using WINE headers (no,yes) (optional)
+# $WINE_RC = Name of .rc file for WINE modules (optional)
ifeq ($(TARGET_PATH),)
TARGET_PATH := .
endif
-# FIXME: MK_DEFENTRY may not be correct
ifeq ($(TARGET_TYPE),program)
MK_MODE := user
MK_EXETYPE := exe
MK_DEFENTRY := _DEFINE_TARGET_APPTYPE
MK_DDKLIBS :=
MK_SDKLIBS :=
+ifneq ($(WINE_MODE),yes)
MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
+ MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
+else
+ MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE)
+ MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE)
+ MK_RCFLAGS := --include-dir $(PATH_TO_TOP)/include/wine --include-dir $(WINE_INCLUDE)
+endif
MK_IMPLIB := no
MK_IMPLIBONLY := no
MK_IMPLIBDEFPATH :=
MK_IMPLIB_EXT := .a
MK_INSTALLDIR := bin
MK_DISTDIR := apps
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ifeq ($(WINE_RC),)
+ MK_RES_BASE := $(TARGET_NAME)
+else
+ MK_RES_BASE := $(WINE_RC)
+endif
endif
ifeq ($(TARGET_TYPE),proglib)
MK_SDKLIBS :=
MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
+ MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
MK_IMPLIB := yes
MK_IMPLIBONLY := no
MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
MK_IMPLIB_EXT := .a
MK_INSTALLDIR := bin
MK_DISTDIR := apps
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ MK_RES_BASE := $(TARGET_NAME)
endif
ifeq ($(TARGET_TYPE),dynlink)
MK_DEFENTRY := _DllMain@12
MK_DDKLIBS :=
MK_SDKLIBS :=
+ifneq ($(WINE_MODE),yes)
MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
+ MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
+else
+ MK_CFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE)
+ MK_CPPFLAGS := -I$(PATH_TO_TOP)/include/wine -I./ -I$(WINE_INCLUDE)
+ MK_RCFLAGS := --include-dir $(PATH_TO_TOP)/include/wine --include-dir $(WINE_INCLUDE)
+endif
MK_IMPLIB := yes
MK_IMPLIBONLY := no
MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
MK_IMPLIB_EXT := .a
MK_INSTALLDIR := system32
MK_DISTDIR := dlls
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ifeq ($(WINE_RC),)
+ MK_RES_BASE := $(TARGET_NAME)
+else
+ MK_RES_BASE := $(WINE_RC)
+endif
endif
ifeq ($(TARGET_TYPE),library)
- MK_MODE := user
- MK_EXETYPE := dll
+ MK_MODE := static
+ MK_EXETYPE :=
MK_DEFEXT := .a
MK_DEFENTRY :=
MK_DDKLIBS :=
MK_SDKLIBS :=
MK_CFLAGS := -I./ -I$(SDK_PATH_INC)
MK_CPPFLAGS := -I./ -I$(SDK_PATH_INC)
+ MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
MK_IMPLIB := no
- MK_IMPLIBONLY := yes
- MK_IMPLIBDEFPATH := $(SDK_PATH_LIB)
- MK_IMPLIB_EXT := .a
+ MK_IMPLIBONLY := no
+ MK_IMPLIBDEFPATH :=
+ MK_IMPLIB_EXT :=
MK_INSTALLDIR := $(SDK_PATH_INC)
MK_DISTDIR := # FIXME
- MK_RESOURCE :=
+ MK_RES_BASE :=
endif
ifeq ($(TARGET_TYPE),driver_library)
MK_SDKLIBS :=
MK_CFLAGS := -I./ -I$(DDK_PATH_INC)
MK_CPPFLAGS := -I./ -I$(DDK_PATH_INC)
+ MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
MK_IMPLIB := no
MK_IMPLIBONLY := yes
MK_IMPLIBDEFPATH := $(DDK_PATH_LIB)
MK_IMPLIB_EXT := .a
MK_INSTALLDIR := $(DDK_PATH_INC)
MK_DISTDIR := # FIXME
- MK_RESOURCE :=
+ MK_RES_BASE :=
endif
ifeq ($(TARGET_TYPE),driver)
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 := no
MK_IMPLIBONLY := no
MK_IMPLIBDEFPATH :=
MK_IMPLIB_EXT := .a
MK_INSTALLDIR := system32/drivers
MK_DISTDIR := drivers
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ MK_RES_BASE := $(TARGET_NAME)
endif
ifeq ($(TARGET_TYPE),export_driver)
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/drivers
MK_DISTDIR := drivers
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ MK_RES_BASE := $(TARGET_NAME)
endif
ifeq ($(TARGET_TYPE),hal)
MK_SDKLIBS :=
MK_CFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC)
MK_CPPFLAGS := -D__NTHAL__ -I./ -I$(DDK_PATH_INC)
+ MK_RCFLAGS := --include-dir $(SDK_PATH_INC)
MK_IMPLIB := yes
MK_IMPLIBONLY := no
MK_IMPLIBDEFPATH :=
MK_IMPLIB_EXT := .a
MK_INSTALLDIR := system32
MK_DISTDIR := dlls
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ MK_RES_BASE := $(TARGET_NAME)
endif
ifeq ($(TARGET_TYPE),bootpgm)
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 := no
MK_IMPLIBONLY := no
MK_IMPLIBDEFPATH :=
MK_IMPLIB_EXT := .a
MK_INSTALLDIR := system32
MK_DISTDIR := # FIXME
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ MK_RES_BASE := $(TARGET_NAME)
endif
ifeq ($(TARGET_TYPE),miniport)
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 := no
MK_IMPLIBONLY := no
MK_IMPLIBDEFPATH :=
MK_IMPLIB_EXT := .a
MK_INSTALLDIR := system32/drivers
MK_DISTDIR := drivers
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ MK_RES_BASE := $(TARGET_NAME)
endif
ifeq ($(TARGET_TYPE),gdi_driver)
MK_EXETYPE := dll
MK_DEFEXT := .dll
MK_DEFENTRY := _DrvEnableDriver@12
-# MK_DEFENTRY := _DriverEntry@8
MK_DDKLIBS := ntoskrnl.a hal.a win32k.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/drivers
MK_DISTDIR := drivers
- MK_RESOURCE := $(TARGET_PATH)/$(TARGET_NAME).coff
+ MK_RES_BASE := $(TARGET_NAME)
endif
ifeq ($(TARGET_TYPE),program)
ifeq ($(TARGET_APPTYPE),windows)
MK_DEFENTRY := _WinMainCRTStartup
- MK_SDKLIBS :=
+ MK_SDKLIBS := ntdll.a kernel32.a gdi32.a user32.a
TARGET_LFLAGS += -Wl,--subsystem,windows
endif
endif
+MK_RESOURCE := $(MK_RES_BASE).coff
+
+
ifneq ($(TARGET_INSTALLDIR),)
MK_INSTALLDIR := $(TARGET_INSTALLDIR)
endif
ifeq ($(TARGET_NORC),yes)
- MK_RESOURCE :=
+ MK_FULLRES :=
+else
+ MK_FULLRES := $(TARGET_PATH)/$(MK_RESOURCE)
endif
TARGET_CPPFLAGS += $(MK_CPPFLAGS)
TARGET_CPPFLAGS += -pipe -march=$(ARCH)
+TARGET_RCFLAGS += $(MK_RCFLAGS)
+
TARGET_ASFLAGS += $(MK_ASFLAGS)
TARGET_ASFLAGS += -pipe -march=$(ARCH)
# We don't want to link header files
MK_OBJECTS := $(filter-out %.h,$(TARGET_OBJECTS))
+MK_STRIPPED_OBJECT := $(MK_BASENAME).stripped.o
ifeq ($(MK_IMPLIBONLY),yes)
else # MK_IMPLIBONLY
-all: $(MK_FULLNAME)
+all: $(MK_FULLNAME) $(MK_NOSTRIPNAME)
ifeq ($(MK_IMPLIB),yes)
MK_EXTRACMD2 :=
endif
-$(MK_NOSTRIPNAME): $(MK_RESOURCE) $(TARGET_OBJECTS) $(MK_LIBS)
-ifeq ($(MK_IMPLIB),yes)
- $(DLLTOOL) --dllname $(MK_FULLNAME) \
- --def $(MK_DEFNAME) \
- --output-lib $(MK_IMPLIBPATH)/$(MK_BASENAME).a \
- --kill-at
-endif
+$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS)
ifeq ($(MK_EXETYPE),dll)
$(CC) -Wl,--base-file,base.tmp \
-Wl,--entry,$(TARGET_ENTRY) \
$(TARGET_LFLAGS) \
- -o junk.tmp $(MK_GCCLIBS) \
- $(MK_RESOURCE) $(MK_OBJECTS) $(MK_LIBS)
+ -o junk.tmp \
+ $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
- $(RM) junk.tmp
$(DLLTOOL) --dllname $(MK_FULLNAME) \
--base-file base.tmp \
endif
$(CC) $(TARGET_LFLAGS) \
-Wl,--entry,$(TARGET_ENTRY) $(MK_EXTRACMD2) \
- -o $(MK_NOSTRIPNAME) $(MK_GCCLIBS) \
- $(MK_RESOURCE) $(MK_OBJECTS) $(MK_LIBS)
+ -o $(MK_NOSTRIPNAME) \
+ $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
- $(RM) temp.exp
- $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).sym
+
+$(MK_FULLNAME): $(MK_NOSTRIPNAME)
+ $(CP) $(MK_NOSTRIPNAME) $(MK_FULLNAME)
+# $(STRIP) --strip-debug $(MK_FULLNAME)
+
endif # KM_MODE
# Kernel mode targets
MK_EXTRACMD :=
endif
-$(MK_NOSTRIPNAME): $(MK_RESOURCE) $(TARGET_OBJECTS) $(MK_LIBS)
-ifeq ($(MK_IMPLIB),yes)
- $(DLLTOOL) --dllname $(MK_FULLNAME) \
- --def $(MK_DEFNAME) \
- --output-lib $(MK_IMPLIBPATH)/$(MK_BASENAME).a \
- --kill-at
-endif
+$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS)
$(CC) -Wl,--base-file,base.tmp \
-Wl,--entry,$(TARGET_ENTRY) \
$(TARGET_LFLAGS) \
-nostartfiles -nostdlib \
- -o junk.tmp $(MK_GCCLIBS) \
- $(MK_RESOURCE) $(MK_OBJECTS) $(MK_LIBS)
+ -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
- $(CC) $(TARGET_LFLAGS) \
+ $(CC) \
-Wl,--subsystem,native \
-Wl,--image-base,$(TARGET_BASE) \
-Wl,--file-alignment,0x1000 \
-Wl,--section-alignment,0x1000 \
-Wl,--entry,$(TARGET_ENTRY) \
-Wl,temp.exp \
+ $(TARGET_LFLAGS) \
-mdll -nostartfiles -nostdlib \
- -o $(MK_NOSTRIPNAME) $(MK_GCCLIBS) \
- $(MK_RESOURCE) $(MK_OBJECTS) $(MK_LIBS)
+ -o $(MK_NOSTRIPNAME) \
+ $(MK_FULLRES) $(MK_OBJECTS) $(MK_LIBS) $(MK_GCCLIBS)
- $(RM) temp.exp
- $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).sym
+$(MK_FULLNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_LIBS)
+ $(LD) -r -o $(MK_STRIPPED_OBJECT) $(MK_OBJECTS)
+ $(STRIP) --strip-debug $(MK_STRIPPED_OBJECT)
+ $(CC) -Wl,--base-file,base.tmp \
+ -Wl,--entry,$(TARGET_ENTRY) \
+ $(TARGET_LFLAGS) \
+ -nostartfiles -nostdlib \
+ -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
+ $(CC) \
+ -Wl,--subsystem,native \
+ -Wl,--image-base,$(TARGET_BASE) \
+ -Wl,--file-alignment,0x1000 \
+ -Wl,--section-alignment,0x1000 \
+ -Wl,--entry,$(TARGET_ENTRY) \
+ -Wl,temp.exp \
+ $(TARGET_LFLAGS) \
+ -mdll -nostartfiles -nostdlib \
+ -o $(MK_FULLNAME) \
+ $(MK_FULLRES) $(MK_STRIPPED_OBJECT) $(MK_LIBS) $(MK_GCCLIBS)
+ - $(RM) temp.exp
+
endif # MK_MODE
+# Static library target
+ifeq ($(MK_MODE),static)
+
+$(MK_NOSTRIPNAME): $(TARGET_OBJECTS)
+ $(AR) -r $(MK_NOSTRIPNAME) $(TARGET_OBJECTS)
+
+# FIXME: dummy rule
$(MK_FULLNAME): $(MK_NOSTRIPNAME)
$(CP) $(MK_NOSTRIPNAME) $(MK_FULLNAME)
-# $(STRIP) --strip-debug $(MK_FULLNAME)
+
+endif # MK_MODE
endif # MK_IMPLIBONLY
-$(MK_RESOURCE): $(PATH_TO_TOP)/include/reactos/buildno.h $(TARGET_PATH)/$(TARGET_NAME).rc
+$(MK_FULLRES): $(PATH_TO_TOP)/include/reactos/buildno.h $(TARGET_PATH)/$(MK_RES_BASE).rc
+
+implib:
+ifeq ($(MK_IMPLIB),yes)
+ $(DLLTOOL) --dllname $(MK_FULLNAME) \
+ --def $(MK_DEFNAME) \
+ --output-lib $(MK_IMPLIBPATH)/$(MK_BASENAME).a \
+ --kill-at
+endif
# Be carefull not to clean non-object files
MK_CLEANFILES := $(filter %.o,$(MK_OBJECTS))
clean:
- - $(RM) *.o $(MK_BASENAME).sym $(MK_BASENAME).a $(TARGET_PATH)/$(TARGET_NAME).coff \
+ - $(RM) *.o $(MK_BASENAME).sym $(MK_BASENAME).a $(TARGET_PATH)/$(MK_RES_BASE).coff \
$(MK_FULLNAME) $(MK_NOSTRIPNAME) $(MK_CLEANFILES) \
junk.tmp base.tmp temp.exp \
$(TARGET_CLEAN)
endif # MK_IMPLIBONLY
-.phony: all clean install dist
+.phony: all implib clean install dist
%.o: %.c
%.o: %.asm
$(NASM_CMD) $(TARGET_NFLAGS) $< -o $@
%.coff: %.rc
- $(RC) $(RCINC) $< -o $@
+ $(RC) $(TARGET_RCFLAGS) $(RCINC) $< -o $@
# Compatibility