Benny Prijono | 0a749f1 | 2005-10-31 21:02:30 +0000 | [diff] [blame^] | 1 | LIBDIR = ../lib
|
| 2 | BINDIR = ../bin
|
| 3 |
|
| 4 | #
|
| 5 | # The full path of output lib file (e.g. ../lib/libapp.a).
|
| 6 | #
|
| 7 | LIB = $($(APP)_LIB)
|
| 8 |
|
| 9 | #
|
| 10 | # The full path of output executable file (e.g. ../bin/app.exe).
|
| 11 | #
|
| 12 | EXE = $($(APP)_EXE)
|
| 13 |
|
| 14 | #
|
| 15 | # Source directory
|
| 16 | #
|
| 17 | SRCDIR = $($(APP)_SRCDIR)
|
| 18 |
|
| 19 | #
|
| 20 | # Output directory for object files (i.e. output/target)
|
| 21 | #
|
| 22 | OBJDIR = output/$(app)-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME)
|
| 23 |
|
| 24 | ifeq ($(OS_NAME),linux-kernel)
|
| 25 | export $(APP)_CFLAGS += -DKBUILD_MODNAME=$(app) -DKBUILD_BASENAME=$(app)
|
| 26 | endif
|
| 27 |
|
| 28 |
|
| 29 | #
|
| 30 | # OBJS is ./output/target/file.o
|
| 31 | #
|
| 32 | OBJS = $(foreach file, $($(APP)_OBJS), $(OBJDIR)/$(file))
|
| 33 | OBJDIRS := $(sort $(dir $(OBJS)))
|
| 34 |
|
| 35 | #
|
| 36 | # FULL_SRCS is ../src/app/file1.c ../src/app/file1.S
|
| 37 | #
|
| 38 | FULL_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 | #
|
| 44 | DEPFLAGS = $($(APP)_CXXFLAGS) $($(APP)_CFLAGS)
|
| 45 |
|
| 46 | # Dependency file
|
| 47 | DEP_FILE := .$(app)-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend
|
| 48 |
|
| 49 |
|
| 50 | print_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 |
|
| 65 | print_bin: print_common
|
| 66 | @echo EXE=$(EXE)
|
| 67 | @echo BINDIR=$(BINDIR)
|
| 68 |
|
| 69 | print_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 |
|
| 133 | clean:
|
| 134 | $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)/*),$(HOST_RMR))
|
| 135 | $(subst @@,$(subst /,$(HOST_PSEP),$(OBJDIR)),$(HOST_RMDIR))
|
| 136 | ifeq ($(OS_NAME),linux-kernel)
|
| 137 | rm -f ../lib/$(app).o
|
| 138 | endif
|
| 139 |
|
| 140 | realclean: clean
|
| 141 | $(subst @@,$(subst /,$(HOST_PSEP),$(LIB)) $(subst /,$(HOST_PSEP),$(EXE)),$(HOST_RM))
|
| 142 | $(subst @@,$(DEP_FILE),$(HOST_RM))
|
| 143 | ifeq ($(OS_NAME),linux-kernel)
|
| 144 | rm -f ../lib/$(app).ko
|
| 145 | endif
|
| 146 |
|
| 147 | depend:
|
| 148 | $(subst @@,$(DEP_FILE),$(HOST_RM))
|
| 149 | for F in $(FULL_SRCS); do \
|
| 150 | if test -f $$F; then \
|
| 151 | echo -n $(OBJDIR)/ >> $(DEP_FILE); \
|
| 152 | if gcc -MM $(DEPFLAGS) $$F | sed '/^#/d' >> $(DEP_FILE); then \
|
| 153 | true; \
|
| 154 | else \
|
| 155 | echo 'err:' >> $(DEP_FILE); \
|
| 156 | exit 1; \
|
| 157 | fi; \
|
| 158 | fi; \
|
| 159 | done
|
| 160 |
|
| 161 | dep: depend
|
| 162 |
|
| 163 | -include $(DEP_FILE)
|
| 164 |
|