一个通用的C/C++ Makefile

来源:互联网 发布:三甲医院体检中心知乎 编辑:程序博客网 时间:2024/05/23 15:47

转自 http://c4fun.cn/blog/2014/01/30/common-makefile/

赶在蛇年的最后一天,写了一个通用的GNU/Linux环境下的Makefile。

该Makefile适用于最后生成若干个可执行文件的小型C/C++工程,只要将该Makefile放在源码根目录下make,它会自动查找该目录下(包括子目录)的所有源码文件(支持.cpp .c .h格式)并自动生成正确的依赖关系,并且为了不污染源码文件夹,源码和编译过程中的中间文件会分开(Debug模式编译生成的中间文件在Debug目录下,Release模式在Release目录下)。

试了几个之前写过的Project,都是OK的。

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
############################################################# MAKEFILE FOR C/C++ PROJECT# Author: swm8023 <swm8023@gmail.com># Date:   2014/01/30############################################################.PHONY: all cleanall: # annotation when release versionDEBUG       := yTARGET_PROG := main# project directoryDEBUG_DIR   := ./DebugRELEASE_DIR := ./ReleaseBIN_DIR     := $(if $(DEBUG), $(DEBUG_DIR), $(RELEASE_DIR))# shell commandCC    := gccCXX   := g++RM    := rm -rfMKDIR := mkdir -pSED   := sedMV    := mv# init sources & objects & dependssources_all := $(shell find . -name "*.c" -o -name "*.cpp" -o -name "*.h")sources_c   := $(filter %.c, $(sources_all))sources_cpp := $(filter %.cpp, $(sources_all))sources_h   := $(filter %.h, $(sources_all))objs        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.o) $(sources_c:.c=.o)))deps        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.d) $(sources_c:.c=.d)))# create directory$(foreach dirname,$(sort $(dir $(sources_c) $(sources_cpp))),\  $(shell $(MKDIR) $(BIN_DIR)/$(dirname)))# complie & link variableCFLAGS     := $(if $(DEBUG),-g -O, -O2)CFLAGS     += $(addprefix -I ,$(sort $(dir $(sources_h))))CXXFLAGS    = $(CFLAGS)LDFLAGS    := LOADLIBES  += #-L/usr/include/mysqlLDLIBS     += #-lpthread -lmysqlclient# add vpathvpath %.h $(sort $(dir $(sources_h)))vpath %.c $(sort $(dir $(sources_c)))vpath %.cpp $(sort $(dir $(sources_cpp)))# generate depend files# actually generate after object generated, beacasue it only used when next make)ifneq "$(MAKECMDGOALS)" "clean"sinclude $(deps)endif# make-depend(depend-file,source-file,object-file,cc)define make-depend  $(RM) $1;                                     \  $4 $(CFLAGS) -MM $2 |                         \  $(SED) 's,\($(notdir $3)\): ,$3: ,' > $1.tmp; \  $(SED) -e 's/#.*//'                           \         -e 's/^[^:]*: *//'                     \         -e 's/ *\\$$//'                        \         -e '/^$$/ d'                           \         -e 's/$$/ :/' < $1.tmp >> $1.tmp;      \  $(MV) $1.tmp $1;endef# rules to generate objects file$(BIN_DIR)/%.o: %.c@$(call make-depend,$(patsubst %.o,%.d,$@),$<,$@,$(CC))$(CC) $(CFLAGS) -o $@ -c $<$(BIN_DIR)/%.o: %.cpp@$(call make-depend,$(patsubst %.o,%.d,$@),$<,$@,$(CXX))$(CXX) $(CXXFLAGS) -o $@ -c $<# add-target(target,objs,cc)define add-target  REAL_TARGET += $(BIN_DIR)/$1  $(BIN_DIR)/$1: $2$3 $(LDFLAGS) $$^ $(LOADLIBES) $(LDLIBS) -o $$@endef# call add-target$(foreach targ,$(TARGET_PROG),$(eval $(call add-target,$(targ),$(objs),$(CXX))))all: $(REAL_TARGET) $(TARGET_LIBS)clean: $(RM) $(BIN_DIR)
0 0
原创粉丝点击