Makefile之大型工程项目子目录Makefile的一种通用写法
2013-05-09 10:50
357 查看
原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8902133,作者:gqb666
管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功倍的效果,本文描述Linux环境下大型工程项目子目录Makefile的一种通用写法,使用该方法,当该子目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能。下面先贴代码(为减小篇幅,一些非关键的代码被去掉,本方法的局限是用于一个C文件生成一个可执行文件的场合):
假如当前目录里面有a.c b.c两个文件
Makefile 里的函数跟它的变量很相似——使用的时候,你用一个$符号跟左圆括号,函数名,空格后跟一列由逗号分隔的参数,最后用右圆括号结束。例如,在
GNU Make里有一个叫'wildcard' 的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。像这个命令:
objects= $(wildcard *.c)
会产生一个所有以'.c' 结尾的文件列表(本例结果为a.c b.c),然后存入变量
objects里。
另一个有用的函数是 patsubst ( patten substitude,匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要处理由空格分隔的序列。我们将两个函数合起来用:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
会被处理为:
objects := a.o b.o
同理:
executables := $(patsubst %.c,%,$(wildcard *.c))
会被处理为:
executables := a b
%o:所有以“.o”结尾的目标,也就是a.o b.o
依赖模式“%.c”:取模式“%.o”的%,也就是foo bar,并为其加上.c后缀,即a.c,b.c
$<:表示第一个依赖目标集
$@:表示目标集,也就是a.o b.o
命令前加@,表示在终端中不打印,如@mkdir -p ./bin
$(objects) : %.o: %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
即可翻译为:
a.o b.o : a.c b.c $(CROSS_COMPILE)gcc -c $(CFLAGS) (a.c b.c) -o (a.o b.o)
明白了这些,这种Makefile的写法就可以完全掌握了。
注:当前目录直接make的两种写法见博文Makefile之写demo时的通用Makefile写法
管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功倍的效果,本文描述Linux环境下大型工程项目子目录Makefile的一种通用写法,使用该方法,当该子目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能。下面先贴代码(为减小篇幅,一些非关键的代码被去掉,本方法的局限是用于一个C文件生成一个可执行文件的场合):
ROOTDIR = . EXE_DIR = ./bin CFLAGS = -I$(INCLUDE_DIR) -I$(LIB_INC) -Wall LFLAGS = -L$(LIB_DIR) objects := $(patsubst %.c,%.o,$(wildcard *.c)) executables := $(patsubst %.c,%,$(wildcard *.c)) all : $(objects) $(objects) :%.o : %.c @mkdir -p ./bin$ $(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@ $(CROSS_COMPILE)gcc $(CFLAGS) $< -o $(subst .o, ,$(EXE_DIR)/$@) $(LFLAGS) $(LIBS) clean: @rm -f *.o rm -f $(executables) @rm -rf ./bin distclean: clean
假如当前目录里面有a.c b.c两个文件
Makefile 里的函数跟它的变量很相似——使用的时候,你用一个$符号跟左圆括号,函数名,空格后跟一列由逗号分隔的参数,最后用右圆括号结束。例如,在
GNU Make里有一个叫'wildcard' 的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。像这个命令:
objects= $(wildcard *.c)
会产生一个所有以'.c' 结尾的文件列表(本例结果为a.c b.c),然后存入变量
objects里。
另一个有用的函数是 patsubst ( patten substitude,匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要处理由空格分隔的序列。我们将两个函数合起来用:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
会被处理为:
objects := a.o b.o
同理:
executables := $(patsubst %.c,%,$(wildcard *.c))
会被处理为:
executables := a b
%o:所有以“.o”结尾的目标,也就是a.o b.o
依赖模式“%.c”:取模式“%.o”的%,也就是foo bar,并为其加上.c后缀,即a.c,b.c
$<:表示第一个依赖目标集
$@:表示目标集,也就是a.o b.o
命令前加@,表示在终端中不打印,如@mkdir -p ./bin
$(objects) : %.o: %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
即可翻译为:
a.o b.o : a.c b.c $(CROSS_COMPILE)gcc -c $(CFLAGS) (a.c b.c) -o (a.o b.o)
明白了这些,这种Makefile的写法就可以完全掌握了。
注:当前目录直接make的两种写法见博文Makefile之写demo时的通用Makefile写法
相关文章推荐
- Makefile之大型工程项目子目录Makefile的一种通用写法【转】
- Makefile之大型工程项目子目录Makefile的一种通用写法
- Makefile之大型工程项目子目录Makefile的一种通用写法
- 代码片段--Makefile之大型工程项目子目录Makefile的一种通用写法
- Makefile之大型工程项目子目录Makefile的一种通用写法
- Makefile之大型工程项目子目录Makefile的一种通用写法
- 规则+工程:一种比较灵巧通用的Makefile写法
- 规则+工程:一种比较灵巧通用的Makefile写法
- Makefile 工程项目通用版
- Makefile的一种通用写法
- 通用Makefile的编写和在项目工程中使用Makefile(包括动态库、静态库的链接、整个工程联合编译)
- 经验分享 |【PDF下载】阿里开源峰会之BeeHive:一种大型iOS项目解耦实践
- 一份通用makefile,自动遍历子目录源文件,自动生成依赖
- Makefile之写demo时的通用Makefile写法总结
- Cocos2dx-Android 之Makefile通用高级写法
- 一个较为通用的linux工程目录架构和Makefile
- 一个通用的makefile写法,自动推导文件的依赖关系
- 工程项目利用AutoMake生成Makefile实战
- 通用多目录makefile的写法
- 第十二讲 多目录下makefile的通用写法zz