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