| LIBDIR = ../lib |
| BINDIR = ../bin |
| |
| # |
| # The full path of output lib file (e.g. ../lib/libapp.a). |
| # |
| LIB = $($(APP)_LIB) |
| |
| # |
| # The full path of output executable file (e.g. ../bin/app.exe). |
| # |
| EXE = $($(APP)_EXE) |
| |
| # |
| # Source directory |
| # |
| SRCDIR = $($(APP)_SRCDIR) |
| |
| # |
| # SRCEXT is .c |
| # SRCS is file.c |
| # FULL_SRCS is ../src/app/file.c |
| # |
| SRCEXT = $($(APP)_SRCEXT) |
| SRCS = $($(APP)_SRCS) |
| FULL_SRCS = $(foreach file, $(SRCS), $(SRCDIR)/$(file)) |
| |
| |
| # |
| # Output directory for object files (i.e. output/target) |
| # |
| OBJDIR = ./output/$(app)-$(TARGET) |
| |
| # |
| # OBJS1 is ./output/target/file.c |
| # OBJS is ./output/target/file.o |
| # |
| OBJS1 = $(foreach file, $(SRCS), $(OBJDIR)/$(file)) |
| OBJS = $(OBJS1:%$(SRCEXT)=%$(OBJEXT)) |
| OBJDIRS := $(sort $(foreach file, $(SRCS), $(dir $(OBJDIR)/$(file)))) |
| |
| |
| # |
| # When generating dependency (gcc -MM), ideally we use only either |
| # CFLAGS or CXXFLAGS (not both). But I just couldn't make if/ifeq to work. |
| # |
| DEPFLAGS = $($(APP)_CXXFLAGS) $($(APP)_CFLAGS) |
| |
| print_common: |
| @echo "###" |
| @echo "### DUMPING MAKE VARIABLES (I WON'T DO ANYTHING ELSE):" |
| @echo "###" |
| @echo APP=$(APP) |
| @echo SRCEXT=$(SRCEXT) |
| @echo OBJDIR=$(OBJDIR) |
| @echo OBJS=$(OBJS) |
| @echo SRCDIR=$(SRCDIR) |
| @echo FULL_SRCS=$(FULL_SRCS) |
| @echo $(APP)_CFLAGS=$($(APP)_CFLAGS) |
| @echo $(APP)_CXXFLAGS=$($(APP)_CXXFLAGS) |
| @echo $(APP)_LDFLAGS=$($(APP)_LDFLAGS) |
| @echo DEPFLAGS=$(DEPFLAGS) |
| |
| print_bin: print_common |
| @echo EXE=$(EXE) |
| @echo BINDIR=$(BINDIR) |
| |
| print_lib: print_common |
| @echo LIB=$(LIB) |
| @echo LIBDIR=$(LIBDIR) |
| |
| $(LIB): $(LIBDIR) $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) |
| $(AR) $(LIB) $(OBJS) |
| $(RANLIB) $(LIB) |
| |
| $(EXE): $(BINDIR) $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP) |
| $(LD) $(LDOUT) $(EXE) $(OBJS) $($(APP)_LDFLAGS) |
| |
| $(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.c |
| $(CC) $($(APP)_CFLAGS) $< $(CCOUT) $@ |
| |
| $(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cpp |
| $(CC) $($(APP)_CXXFLAGS) $< $(CCOUT) $@ |
| |
| #$(OBJDIR): |
| # $(MKDIR) $(OBJDIR) |
| $(OBJDIRS): |
| $(MKDIR) $@ |
| |
| $(LIBDIR): |
| $(MKDIR) $(LIBDIR) |
| |
| $(BINDIR): |
| $(MKDIR) $(BINDIR) |
| |
| clean: |
| $(RM) -r $(OBJDIR)/* |
| $(RMDIR) $(OBJDIR) |
| |
| realclean: clean |
| $(RM) $(LIB) $(EXE) |
| $(RM) .$(app).depend |
| |
| depend: |
| $(RM) .$(app).depend |
| for F in $(FULL_SRCS); do \ |
| echo -n $(OBJDIR)/ >> .$(app).depend; \ |
| if gcc -MM $(DEPFLAGS) $$F >> .$(app).depend; then \ |
| true; \ |
| else \ |
| echo 'err:' >> .$(app).depend; \ |
| exit 1; \ |
| fi; \ |
| done |
| |
| dep: depend |
| |
| -include .$(app).depend |
| |