网上找的通用makefile不怎么好用,于是折腾了一下,在前人的基础上做了改动,可用,没有注释,看看就懂了。
# TODO:edit area TARGET_NAME = MyPro BIN_TYPE = dll ifndef CFG_NAME CFG_NAME = debug endif ifndef SLN_DIR SLN_DIR = $(PWD)/.. endif INT_DIR = $(SLN_DIR)/tmp/linux.debug/$(TARGET_NAME) OUT_DIR = $(SLN_DIR)/bin/linux.debug # -L directories LIB_PATH = -Wl,-rpath=./ -L$(OUT_DIR) # -l options LD_LIBS = -l"BaseSvc" -l"jsoncpp" -l"api" # -I directories INC = -I. -I../include -I../common # directories for finding target or cpp files VPATH = .:nas:vsp # TODO: the end edit area SRC_PATH = $(foreach dir,$(subst :, ,$(VPATH)),$(wildcard $(dir)/*.cpp)) OBJ_DIR = $(INT_DIR) OBJ_PATH = $(addprefix $(OBJ_DIR)/, $(subst :, ,$(VPATH))) OBJS = $(addprefix $(OBJ_DIR)/, $(subst .cpp,.o,$(SRC_PATH))) MAKE_OBJET_DIR := $(shell mkdir -p $(OBJ_DIR) $(OBJ_PATH)) GCC = gcc GPP = g++ GAR = ar CFLAGS += -c MACROS += -D_LINUX ifeq ($(CFG_NAME), debug) CFLAGS += -g MACROS += -D_DEBUG else CFLAGS += -O MACROS += -DNDEBUG endif ifeq ($(BIN_TYPE), lib) BIN_GCC = $(GAR) BIN_CFLAGS += cr TARGET_PATH = $(OUT_DIR)/lib$(TARGET_NAME).a else ifeq ($(BIN_TYPE), dll) CFLAGS += -fPIC BIN_GCC = $(GPP) BIN_CFLAGS = -shared -fPIC -o TARGET_PATH = $(OUT_DIR)/$(TARGET_NAME).so else BIN_GCC = $(GPP) BIN_CFLAGS = -o TARGET_PATH = $(OUT_DIR)/$(TARGET_NAME) endif endif $(TARGET_NAME) : $(OBJS) $(BIN_GCC) $(BIN_CFLAGS) $(TARGET_PATH) $(OBJS) $(LIB_PATH) $(LD_LIBS) $(OBJS) : $(OBJ_DIR)/%.o : %.cpp $(OBJ_DIR)/%.cpp.d $(GPP) $(CFLAGS) $(MACROS) -o $@ -c $< $(INC) # auto generate dependency DEPS = $(OBJS:.o=.cpp.d) $(DEPS) : $(OBJ_DIR)/%.cpp.d : %.cpp @echo -n "$@ ">$(OBJ_DIR)/$<.d;\ $(GPP) $< -MM $(INC) >> $(OBJ_DIR)/$<.d sinclude $(DEPS) clean: @rm -rf $(OBJ_DIR) @rm -rf $(TARGET_PATH)