blob: 513ea6c21b9b4c703b41d1b66e307838727c6a54 [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#
14# The full path of output executable file (e.g. ../bin/app.exe).
15#
16EXE = $($(APP)_EXE)
17
18#
19# Source directory
20#
21SRCDIR = $($(APP)_SRCDIR)
22
23#
24# Output directory for object files (i.e. output/target)
25#
Benny Prijono0382cd82006-05-04 08:43:02 +000026OBJDIR = output/$(app)-$(TARGET_NAME)
Benny Prijonodd859a62005-11-01 16:42:51 +000027
28ifeq ($(OS_NAME),linux-kernel)
29export $(APP)_CFLAGS += -DKBUILD_MODNAME=$(app) -DKBUILD_BASENAME=$(app)
30endif
31
32
33#
34# OBJS is ./output/target/file.o
35#
36OBJS = $(foreach file, $($(APP)_OBJS), $(OBJDIR)/$(file))
37OBJDIRS := $(sort $(dir $(OBJS)))
38
39#
40# FULL_SRCS is ../src/app/file1.c ../src/app/file1.S
41#
42FULL_SRCS = $(foreach file, $($(APP)_OBJS), $(SRCDIR)/$(basename $(file)).c $(SRCDIR)/$(basename $(file)).cpp $(SRCDIR)/$(basename $(file)).S)
43
44#
45# When generating dependency (gcc -MM), ideally we use only either
46# CFLAGS or CXXFLAGS (not both). But I just couldn't make if/ifeq to work.
47#
48DEPFLAGS = $($(APP)_CXXFLAGS) $($(APP)_CFLAGS)
49
50# Dependency file
Benny Prijono0382cd82006-05-04 08:43:02 +000051DEP_FILE := .$(app)-$(TARGET_NAME).depend
Benny Prijonodd859a62005-11-01 16:42:51 +000052
53
54print_common:
55 @echo "###"
56 @echo "### DUMPING MAKE VARIABLES (I WON'T DO ANYTHING ELSE):"
57 @echo "###"
58 @echo APP=$(APP)
59 @echo OBJDIR=$(OBJDIR)
60 @echo OBJDIRS=$(OBJDIRS)
61 @echo OBJS=$(OBJS)
62 @echo SRCDIR=$(SRCDIR)
63 @echo FULL_SRCS=$(FULL_SRCS)
64 @echo $(APP)_CFLAGS=$($(APP)_CFLAGS)
65 @echo $(APP)_CXXFLAGS=$($(APP)_CXXFLAGS)
66 @echo $(APP)_LDFLAGS=$($(APP)_LDFLAGS)
67 @echo DEPFLAGS=$(DEPFLAGS)
68
69print_bin: print_common
70 @echo EXE=$(EXE)
71 @echo BINDIR=$(BINDIR)
72
73print_lib: print_common
74 @echo LIB=$(LIB)
75 @echo LIBDIR=$(LIBDIR)
76
77$(LIB): $(LIBDIR) $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
Benny Prijonoeb4cf912007-04-09 17:13:10 +000078 $(AR) $(LIB) $(OBJS)
Benny Prijonodd859a62005-11-01 16:42:51 +000079 $(RANLIB) $(LIB)
80
81$(EXE): $(BINDIR) $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
82 $(LD) $(LDOUT)$(subst /,$(HOST_PSEP),$(EXE)) \
83 $(subst /,$(HOST_PSEP),$(OBJS)) $($(APP)_LDFLAGS)
84
85$(OBJDIR)/$(app).o: $(OBJDIRS) $(OBJS)
86 $(CROSS_COMPILE)ld -r -o $@ $(OBJS)
87
88$(OBJDIR)/$(app).ko: $(OBJDIR)/$(app).o
89 @echo Creating kbuild Makefile...
90 @echo "# Our module name:" > $(OBJDIR)/Makefile
91 @echo 'obj-m += $(app).o' >> $(OBJDIR)/Makefile
92 @echo >> $(OBJDIR)/Makefile
93 @echo "# Object members:" >> $(OBJDIR)/Makefile
94 @echo -n '$(app)-objs += ' >> $(OBJDIR)/Makefile
95 @for file in $($(APP)_OBJS); do \
96 echo -n "$$file " >> $(OBJDIR)/Makefile; \
97 done
98 @echo >> $(OBJDIR)/Makefile
99 @echo >> $(OBJDIR)/Makefile
100 @echo "# Prevent .o files to be built by kbuild:" >> $(OBJDIR)/Makefile
101 @for file in $($(APP)_OBJS); do \
102 echo ".PHONY: `pwd`/$(OBJDIR)/$$file" >> $(OBJDIR)/Makefile; \
103 done
104 @echo >> $(OBJDIR)/Makefile
105 @echo all: >> $(OBJDIR)/Makefile
106 @echo -e "\tmake -C $(KERNEL_DIR) M=`pwd`/$(OBJDIR) modules $(KERNEL_ARCH)" >> $(OBJDIR)/Makefile
107 @echo Invoking kbuild...
108 make -C $(OBJDIR)
109
110../lib/$(app).ko: $(LIB) $(OBJDIR)/$(app).ko
111 cp $(OBJDIR)/$(app).ko ../lib
112
113$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.c
114 $(CC) $($(APP)_CFLAGS) \
115 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
116 $(subst /,$(HOST_PSEP),$<)
117
118$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.S
119 $(CC) $($(APP)_CFLAGS) \
120 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
121 $(subst /,$(HOST_PSEP),$<)
122
123$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cpp
124 $(CC) $($(APP)_CXXFLAGS) \
125 $(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
126 $(subst /,$(HOST_PSEP),$<)
127
128$(OBJDIRS):
129 $(subst @@,$(subst /,$(HOST_PSEP),$@),$(HOST_MKDIR))
130
131$(LIBDIR):
132 $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR))
133
134$(BINDIR):
135 $(subst @@,$(subst /,$(HOST_PSEP),$(BINDIR)),$(HOST_MKDIR))
136
137clean:
138 $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)/*),$(HOST_RMR))
139 $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)),$(HOST_RMDIR))
140ifeq ($(OS_NAME),linux-kernel)
141 rm -f ../lib/$(app).o
142endif
143
Benny Prijono7d433ec2006-02-03 15:23:28 +0000144gcov-report:
145 for file in $(FULL_SRCS); do \
146 gcov $$file -n -o $(OBJDIR); \
147 done
148
Benny Prijonodd859a62005-11-01 16:42:51 +0000149realclean: clean
150 $(subst @@,$(subst /,$(HOST_PSEP),$(LIB)) $(subst /,$(HOST_PSEP),$(EXE)),$(HOST_RM))
151 $(subst @@,$(DEP_FILE),$(HOST_RM))
152ifeq ($(OS_NAME),linux-kernel)
153 rm -f ../lib/$(app).ko
154endif
155
156depend:
157 $(subst @@,$(DEP_FILE),$(HOST_RM))
158 for F in $(FULL_SRCS); do \
159 if test -f $$F; then \
Benny Prijono4fca27b2006-03-23 18:04:15 +0000160 echo "$(OBJDIR)/" | tr -d '\n' >> $(DEP_FILE); \
Benny Prijono0c59fea2006-05-27 13:11:32 +0000161 if $(CC) -M $(DEPFLAGS) $$F | sed '/^#/d' >> $(DEP_FILE); then \
Benny Prijonodd859a62005-11-01 16:42:51 +0000162 true; \
163 else \
164 echo 'err:' >> $(DEP_FILE); \
165 rm -f $(DEP_FILE); \
166 exit 1; \
167 fi; \
168 fi; \
169 done;
170
171dep: depend
172
173-include $(DEP_FILE)
174