一份好用的makefile
这是一份好用的makefile模板,基于gcc -M
对各个源文件进行依赖关系解读并维护一个依赖文件,从而保证自动更新源文件的依赖。
另外还对参考文档进行了完善,原作即使是在clean的时候也会去生成依赖文件,处理后不需要。
另外对clean以及install的操作也进行了程序示例,进行简单修改即可。
IncludePath = -I../base -I../protobuf/pbTarget -I./
Pwd = `pwd`
MakeFilePath := $(abspath $(lastword $(MAKEFILE_LIST)))
MakeFileDir := $(abspath $(dir $(MakeFilePath)))
MAKE = make
EXE = login_server
CC = gcc
CFLAGS = -g $(IncludePath) -w
C_SRC = $(wildcard *.c)
C_OBJ = $(patsubst %.c, %.o, $(C_SRC))
C_DEP = $(patsubst %.c, .%.d, $(C_SRC))
INCLUDES=./*.h
CXX = g++
CXXFLAGS = -g $(IncludePath) -w
CXX_SRC = $(wildcard *.cpp)
CXX_OBJ = $(patsubst %.cpp, %.o, $(CXX_SRC))
CXX_DEP = $(patsubst %.cpp, .%.d, $(CXX_SRC))
LDFLAGS = -lm -lprotobuf -lpthread -L/usr/local/protobuf/lib -llog4cpp -lhiredis `mysql_config --cflags --libs`
all : $(EXE)
$(EXE) : $(C_OBJ) $(CXX_OBJ)
$(CXX) $(C_OBJ) $(CXX_OBJ) -o $(EXE) $(LDFLAGS)
.PHONY: clean
clean :
@rm -f $(EXE) *.o .*.d
$(C_DEP) : .%.d : %.c
@set -e;
rm -f $@;
$(CXX) -M $< $(IncludePath) > @@@@@@@;
sed 's,^.*\.o,& $@ ,g' < @@@@@@@ > $@;
rm -f @@@@@@@;
$(CXX_DEP) : .%.d : %.cpp
@set -e;
rm -f $@;
$(CXX) -M $< $(IncludePath) > @@@@@@@;
sed 's,^.*\.o,& $@ ,g' < @@@@@@@ > $@;
rm -f @@@@@@@;
ifeq ($(words $(MAKECMDGOALS)), 0)
-include $(C_DEP) $(CXX_DEP)
endif
_PREFIX = $(MakeFileDir)/../installDir # 默认安装目录
ifneq ($(strip $(prefix)),)
_PREFIX = $(prefix)
endif
_PREFIX := $(abspath $(_PREFIX))
INSTALLDIR = $(_PREFIX)/$(EXE)
.PHONY: install
install:
@if [ ! -d $(INSTALLDIR) ]; then \
mkdir -p $(INSTALLDIR); \
fi
@cp -af $(MakeFileDir)/$(EXE) $(INSTALLDIR)
@cp -af $(MakeFileDir)/$(EXE).conf $(INSTALLDIR)
参考文档 :https://blog.csdn.net/JustDoIt_201603/article/details/102815404