c mysql makefile_一个通用的C/C++ Makefile

写了一个通用的GNU/Linux环境下的Makefile。

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

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

###########################################################

#

# MAKEFILE FOR C/C++ PROJECT

# Author: swm8023

# Date:  2014/01/30

#

###########################################################

.PHONY: all clean

all:

# annotation when release version

DEBUG      := y

TARGET_PROG := main

# project directory

DEBUG_DIR  := ./Debug

RELEASE_DIR := ./Release

BIN_DIR    := $(if $(DEBUG), $(DEBUG_DIR), $(RELEASE_DIR))

# shell command

CC    := gcc

CXX  := g++

RM    := rm -rf

MKDIR := mkdir -p

SED  := sed

MV    := mv

# init sources & objects & depends

sources_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 variable

CFLAGS    := $(if $(DEBUG),-g -O, -O2)

CFLAGS    += $(addprefix -I ,$(sort $(dir $(sources_h))))

CXXFLAGS    = $(CFLAGS)

LDFLAGS    :=

LOADLIBES  += #-L/usr/include/mysql

LDLIBS    += #-lpthread -lmysqlclient

# add vpath

vpath %.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) $(CFLAGS) -o $@ -c $<

$(BIN_DIR)/%.o: %.cpp

@$(call make-depend,$(patsubst %.o,%.d,$@),$

$(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)

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值