一份好用的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

posted @ 2022-10-15 12:35  呵哈呵  阅读(23)  评论(0)    收藏  举报