1ifeq ($(LIBDIR),) 2LIBDIR = ../lib 3endif 4ifeq ($(BINDIR),) 5BINDIR = ../bin 6endif 7 8# 9# The name(s) of output lib file(s) (e.g. libapp.a). 10# 11LIB := $($(APP)_LIB) 12SHLIB = $($(APP)_SHLIB) 13SONAME = $($(APP)_SONAME) 14 15ifeq ($(SHLIB_SUFFIX),so) 16SHLIB_OPT := -shared -Wl,-soname,$(SHLIB) 17else ifeq ($(SHLIB_SUFFIX),dylib) 18SHLIB_OPT := -dynamiclib -undefined dynamic_lookup -flat_namespace 19else ifeq ($(SHLIB_SUFFIX),dll) 20SHLIB_OPT := -shared -Wl,-soname,$(SHLIB) 21else 22SHLIB_OPT := 23endif 24 25# 26# The name of output executable file (e.g. app.exe). 27# 28EXE = $($(APP)_EXE) 29 30# 31# Source directory 32# 33SRCDIR = $($(APP)_SRCDIR) 34 35# 36# Output directory for object files (i.e. output/target) 37# 38OBJDIR = output/$(app)-$(TARGET_NAME) 39 40ifeq ($(OS_NAME),linux-kernel) 41export $(APP)_CFLAGS += -DKBUILD_MODNAME=$(app) -DKBUILD_BASENAME=$(app) 42endif 43 44 45# 46# OBJS is ./output/target/file.o 47# 48OBJS = $(foreach file, $($(APP)_OBJS), $(OBJDIR)/$(file)) 49OBJDIRS := $(sort $(dir $(OBJS))) 50 51# 52# FULL_SRCS is ../src/app/file1.c ../src/app/file1.S 53# 54FULL_SRCS = $(foreach file, $($(APP)_OBJS), $(SRCDIR)/$(basename $(file)).m $(SRCDIR)/$(basename $(file)).c $(SRCDIR)/$(basename $(file)).cpp $(SRCDIR)/$(basename $(file)).cc $(SRCDIR)/$(basename $(file)).S) 55 56# 57# When generating dependency (gcc -MM), ideally we use only either 58# CFLAGS or CXXFLAGS (not both). But I just couldn't make if/ifeq to work. 59# 60#DEPFLAGS = $($(APP)_CXXFLAGS) $($(APP)_CFLAGS) 61DEPCFLAGS = $($(APP)_CFLAGS) 62DEPCXXFLAGS = $($(APP)_CXXFLAGS) 63 64# Dependency file 65DEP_FILE := .$(app)-$(TARGET_NAME).depend 66 67 68print_common: 69 @echo "###" 70 @echo "### DUMPING MAKE VARIABLES (I WON'T DO ANYTHING ELSE):" 71 @echo "###" 72 @echo APP=$(APP) 73 @echo OBJDIR=$(OBJDIR) 74 @echo OBJDIRS=$(OBJDIRS) 75 @echo OBJS=$(OBJS) 76 @echo SRCDIR=$(SRCDIR) 77 @echo FULL_SRCS=$(FULL_SRCS) 78 @echo $(APP)_CFLAGS=$($(APP)_CFLAGS) 79 @echo $(APP)_CXXFLAGS=$($(APP)_CXXFLAGS) 80 @echo $(APP)_LDFLAGS=$($(APP)_LDFLAGS) 81# @echo DEPFLAGS=$(DEPFLAGS) 82 @echo CC=$(CC) 83 @echo AR=$(AR) 84 @echo AR_FLAGS=$(AR_FLAGS) 85 @echo RANLIB=$(RANLIB) 86 87print_bin: print_common 88 @echo EXE=$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)) 89 @echo BINDIR=$(BINDIR) 90 91print_lib: print_common 92ifneq ($(LIB),) 93 @echo LIB=$(subst /,$(HOST_PSEP),$(LIBDIR)/$(LIB)) 94endif 95ifneq ($(SHLIB),) 96 @echo SHLIB=$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB)) 97endif 98ifneq ($(SONAME),) 99 @echo SONAME=$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SONAME)) 100endif 101 @echo LIBDIR=$(LIBDIR) 102 103ifneq ($(LIB),) 104$(subst /,$(HOST_PSEP),$(LIBDIR)/$(LIB)): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) 105 if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi 106 $(AR) $(AR_FLAGS) $@ $(OBJS) 107 $(RANLIB) $@ 108endif 109 110ifneq ($(SHLIB),) 111$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB)): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) 112 if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi 113 $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$@) \ 114 $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS) $(SHLIB_OPT) 115endif 116 117ifneq ($(SONAME),) 118$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SONAME)): $(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB)) 119 ln -sf $(SHLIB) $@ 120endif 121 122ifneq ($(EXE),) 123$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) 124 if test ! -d $(BINDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)),$(HOST_MKDIR)); fi 125 $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)) \ 126 $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS) 127endif 128 129$(OBJDIR)/$(app).o: $(OBJDIRS) $(OBJS) 130 $(CROSS_COMPILE)ld -r -o $@ $(OBJS) 131 132$(OBJDIR)/$(app).ko: $(OBJDIR)/$(app).o | $(OBJDIRS) 133 @echo Creating kbuild Makefile... 134 @echo "# Our module name:" > $(OBJDIR)/Makefile 135 @echo 'obj-m += $(app).o' >> $(OBJDIR)/Makefile 136 @echo >> $(OBJDIR)/Makefile 137 @echo "# Object members:" >> $(OBJDIR)/Makefile 138 @echo -n '$(app)-objs += ' >> $(OBJDIR)/Makefile 139 @for file in $($(APP)_OBJS); do \ 140 echo -n "$$file " >> $(OBJDIR)/Makefile; \ 141 done 142 @echo >> $(OBJDIR)/Makefile 143 @echo >> $(OBJDIR)/Makefile 144 @echo "# Prevent .o files to be built by kbuild:" >> $(OBJDIR)/Makefile 145 @for file in $($(APP)_OBJS); do \ 146 echo ".PHONY: `pwd`/$(OBJDIR)/$$file" >> $(OBJDIR)/Makefile; \ 147 done 148 @echo >> $(OBJDIR)/Makefile 149 @echo all: >> $(OBJDIR)/Makefile 150 @echo -e "\tmake -C $(KERNEL_DIR) M=`pwd`/$(OBJDIR) modules $(KERNEL_ARCH)" >> $(OBJDIR)/Makefile 151 @echo Invoking kbuild... 152 make -C $(OBJDIR) 153 154../lib/$(app).ko: $(LIB) $(OBJDIR)/$(app).ko 155 cp $(OBJDIR)/$(app).ko ../lib 156 157$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.m | $(OBJDIRS) 158 $(CC) $($(APP)_CFLAGS) \ 159 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \ 160 $(subst /,$(HOST_PSEP),$<) 161 162$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.c | $(OBJDIRS) 163 $(CC) $($(APP)_CFLAGS) \ 164 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \ 165 $(subst /,$(HOST_PSEP),$<) 166 167$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.S | $(OBJDIRS) 168 $(CC) $($(APP)_CFLAGS) \ 169 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \ 170 $(subst /,$(HOST_PSEP),$<) 171 172$(OBJDIR)/dshowclasses.o: $(SRCDIR)/dshowclasses.cpp | $(OBJDIRS) 173 $(CXX) $($(APP)_CXXFLAGS) -I$(SRCDIR)/../../../third_party/BaseClasses -fpermissive \ 174 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \ 175 $(subst /,$(HOST_PSEP),$<) 176 177$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cpp | $(OBJDIRS) 178 $(CXX) $($(APP)_CXXFLAGS) \ 179 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \ 180 $(subst /,$(HOST_PSEP),$<) 181 182$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cc | $(OBJDIRS) 183 $(CXX) $($(APP)_CXXFLAGS) \ 184 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \ 185 $(subst /,$(HOST_PSEP),$<) 186 187$(OBJDIRS): 188 $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR)) 189 190$(LIBDIR): 191 $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR)) 192 193$(BINDIR): 194 $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR)) 195 196clean: 197 $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)/*),$(HOST_RMR)) 198 $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)),$(HOST_RMDIR)) 199ifeq ($(OS_NAME),linux-kernel) 200 rm -f ../lib/$(app).o 201endif 202 203gcov-report: 204 for file in $(FULL_SRCS); do \ 205 gcov $$file -n -o $(OBJDIR); \ 206 done 207 208realclean: clean 209ifneq ($(LIB),) 210 $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(LIB)),$(HOST_RM)) 211endif 212ifneq ($(SHLIB),) 213 $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB)),$(HOST_RM)) 214endif 215ifneq ($(SONAME),) 216 $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SONAME)),$(HOST_RM)) 217endif 218ifneq ($(EXE),) 219 $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)),$(HOST_RM)) 220endif 221 $(subst @@,$(DEP_FILE),$(HOST_RM)) 222ifeq ($(OS_NAME),linux-kernel) 223 rm -f ../lib/$(app).ko 224endif 225 226depend: 227 $(subst @@,$(DEP_FILE),$(HOST_RM)) 228 for F in $(FULL_SRCS); do \ 229 if test -f $$F; then \ 230 echo "$(OBJDIR)/" | tr -d '\n' >> $(DEP_FILE); \ 231 if echo $$F | grep -q .cpp$$; then \ 232 dep="$(CC) -M $(DEPCXXFLAGS) $$F"; \ 233 else \ 234 dep="$(CC) -M $(DEPCFLAGS) $$F"; \ 235 fi; \ 236 if eval $$dep | sed '/^#/d' >> $(DEP_FILE); then \ 237 true; \ 238 else \ 239 echo 'err:' >> $(DEP_FILE); \ 240 rm -f $(DEP_FILE); \ 241 exit 1; \ 242 fi; \ 243 fi; \ 244 done; 245 246dep: depend 247 248-include $(DEP_FILE) 249 250