blob: 0d35c56fd32f3e2f531968a19d01d8bd5fef87d8 [file] [log] [blame]
Benny Prijonoeb4cf912007-04-09 17:13:10 +00001ifeq ($(LIBDIR),)
Benny Prijonodd859a62005-11-01 16:42:51 +00002LIBDIR = ../lib
Benny Prijonoeb4cf912007-04-09 17:13:10 +00003endif
4ifeq ($(BINDIR),)
Benny Prijonodd859a62005-11-01 16:42:51 +00005BINDIR = ../bin
Benny Prijonoeb4cf912007-04-09 17:13:10 +00006endif
Benny Prijonodd859a62005-11-01 16:42:51 +00007
8#
9# The full path of output lib file (e.g. ../lib/libapp.a).
10#
11LIB = $($(APP)_LIB)
12
13#
Benny Prijono28d3c562012-03-30 07:10:13 +000014# The full path of output lib file (e.g. ../lib/libapp.a).
15#
16SHLIB = $($(APP)_SHLIB)
17
18#
Benny Prijonodd859a62005-11-01 16:42:51 +000019# The full path of output executable file (e.g. ../bin/app.exe).
20#
21EXE = $($(APP)_EXE)
22
23#
24# Source directory
25#
26SRCDIR = $($(APP)_SRCDIR)
27
28#
29# Output directory for object files (i.e. output/target)
30#
Benny Prijono0382cd82006-05-04 08:43:02 +000031OBJDIR = output/$(app)-$(TARGET_NAME)
Benny Prijonodd859a62005-11-01 16:42:51 +000032
33ifeq ($(OS_NAME),linux-kernel)
34export $(APP)_CFLAGS += -DKBUILD_MODNAME=$(app) -DKBUILD_BASENAME=$(app)
35endif
36
37
38#
39# OBJS is ./output/target/file.o
40#
41OBJS = $(foreach file, $($(APP)_OBJS), $(OBJDIR)/$(file))
42OBJDIRS := $(sort $(dir $(OBJS)))
43
44#
45# FULL_SRCS is ../src/app/file1.c ../src/app/file1.S
46#
Sauw Ming6e6c2152010-12-14 13:03:10 +000047FULL_SRCS = $(foreach file, $($(APP)_OBJS), $(SRCDIR)/$(basename $(file)).m $(SRCDIR)/$(basename $(file)).c $(SRCDIR)/$(basename $(file)).cpp $(SRCDIR)/$(basename $(file)).S)
Benny Prijonodd859a62005-11-01 16:42:51 +000048
49#
50# When generating dependency (gcc -MM), ideally we use only either
51# CFLAGS or CXXFLAGS (not both). But I just couldn't make if/ifeq to work.
52#
53DEPFLAGS = $($(APP)_CXXFLAGS) $($(APP)_CFLAGS)
54
55# Dependency file
Benny Prijono0382cd82006-05-04 08:43:02 +000056DEP_FILE := .$(app)-$(TARGET_NAME).depend
Benny Prijonodd859a62005-11-01 16:42:51 +000057
58
59print_common:
60 @echo "###"
61 @echo "### DUMPING MAKE VARIABLES (I WON'T DO ANYTHING ELSE):"
62 @echo "###"
63 @echo APP=$(APP)
64 @echo OBJDIR=$(OBJDIR)
65 @echo OBJDIRS=$(OBJDIRS)
66 @echo OBJS=$(OBJS)
67 @echo SRCDIR=$(SRCDIR)
68 @echo FULL_SRCS=$(FULL_SRCS)
69 @echo $(APP)_CFLAGS=$($(APP)_CFLAGS)
70 @echo $(APP)_CXXFLAGS=$($(APP)_CXXFLAGS)
71 @echo $(APP)_LDFLAGS=$($(APP)_LDFLAGS)
72 @echo DEPFLAGS=$(DEPFLAGS)
Benny Prijono8ec5eae2010-05-12 10:59:20 +000073 @echo CC=$(CC)
74 @echo AR=$(AR)
75 @echo RANLIB=$(RANLIB)
Benny Prijonodd859a62005-11-01 16:42:51 +000076
77print_bin: print_common
78 @echo EXE=$(EXE)
79 @echo BINDIR=$(BINDIR)
80
81print_lib: print_common
82 @echo LIB=$(LIB)
83 @echo LIBDIR=$(LIBDIR)
84
Benny Prijonob1c62042008-07-29 11:42:20 +000085$(LIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
86 if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi
Benny Prijonoeb4cf912007-04-09 17:13:10 +000087 $(AR) $(LIB) $(OBJS)
Benny Prijonodd859a62005-11-01 16:42:51 +000088 $(RANLIB) $(LIB)
89
Benny Prijono28d3c562012-03-30 07:10:13 +000090$(SHLIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
91 if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi
92 $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(SHLIB)) \
93 $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS)
94
Benny Prijonob1c62042008-07-29 11:42:20 +000095$(EXE): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
96 if test ! -d $(BINDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)),$(HOST_MKDIR)); fi
Benny Prijonodd859a62005-11-01 16:42:51 +000097 $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(EXE)) \
98 $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS)
99
100$(OBJDIR)/$(app).o: $(OBJDIRS) $(OBJS)
101 $(CROSS_COMPILE)ld -r -o $@ $(OBJS)
102
103$(OBJDIR)/$(app).ko: $(OBJDIR)/$(app).o
104 @echo Creating kbuild Makefile...
105 @echo "# Our module name:" > $(OBJDIR)/Makefile
106 @echo 'obj-m += $(app).o' >> $(OBJDIR)/Makefile
107 @echo >> $(OBJDIR)/Makefile
108 @echo "# Object members:" >> $(OBJDIR)/Makefile
109 @echo -n '$(app)-objs += ' >> $(OBJDIR)/Makefile
110 @for file in $($(APP)_OBJS); do \
111 echo -n "$$file " >> $(OBJDIR)/Makefile; \
112 done
113 @echo >> $(OBJDIR)/Makefile
114 @echo >> $(OBJDIR)/Makefile
115 @echo "# Prevent .o files to be built by kbuild:" >> $(OBJDIR)/Makefile
116 @for file in $($(APP)_OBJS); do \
117 echo ".PHONY: `pwd`/$(OBJDIR)/$$file" >> $(OBJDIR)/Makefile; \
118 done
119 @echo >> $(OBJDIR)/Makefile
120 @echo all: >> $(OBJDIR)/Makefile
121 @echo -e "\tmake -C $(KERNEL_DIR) M=`pwd`/$(OBJDIR) modules $(KERNEL_ARCH)" >> $(OBJDIR)/Makefile
122 @echo Invoking kbuild...
123 make -C $(OBJDIR)
124
125../lib/$(app).ko: $(LIB) $(OBJDIR)/$(app).ko
126 cp $(OBJDIR)/$(app).ko ../lib
127
Sauw Ming6e6c2152010-12-14 13:03:10 +0000128$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.m
129 $(CC) $($(APP)_CFLAGS) \
130 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
131 $(subst /,$(HOST_PSEP),$<)
132
Benny Prijonodd859a62005-11-01 16:42:51 +0000133$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.c
134 $(CC) $($(APP)_CFLAGS) \
135 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
136 $(subst /,$(HOST_PSEP),$<)
137
138$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.S
139 $(CC) $($(APP)_CFLAGS) \
140 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
141 $(subst /,$(HOST_PSEP),$<)
142
143$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cpp
144 $(CC) $($(APP)_CXXFLAGS) \
145 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
146 $(subst /,$(HOST_PSEP),$<)
147
148$(OBJDIRS):
149 $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR))
150
151$(LIBDIR):
152 $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR))
153
154$(BINDIR):
155 $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)),$(HOST_MKDIR))
156
157clean:
158 $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)/*),$(HOST_RMR))
159 $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)),$(HOST_RMDIR))
160ifeq ($(OS_NAME),linux-kernel)
161 rm -f ../lib/$(app).o
162endif
163
Benny Prijono7d433ec2006-02-03 15:23:28 +0000164gcov-report:
165 for file in $(FULL_SRCS); do \
166 gcov $$file -n -o $(OBJDIR); \
167 done
168
Benny Prijonodd859a62005-11-01 16:42:51 +0000169realclean: clean
170 $(subst @@,$(subst /,$(HOST_PSEP),$(LIB)) $(subst /,$(HOST_PSEP),$(EXE)),$(HOST_RM))
171 $(subst @@,$(DEP_FILE),$(HOST_RM))
172ifeq ($(OS_NAME),linux-kernel)
173 rm -f ../lib/$(app).ko
174endif
175
176depend:
177 $(subst @@,$(DEP_FILE),$(HOST_RM))
178 for F in $(FULL_SRCS); do \
179 if test -f $$F; then \
Benny Prijono4fca27b2006-03-23 18:04:15 +0000180 echo "$(OBJDIR)/" | tr -d '\n' >> $(DEP_FILE); \
Benny Prijono0c59fea2006-05-27 13:11:32 +0000181 if $(CC) -M $(DEPFLAGS) $$F | sed '/^#/d' >> $(DEP_FILE); then \
Benny Prijonodd859a62005-11-01 16:42:51 +0000182 true; \
183 else \
184 echo 'err:' >> $(DEP_FILE); \
185 rm -f $(DEP_FILE); \
186 exit 1; \
187 fi; \
188 fi; \
189 done;
190
191dep: depend
192
193-include $(DEP_FILE)
194