blob: a939db47f0360b9d95efc37107749e9cb1de9973 [file] [log] [blame]
Tristan Matthews0a329cc2013-07-17 13:20:14 -04001ifeq ($(LIBDIR),)
2LIBDIR = ../lib
3endif
4ifeq ($(BINDIR),)
5BINDIR = ../bin
6endif
7
8#
Alexandre Lision8af73cb2013-12-10 14:11:20 -05009# The name(s) of output lib file(s) (e.g. libapp.a).
Tristan Matthews0a329cc2013-07-17 13:20:14 -040010#
Alexandre Lision8af73cb2013-12-10 14:11:20 -050011LIB := $($(APP)_LIB)
Tristan Matthews0a329cc2013-07-17 13:20:14 -040012SHLIB = $($(APP)_SHLIB)
Alexandre Lision8af73cb2013-12-10 14:11:20 -050013SONAME = $($(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
20SHLIB_OPT :=
21endif
Tristan Matthews0a329cc2013-07-17 13:20:14 -040022
23#
Alexandre Lision8af73cb2013-12-10 14:11:20 -050024# The name of output executable file (e.g. app.exe).
Tristan Matthews0a329cc2013-07-17 13:20:14 -040025#
26EXE = $($(APP)_EXE)
27
28#
29# Source directory
30#
31SRCDIR = $($(APP)_SRCDIR)
32
33#
34# Output directory for object files (i.e. output/target)
35#
36OBJDIR = output/$(app)-$(TARGET_NAME)
37
38ifeq ($(OS_NAME),linux-kernel)
39export $(APP)_CFLAGS += -DKBUILD_MODNAME=$(app) -DKBUILD_BASENAME=$(app)
40endif
41
42
43#
44# OBJS is ./output/target/file.o
45#
46OBJS = $(foreach file, $($(APP)_OBJS), $(OBJDIR)/$(file))
47OBJDIRS := $(sort $(dir $(OBJS)))
48
49#
50# FULL_SRCS is ../src/app/file1.c ../src/app/file1.S
51#
52FULL_SRCS = $(foreach file, $($(APP)_OBJS), $(SRCDIR)/$(basename $(file)).m $(SRCDIR)/$(basename $(file)).c $(SRCDIR)/$(basename $(file)).cpp $(SRCDIR)/$(basename $(file)).S)
53
54#
55# When generating dependency (gcc -MM), ideally we use only either
56# CFLAGS or CXXFLAGS (not both). But I just couldn't make if/ifeq to work.
57#
58DEPFLAGS = $($(APP)_CXXFLAGS) $($(APP)_CFLAGS)
59
60# Dependency file
61DEP_FILE := .$(app)-$(TARGET_NAME).depend
62
63
64print_common:
65 @echo "###"
66 @echo "### DUMPING MAKE VARIABLES (I WON'T DO ANYTHING ELSE):"
67 @echo "###"
68 @echo APP=$(APP)
69 @echo OBJDIR=$(OBJDIR)
70 @echo OBJDIRS=$(OBJDIRS)
71 @echo OBJS=$(OBJS)
72 @echo SRCDIR=$(SRCDIR)
73 @echo FULL_SRCS=$(FULL_SRCS)
74 @echo $(APP)_CFLAGS=$($(APP)_CFLAGS)
75 @echo $(APP)_CXXFLAGS=$($(APP)_CXXFLAGS)
76 @echo $(APP)_LDFLAGS=$($(APP)_LDFLAGS)
77 @echo DEPFLAGS=$(DEPFLAGS)
78 @echo CC=$(CC)
79 @echo AR=$(AR)
Alexandre Lision8af73cb2013-12-10 14:11:20 -050080 @echo AR_FLAGS=$(AR_FLAGS)
Tristan Matthews0a329cc2013-07-17 13:20:14 -040081 @echo RANLIB=$(RANLIB)
82
83print_bin: print_common
Alexandre Lision8af73cb2013-12-10 14:11:20 -050084 @echo EXE=$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE))
Tristan Matthews0a329cc2013-07-17 13:20:14 -040085 @echo BINDIR=$(BINDIR)
Alexandre Lision8af73cb2013-12-10 14:11:20 -050086
Tristan Matthews0a329cc2013-07-17 13:20:14 -040087print_lib: print_common
Alexandre Lision8af73cb2013-12-10 14:11:20 -050088ifneq ($(LIB),)
89 @echo LIB=$(subst /,$(HOST_PSEP),$(LIBDIR)/$(LIB))
90endif
91ifneq ($(SHLIB),)
92 @echo SHLIB=$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB))
93endif
94ifneq ($(SONAME),)
95 @echo SONAME=$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SONAME))
96endif
Tristan Matthews0a329cc2013-07-17 13:20:14 -040097 @echo LIBDIR=$(LIBDIR)
98
Alexandre Lision8af73cb2013-12-10 14:11:20 -050099ifneq ($(LIB),)
100$(subst /,$(HOST_PSEP),$(LIBDIR)/$(LIB)): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400101 if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500102 $(AR) $(AR_FLAGS) $@ $(OBJS)
103 $(RANLIB) $@
104endif
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400105
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500106ifneq ($(SHLIB),)
107$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB)): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400108 if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500109 $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$@) \
110 $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS) $(SHLIB_OPT)
111endif
112
113ifneq ($(SONAME),)
114$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SONAME)): $(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB))
115 ln -sf $(SHLIB) $@
116endif
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400117
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500118ifneq ($(EXE),)
119$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400120 if test ! -d $(BINDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)),$(HOST_MKDIR)); fi
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500121 $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)) \
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400122 $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS)
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500123endif
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400124
125$(OBJDIR)/$(app).o: $(OBJDIRS) $(OBJS)
126 $(CROSS_COMPILE)ld -r -o $@ $(OBJS)
127
128$(OBJDIR)/$(app).ko: $(OBJDIR)/$(app).o
129 @echo Creating kbuild Makefile...
130 @echo "# Our module name:" > $(OBJDIR)/Makefile
131 @echo 'obj-m += $(app).o' >> $(OBJDIR)/Makefile
132 @echo >> $(OBJDIR)/Makefile
133 @echo "# Object members:" >> $(OBJDIR)/Makefile
134 @echo -n '$(app)-objs += ' >> $(OBJDIR)/Makefile
135 @for file in $($(APP)_OBJS); do \
136 echo -n "$$file " >> $(OBJDIR)/Makefile; \
137 done
138 @echo >> $(OBJDIR)/Makefile
139 @echo >> $(OBJDIR)/Makefile
140 @echo "# Prevent .o files to be built by kbuild:" >> $(OBJDIR)/Makefile
141 @for file in $($(APP)_OBJS); do \
142 echo ".PHONY: `pwd`/$(OBJDIR)/$$file" >> $(OBJDIR)/Makefile; \
143 done
144 @echo >> $(OBJDIR)/Makefile
145 @echo all: >> $(OBJDIR)/Makefile
146 @echo -e "\tmake -C $(KERNEL_DIR) M=`pwd`/$(OBJDIR) modules $(KERNEL_ARCH)" >> $(OBJDIR)/Makefile
147 @echo Invoking kbuild...
148 make -C $(OBJDIR)
149
150../lib/$(app).ko: $(LIB) $(OBJDIR)/$(app).ko
151 cp $(OBJDIR)/$(app).ko ../lib
152
153$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.m
154 $(CC) $($(APP)_CFLAGS) \
155 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
156 $(subst /,$(HOST_PSEP),$<)
157
158$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.c
159 $(CC) $($(APP)_CFLAGS) \
160 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
161 $(subst /,$(HOST_PSEP),$<)
162
163$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.S
164 $(CC) $($(APP)_CFLAGS) \
165 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
166 $(subst /,$(HOST_PSEP),$<)
167
168$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cpp
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500169 $(CXX) $($(APP)_CXXFLAGS) \
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400170 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
171 $(subst /,$(HOST_PSEP),$<)
172
173$(OBJDIRS):
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500174 $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR))
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400175
176$(LIBDIR):
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500177 $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR))
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400178
179$(BINDIR):
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500180 $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR))
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400181
182clean:
183 $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)/*),$(HOST_RMR))
184 $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)),$(HOST_RMDIR))
185ifeq ($(OS_NAME),linux-kernel)
186 rm -f ../lib/$(app).o
187endif
188
189gcov-report:
190 for file in $(FULL_SRCS); do \
191 gcov $$file -n -o $(OBJDIR); \
192 done
193
194realclean: clean
Alexandre Lision8af73cb2013-12-10 14:11:20 -0500195ifneq ($(LIB),)
196 $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(LIB)),$(HOST_RM))
197endif
198ifneq ($(SHLIB),)
199 $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SHLIB)),$(HOST_RM))
200endif
201ifneq ($(SONAME),)
202 $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)/$(SONAME)),$(HOST_RM))
203endif
204ifneq ($(EXE),)
205 $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)/$(EXE)),$(HOST_RM))
206endif
Tristan Matthews0a329cc2013-07-17 13:20:14 -0400207 $(subst @@,$(DEP_FILE),$(HOST_RM))
208ifeq ($(OS_NAME),linux-kernel)
209 rm -f ../lib/$(app).ko
210endif
211
212depend:
213 $(subst @@,$(DEP_FILE),$(HOST_RM))
214 for F in $(FULL_SRCS); do \
215 if test -f $$F; then \
216 echo "$(OBJDIR)/" | tr -d '\n' >> $(DEP_FILE); \
217 if $(CC) -M $(DEPFLAGS) $$F | sed '/^#/d' >> $(DEP_FILE); then \
218 true; \
219 else \
220 echo 'err:' >> $(DEP_FILE); \
221 rm -f $(DEP_FILE); \
222 exit 1; \
223 fi; \
224 fi; \
225 done;
226
227dep: depend
228
229-include $(DEP_FILE)
230