#environment
SHELL=/bin/bash
MAKE=make
#compiler
CC=gcc
AR=ar
CR=cr
#directory
MAKE_DIR=$(PWD)
SRC_DIR=$(MAKE_DIR)/src/
OBJ_DIR=$(MAKE_DIR)/obj/
LIB_DIR=$(MAKE_DIR)/lib/
INCLUDE_DIR=$(MAKE_DIR)/includes
DEBUG_DIR=$(MAKE_DIR)/debug/
RELEASE_DIR=$(MAKE_DIR)/release/
#vpath
vpath %.cpp $(SRC_DIR)
vpath %.o $(OBJ_DIR)
vpath %.d $(OBJ_DIR)
#VPATH = $(SRC_DIR) $(OBJ_DIR)
#include
INCLUDE=-I$(INCLUDE_DIR)
#src file
SRC_FILES:=$(wildcard $(SRC_DIR)*.cpp)
#obj file
OBJ_FILES:=$(notdir $(patsubst %.cpp, %.o, $(SRC_FILES)))
#depend file, which generated by g++ -MMD xx.cpp $(INCLUDE)
DEPEND_FILES:=$(notdir $(patsubst %.cpp, %.d, $(SRC_FILES)))
#lib, which used for link.
LIBS:=
LIB=-L$(LIB_DIR) $(LIBS)
#LOCAL_MODULE_ELF, which means the final executable file for this module
LOCAL_MODULE_ELF:=calc
LOCAL_MODULE_STATIC_LIB:=libcalc.a
LOCAL_MODULE_DYNAMIC_LIB:=libcalc.so
#flag
FLAG_DEBUG=-g
FLAG_COMPLE=-c
FLAG_LINK=
#debug
DEBUG=1
ifeq ($(DEBUG),1)
OUTPUT_DIR:=$(DEBUG_DIR)
FLAG_COMPLE:=$(FLAG_DEBUG) $(FLAG_COMPLE)
FLAG_LINK:=
else
OUTPUT_DIR:=$(RELEASE_DIR)
FLAG_COMPLE:=$(FLAG_COMPLE)
FLAG_LINK:=
endif
#output
OUTPUT_ELF=$(OUTPUT_DIR)$(LOCAL_MODULE_ELF)
OUTPUT_STATIC_LIB=$(OUTPUT_DIR)$(LOCAL_MODULE_STATIC_LIB)
OUTPUT_DYNAMIC_LIB=$(OUTPUT_DIR)$(LOCAL_MODULE_DYNAMIC_LIB)
.PHONY: all help dir elf staticlib dynamiclib obj move clean cleanall
all:dir obj
#放在任何命令之前
include $(DEPEND_FILES)
help:
@echo "A simple makefile!"
dir:
mkdir -p $(OBJ_DIR)
mkdir -p $(LIB_DIR)
mkdir -p $(DEBUG_DIR)
mkdir -p $(RELEASE_DIR)
obj:$(OBJ_FILES)
move:
mv -f *.o $(OBJ_DIR)
mv -f *.d $(OBJ_DIR)
%.d:$(SRC_DIR)%.cpp
@echo "~~~~~~~~~~~~~~~~~~"
$(CC) -MM -MD $^ $(INCLUDE)
%.o:
@echo "------------------"
$(CC) -fPIC -c $< -o $@ $(INCLUDE)
elf:$(OBJ_FILES)
@echo "building elf..."
@echo "OBJ_FILES: $(OBJ_FILES)"
@echo "LIB: $(LIB)"
@echo "OUTPUT_ELF: $(OUTPUT_ELF)"
$(CC) $(FLAG_LINK) -o $(OUTPUT_ELF) $(OBJ_FILES) $(LIB)
staticlib:$(OBJ_FILES)
@echo "building static lib..."
@echo "OUTPUT_LIB: $(OUTPUT_STATIC_LIB)"
$(AR) $(CR) $(OUTPUT_STATIC_LIB) $(OBJ_FILES)
dynamiclib:$(OBJ_FILES)
@echo "building dynamic lib..."
@echo "OUTPUT_LIB: $(OUTPUT_DYNAMIC_LIB)"
$(CC) -shared -o $(OUTPUT_DYNAMIC_LIB) $(OBJ_FILES)
clean:
@rm -f $(OBJ_DIR)* *.d *.o
@rm -f $(OUT)
@clear
cleanall:
@rm -f $(OBJ_DIR)*
@rm -f $(RELEASE_DIR)*
@rm -f $(DEBUG_DIR)*