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