# Top level GNUmakefile for windows builds # # It includes makefiles/*.mk for windows buildtype rules # and sources(windows style makefile). it doesn't depend on # Makerules.env except to get SRCBASE if not yet defined. # # $Id: GNUmakefile.inc,v 1.103.50.2 2009/08/18 18:42:30 Exp $ SHELL=bash export SHELL unexport C_DEFINES HOSTNAME=$(shell hostname) ERRORS := WARNINGS := comma:= , empty:= space:= $(empty) $(empty) ifdef ECLOUD_BUILD_ID CMDSHELL := $(subst \,/,$(COMSPEC)) CMDSTART := $(CMDSHELL) /c start /min /separate else # ECLOUD_BUILD_ID CMDSHELL := CMDSTART := endif # ECLOUD_BUILD_ID ### if SRCBASE is not defined, set it to wherever Makerules.env is found ifndef SRCBASE ifneq ($(wildcard ../Makerules.env), ) SRCBASE = ../ else ifneq ($(wildcard ../../Makerules.env), ) SRCBASE = ../.. else ifneq ($(wildcard ../../../Makerules.env),) SRCBASE = ../../.. else ifneq ($(wildcard ../../../../Makerules.env),) SRCBASE = ../../../.. else ifneq ($(wildcard ../../../../../Makerules.env),) SRCBASE = ../../../../.. else ifneq ($(wildcard ../../../../../../Makerules.env),) SRCBASE = ../../../../../.. endif endif endif endif endif endif endif # ifndef SRCBASE ifeq ($(strip $(SRCBASE)), ) ERRORS += "SRCBASE is not defined!" ERRORS += "This variable must be defined in your sources or GNUsources file," ERRORS += "or it may be calculated provided you are in a CVS source repository," ERRORS += "and you are not too far below the root." endif ### if TTYPE is not defined, reinvoke this same makefile with TTYPE defined ###retail:free: --> $(MAKE) -f $(SRCBASE)/GNUmakefile.inc TTYPE=OPT all ###debug:checked: --> $(MAKE) -f $(SRCBASE)/GNUmakefile.inc TTYPE=DBG all ###%: --> $(MAKE) -f $(SRCBASE)/GNUmakefile.inc TTYPE=DBG MAKECMDGOALS=$@ $@ ifeq ($(origin TTYPE), undefined) all : debug free release : all unexport SRCFILE ifndef SRCFILE SRCFILE = ./sources endif include $(SRCFILE) # In some rare instances you may want to have the makefile synthesize # explicit rules for all of your source files. You must do this if you # are building a target with multiple source files of the same name, # e.g. ./utils.c and ../ntddksim/utils.c. You might also want to use # this method if you don't want to use VPATHs. # ifdef USE_SRCRULES SRCRULES=$(SRCFILE).mk SOURCES.CPP := $(filter %.cpp %.CPP,$(SOURCES)) SOURCES.C := $(filter %.c %.C,$(SOURCES)) $(SRCRULES) : $(SRCFILE) @echo "building explicit source rules..." @( \ echo "# DO NOT EDIT!!!! DO NOT EDIT!!!! DO NOT EDIT!!!!"; \ echo "# This file is automatically generated."; \ echo "#"; \ $(foreach f,$(SOURCES.C), echo '$$(OUTDIR_$$(TTYPE))/$(patsubst %.c,%.obj,$(subst /,_,$(f))) : $(f)'; echo ' $$(c-obj-command)'; echo;) \ $(foreach f,$(SOURCES.CPP), echo '$$(OUTDIR_$$(TTYPE))/$(patsubst %.cpp,%.obj,$(subst /,_,$(f))) : $(f)'; echo ' $$(cpp-obj-command)'; echo;) \ ) >$(SRCFILE).mk $(SRCFILE) : echo making $@ retail free :: $(SRCRULES) debug checked :: $(SRCRULES) endif # USE_SRCRULES # # End of rule synthesis section # retail free :: $(MAKE) -f $(SRCBASE)/GNUmakefile.inc TTYPE=OPT all debug checked :: $(MAKE) -f $(SRCBASE)/GNUmakefile.inc TTYPE=DBG all %GNUmakefile.inc : echo making $@ GNUmakefile : echo making $@ clean : $(MAKE) -f $(SRCBASE)/GNUmakefile.inc TTYPE=DBG MAKECMDGOALS=$@ $@ ## This catch-all generic rule breaks make targets defined in module which ## call this makefile. ## % : FORCE ## $(MAKE) -f $(SRCBASE)/GNUmakefile.inc TTYPE=DBG MAKECMDGOALS=$@ $@ .PHONY: all release free checked retail debug clean FORCE ### if TTYPE is defined, ### define commands, tools and compile rules ### include $(SRCFILE) ### build all :: target :: else # TTYPE is defined # Define default command for printing errors and warnings. This will # be redefined at the end of this makefile if any errors or warnings # are encountered. # define print-errors endef define print-warnings endef # define the default command for compiling .c files into .obj files. # Some target types will redefine this command. # # %.obj : %.c define c-obj-command $(CC) -c $(C$(TTYPE)FLAGS) -I$(OUTDIR_$(TTYPE)) $(CPPFLAGS) $(F$(TTYPE)) -Fo$@ $< endef # define the default command for compiling .cpp files into .obj files. # Some target types will redefine this command. # # %.obj : %.cpp define cpp-obj-command $(CC) -c $(C$(TTYPE)FLAGS) -I$(OUTDIR_$(TTYPE)) $(CPPFLAGS) $(F$(TTYPE)) -Fo$@ $< endef # define the default command for compiling .asm files into .obj files. # Some target types will redefine this command. # # %.obj : %.asm define asm-obj-command $(AS) -c $(AFLAGS) $(CPPFLAGS) $(F$(TTYPE)) -Fo$@ $< endef # define the default command for compiling .rc files into .res files. # Some target types will redefine this command. # # %.res : %.rc define rc-res-command export INCLUDE="$(OUTDIR_$(TTYPE));$(MSINCLUDE)"; \ $(CMDSTART) $(RC) -r $(RCFLAGS) -fo$@ $< endef all :: $(print-warnings) ifdef SHOWBUILDINFO @echo " -------------------------------------------" @echo " SRCFILE = $(SRCFILE)" @echo " SOURCES = $(SOURCES)" @echo " C_DEFINES = $(C_DEFINES)" @echo " WLTUNEFILE = $(WLTUNEFILE)" @echo " TARGETPATH = $(TARGETPATH)" @echo " TARGETTYPE = $(TARGETTYPE)" @echo " MAKE_VERSION = $(MAKE_VERSION)" @echo " TTYPE = $(subst OPT,OPT(free),$(subst DBG,DBG(checked),$(TTYPE)))" @echo " -------------------------------------------" endif # SHOWBUILDINFO all :: $(print-errors) include $(SRCBASE)/branding.inc ifeq ($(origin USEBCMUIO), undefined) #if defined(USEBCMUIO) USEBCMUIO=1 #else # undefine USEBCMUIO USEBCMUIO= #endif endif BIN_OPT=retail BIN_DBG=debug BUILDENV_OPT=free BUILDENV_DBG=checked MSVSBUILDENV_OPT=Release MSVSBUILDENV_DBG=Debug OUTDIR_OPT = $(TARGETPATH)/free OUTDIR_DBG = $(TARGETPATH)/checked OUTDIR_FREE = $(OUTDIR_OPT) OUTDIR_CHECKED = $(OUTDIR_DBG) CC = cl AS = ml RC = rc MC = mc LD = link LIBCMD = lib MTL = midl # Ignore any include path and lib paths that the user imports from # the environment. # INCLUDE = ifeq ($(origin TARGETPATH), undefined) TARGETPATH=. endif TARGETPATH := $(subst \,/,$(TARGETPATH)) DDKBUILDENV := $(BUILDENV_$(TTYPE)) MSVSBUILDENV := $(MSVSBUILDENV_$(TTYPE)) BIN := $(BIN_$(TTYPE)) MC_FLAGS = -v ### assume sources as entry point ifndef SRCFILE SRCFILE=./sources endif include $(SRCFILE) SRCRULES=$(SRCFILE).mk ifeq ($(findstring $(TARGETTYPE), "EXE DRIVER LIB DLL DLL16 EXE16 DYNLINK VXD DOSEXE PROGRAM DUMMY"), ) ERRORS += "TARGETTYPE is not defined or not recognized!" ERRORS += "This variable must be defined with a recognized value" ERRORS += "in your sources or GNUsources file." endif # include any branding defined if they exist in the environment ifneq ($(BRAND),) C_DEFINES += -DBRAND="'$(BRAND)'" endif # BRAND SOURCES.IDL := $(filter %.idl,$(SOURCES)) SOURCES.TLB := $(patsubst %.idl,%.tlb,$(SOURCES.IDL)) SOURCES._IC := $(patsubst %.idl,%_i.c,$(SOURCES.IDL)) SOURCES.OBJ := $(SOURCES) SOURCES.OBJ := $(patsubst %.cpp,%.obj,$(SOURCES.OBJ)) SOURCES.OBJ := $(patsubst %.CPP,%.obj,$(SOURCES.OBJ)) SOURCES.OBJ := $(patsubst %.asm,%.obj,$(SOURCES.OBJ)) SOURCES.OBJ := $(patsubst %.ASM,%.obj,$(SOURCES.OBJ)) SOURCES.OBJ := $(patsubst %.c,%.obj,$(SOURCES.OBJ)) SOURCES.OBJ := $(patsubst %.C,%.obj,$(SOURCES.OBJ)) SOURCES.OBJ := $(filter %.obj,$(SOURCES.OBJ)) # SOURCES.OBJ := $(notdir $(SOURCES.OBJ)) SOURCES.OBJ := $(subst /,_,$(SOURCES.OBJ)) SOURCES.RES := $(patsubst %.rc,%.res,$(filter %.rc,$(SOURCES))) SOURCES.MSG := $(patsubst %.mc,%.h,$(filter %.mc,$(SOURCES))) vpath %.rc .:..:../.. ifdef USE_DEPENDENCIES # MAKECMDGOALS is not supported until gnumake version 3.76 so we hack # it by explicitly setting MAKECMDGOALS in the clean rule at the top # of this file. # ifneq ($(MAKECMDGOALS),clean) # BUG -- BUG -- BUG # This code assumes that files are still unique without the extension. # So no foo.c and foo.cpp in the same makefile. SOURCES.D := $(SOURCES) SOURCES.D := $(patsubst %.c,%.d,$(SOURCES.D)) SOURCES.D := $(patsubst %.C,%.d,$(SOURCES.D)) SOURCES.D := $(patsubst %.cpp,%.d,$(SOURCES.D)) SOURCES.D := $(patsubst %.CPP,%.d,$(SOURCES.D)) SOURCES.D := $(filter %.d,$(SOURCES.D)) endif # MAKECMDGOALS != clean endif # ifdef USE_DEPENDENCIES SI_FLAGS = -translate:always,source,package # Target all just depends upon our target file. all :: target post-build-target # The target file depends upon the directory where it will reside. target :: $(OUTDIR_$(TTYPE))/NUL WLCFGDIR ?= $(SRCBASE)/wl/config WLTUNEFILE ?= wltunable_sample.h # Create target directory if necessary. $(OUTDIR_$(TTYPE))/NUL : [ -d "$(@D)" ] || mkdir -p $(@D) ifeq ($(WLCONF_GEN),true) @if [ ! -f "$(@D)/wlconf.h" ]; then \ cp -v $(WLCFGDIR)/$(WLTUNEFILE) $(@D)/wlconf.h; \ elif ! diff -q $(WLCFGDIR)/$(WLTUNEFILE) $(@D)/wlconf.h; then \ cp -v $(WLCFGDIR)/$(WLTUNEFILE) $(@D)/wlconf.h; \ fi endif # # If the sources file specified a NTTARGETFILE0, build that first. # target :: $(NTTARGETFILE0) # calculate some dynamic variables that are useful in build rules. # DEPS_OBJ = $(patsubst %,$(OUTDIR_$(TTYPE))/%,$(SOURCES.OBJ)) DEPS_RES = $(patsubst %,$(OUTDIR_$(TTYPE))/%,$(SOURCES.RES)) DEPS_TLB = $(patsubst %,$(OUTDIR_$(TTYPE))/%,$(SOURCES.TLB)) DEPS_MSG = $(patsubst %,$(OUTDIR_$(TTYPE))/%,$(SOURCES.MSG)) # Finally generate DEPENDENCIES list that are made as explicit dependencies # in src/makefile/<obj-type>.mk file DEPENDENCIES = $(DEPS_TLB) $(DEPS_MSG) $(DEPS_OBJ) $(DEPS_RES) DOS_DEPS= $(shell echo $(filter-out %.tlb %.TLB %.h %.H %.def %.DEF,$^) | sed 's%//\(.\)/%\1:/%g') $(OUTDIR_$(TTYPE))/%.i : %.c @echo "Compiling $(notdir $<) -> $(notdir $@)" $(CC) -E -P $(C$(TTYPE)FLAGS) $(CPPFLAGS) $(F$(TTYPE)) $< >$@ $(OUTDIR_$(TTYPE))/%.i : %.cpp @echo "Compiling $(notdir $<) -> $(notdir $@)" $(CC) -E -P $(C$(TTYPE)FLAGS) $(CPPFLAGS) $(F$(TTYPE)) $< >$@ $(OUTDIR_$(TTYPE))/%.d : %.c @echo "Compiling $(notdir $<) -> $(notdir $@)" $(calculate_dependencies) $(OUTDIR_$(TTYPE))/%.d : %.C @echo "Compiling $(notdir $<) -> $(notdir $@)" $(calculate_dependencies) $(OUTDIR_$(TTYPE))/%.d : %.cpp @echo "Compiling $(notdir $<) -> $(notdir $@)" $(calculate_dependencies) $(OUTDIR_$(TTYPE))/%.d : %.CPP @echo "Compiling $(notdir $<) -> $(notdir $@)" $(calculate_dependencies) $(OUTDIR_$(TTYPE))/%.obj : %.c @echo "Compiling $(notdir $<) -> $(notdir $@)" $(c-obj-command) $(OUTDIR_$(TTYPE))/%.obj : $(OUTDIR_$(TTYPE))/%.c @echo "Compiling $(notdir $<) -> $(OUTDIR_$(TTYPE))/$(notdir $@)" $(c-obj-command) $(OUTDIR_$(TTYPE))/%.obj : %.C @echo "Compiling $(notdir $<) -> $(notdir $@)" $(c-obj-command) $(OUTDIR_$(TTYPE))/%.obj : %.cpp @echo "Compiling $(notdir $<) -> $(notdir $@)" $(cpp-obj-command) $(OUTDIR_$(TTYPE))/%.obj : %.CPP @echo "Compiling $(notdir $<) -> $(notdir $@)" $(cpp-obj-command) ifdef ECLOUD_BUILD_ID $(OUTDIR_$(TTYPE))/%.res : RC = rc endif # ECLOUD_BUILD_ID $(OUTDIR_$(TTYPE))/%.res : %.rc @echo "Compiling $(notdir $<) -> $(notdir $@)" $(rc-res-command) # build rule for IDL files. $(OUTDIR_$(TTYPE))/%.tlb $(OUTDIR_$(TTYPE))/%.h $(OUTDIR_$(TTYPE))/%_i.c : %.idl @echo "Compiling $(notdir $<) -> $(notdir $@)" $(MTL) /I $(MSSDK)/include /nologo /Oicf /out $(OUTDIR_$(TTYPE)) $< # Build rule for message file $(OUTDIR_$(TTYPE))/%.rc $(OUTDIR_$(TTYPE))/%.h : %.mc @echo "Compiling $(notdir $<) -> $(notdir $@)" $(MC) -h $(OUTDIR_$(TTYPE)) -r $(OUTDIR_$(TTYPE)) $(MC_FLAGS) $< $(OUTDIR_$(TTYPE))/%.obj: %.asm @echo "Compiling $(notdir $<) -> $(notdir $@)" $(asm-obj-command) FORCE: clean :: rm -rf $(OUTDIR_CHECKED) $(OUTDIR_FREE) $(SRCRULES) ifeq ("$(TARGETTYPE)", "DRIVER") ifeq ("$(DRIVERTYPE)", "WDM") include $(SRCBASE)/makefiles/wdm.mk else ifeq ("$(DRIVERTYPE)", "WDM2600") include $(SRCBASE)/makefiles/wdm2600.mk else include $(SRCBASE)/makefiles/driver.mk endif endif endif ifeq ("$(TARGETTYPE)", "VXD") include $(SRCBASE)/makefiles/vxd.mk endif ifneq ($(findstring x$(TARGETTYPE)x, "xDLLx xDYNLINKx"), ) ifneq ($(findstring x$(HOSTOS)x, "xwincex"), ) include $(SRCBASE)/makefiles/dllce.mk else include $(SRCBASE)/makefiles/dll.mk endif endif ifneq ($(findstring $(TARGETTYPE)x, "DLL16x"), ) include $(SRCBASE)/makefiles/dll16.mk endif ifneq ($(findstring $(TARGETTYPE)x, "EXE16x"), ) include $(SRCBASE)/makefiles/exe16.mk endif ifneq ($(findstring $(TARGETTYPE), "LIB"), ) ifneq ($(findstring x$(HOSTOS)x, "xwincex"), ) include $(SRCBASE)/makefiles/libce.mk else include $(SRCBASE)/makefiles/lib.mk endif endif ifneq ($(findstring $(TARGETTYPE), "xEXEx xPROGRAMx"), ) ifneq ($(findstring x$(HOSTOS)x, "xwincex"), ) include $(SRCBASE)/makefiles/exece.mk else include $(SRCBASE)/makefiles/exe.mk endif endif ifneq ($(findstring x$(TARGETTYPE)x, "xDOSEXEx"), ) include $(SRCBASE)/makefiles/dosexe.mk endif ifneq ($(findstring $(TARGETTYPE), "DUMMY"), ) include $(SRCBASE)/makefiles/dummy.mk endif # Set make variables that help find things like DDK's, SDK's, etc, # depending upon the requirements expressed in the individual # makefile(s). include $(SRCBASE)/makefiles/env.mk # # Add some rules so that our target depends on any libraries we are going # to link against. # #target :: $(LIBS) target :: $(OUTDIR_$(TTYPE))/$(TARGET) ifneq ($(wildcard ./makefile.inc), ) include .\makefile.inc endif # # If the sources file specified a NTTARGETFILES, build that last. # target :: $(NTTARGETFILES) target :: @echo Finished compiling $@ @echo "" post-build-target :: release: all .PHONY: all target release clean $(OUTDIR_$(TTYPE))/.depends ifneq ($(wildcard $(SRCRULES)), ) include $(SRCRULES) endif # only try to do dependency checking if we have some dependencies to check! # # It seems counter-intiutive but it looks like the # include dependencies are evaluated in reverse order from their # appearance in the makefile. Therefore we include the NUL file from # the object directory *after* we include the dependency files # themselves. This results in the object directory getting created # before we build any of the dependency files. # ifneq ($(strip $(SOURCES.D)),) include $(patsubst %,$(OUTDIR_$(TTYPE))/%,$(SOURCES.D)) include $(OUTDIR_$(TTYPE))/NUL endif define calculate_dependencies @ echo making $@ $(SHELL) -ec 'gcc -MM -w -D_M_IX86=500 $(C_DEFINES) $(CPPFLAGS) $< \ | sed '\''s?$*\.o[ :]*?$@ &?g'\'' >$@' endef # OTHER_SOURCES_PROCESSED removes recursive build of OTHER_SOURCES, when that # switch is set from cmd line ifdef OTHER_SOURCES ifndef OTHER_SOURCES_PROCESSED all clean :: $(OTHER_SOURCES) @echo "Go through OTHER_SOURCES: $(OTHER_SOURCES)" $(foreach SRCFILE,$(OTHER_SOURCES),$(MAKE) SRCFILE=$(SRCFILE) TTYPE=$(TTYPE) OTHER_SOURCES_PROCESSED=true $@; ) endif # OTHER_SOURCES_PROCESSED endif # OTHER_SOURCES vpath %.Lib $(LIBVPATH) vpath %.LIB $(LIBVPATH) vpath %.lib $(LIBVPATH) export PATH:=$(subst $(space),:,$(strip $(NEWPATH))):$(PATH) foo: @echo _SDKROOT=$(_SDKROOT) @echo NEWPATH=$(NEWPATH) endif ### end of ifeq ($(origin TTYPE), undefined) printenv: env ifdef WARNING define print-warnings @echo "Warning **** Warning **** Warning **** Warning **** Warning" @for warn in $(WARNING) ; do echo $$warn; done @echo "Continuing..." endef endif # WARNING ifdef ERRORS define print-errors @echo "Error **** Error **** Error **** Error **** Error" @for err in $(ERRORS) ; do echo $$err; done @echo "Exiting makefile." @exit 1 endef endif # ERRORS