Makefile之大型工程项目子目录Makefile的一种通用写法【转】

转自:http://www.cnblogs.com/skyofbitbit/p/3680753.html

管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功倍的效果,本文描述Linux环境下大型工程项目子目录Makefile的一种通用写法,使用该方法,当该子目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能。

下面先贴代码(为减小篇幅,一些非关键的代码被去掉,本方法的局限是用于一个C文件生成一个可执行文件的场合):

ROOTDIR = .

EXE_DIR = ./bin
CFLAGS = -I(INCLUDEDIR)I(INCLUDEDIR)−I(LIB_INC) -Wall
LFLAGS = -L$(LIB_DIR)

objects := (patsubst(patsubst(wildcard *.c))
executables := (patsubst(patsubst(wildcard *.c))

all : (objects)(objects)(objects) :%.o : %.c
    @mkdir -p ./bin(CROSS_COMPILE)gcc -c (CFLAGS)(CFLAGS)< -o @@(CROSS_COMPILE)gcc (CFLAGS)(CFLAGS)< -o (subst.o,,(subst.o,,(EXE_DIR)/@)@)(LFLAGS) (LIBS)clean:@rmf.ormf(LIBS)clean:@rm−f∗.orm−f(executables)
    @rm -rf ./bin 
distclean: clean

假如当前目录里面有a.c b.c两个文件

      Makefile 里的函数跟它的变量很相似——使用的时候,你用一个GNUMakewildcardobjects=符号跟左圆括号,函数名,空格后跟一列由逗号分隔的参数,最后用右圆括号结束。例如,在GNUMake里有一个叫′wildcard′的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。像这个命令:objects=(wildcard *.c)    
 
  会产生一个所有以'.c' 结尾的文件列表(本例结果为a.c b.c),然后存入变量objects里。    
 
  另一个有用的函数是 patsubst ( patten substitude,匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要处理由空格分隔的序列。我们将两个函数合起来用:
 
objects := (patsubst(patsubst(wildcard *.c))
 会被处理为: 
objects := a.o b.o
 同理: 
executables := (patsubst(patsubst(wildcard *.c))
 会被处理为: 
executables := a b
 
%o:所有以“.o”结尾的目标,也就是a.o b.o
 
依赖模式“%.c”:取模式“%.o”的%,也就是foo bar,并为其加上.c后缀,即a.c,b.c
 

<a.cb.c<:表示所有依赖目标集,也就是a.cb.c@:表示目标集,也就是a.o b.o
 
命令前加@,表示在终端中不打印,如@mkdir -p ./bin
 
(objects):(objects):(CROSS_COMPILE)gcc -c (CFLAGS)(CFLAGS)< -o $@
 

即可翻译为: 


a.o b.o : a.c b.c    (CROSSCOMPILE)gccc(CROSSCOMPILE)gcc−c(CFLAGS) (a.c b.c) -o (a.o b.o)
 
明白了这些,这种Makefile的写法就可以完全掌握了。
 
注:当前目录直接make的两种写法见 Makefile之写demo时的通用Makefile写法 http://www.linuxidc.com/Linux/2013-05/84679.htm





本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/7113203.html,如需转载请自行联系原作者



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值