网上找的通用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)