makefile 学习的点滴总结-(2)
2013-11-26 10:17
363 查看
目录
1、=和:=的区别
2、Makefile $@, $^, $<
3、“order-only”依赖 “|”的用法
4、wildcard使用
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1、=和:=的区别。
(1)“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
(2)“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2、Makefile $@, $^, $<
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
如一个目录下有如下文件:
$ ls
hello.c hi.c main.c Makefile
按照 Makefile 规则规规矩矩的写:
main: main.o hello.o hi.o
gcc -o main main.o hello.o hi.o
main.o: main.c
cc -c main.c
hello.o: hello.c
cc -c hello.c
hi.o: hi.c
cc -c hi.c
clean:
rm *.o
rm main
改为用上述符号进行替代:
main: main.o hello.o hi.o
gcc -o $@ $^
main.o: main.c
cc -c $<
hello.o: hello.c
cc -c $<
hi.o: hi.c
cc -c $<
clean:
rm *.o
rm main
beyes@debian:~/makefile_test/semicolon/real$ make
cc -c main.c
cc -c hello.c
cc -c hi.c
gcc -o main main.o hello.o hi.o
beyes@debian:~/makefile_test/semicolon/real$ ls
hello.c hello.o hi.c hi.o main main.c main.o Makefile
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3、“order-only”依赖的使用举例:
LIBS = libtest.a
foo : foo.c | $(LIBS)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)
make在执行这个规则时,如果目标文件“foo ”已经存在。当“foo.c”被修改以后,目标“foo ”
将会被重建,但是当“libtest.a ”被修改以后。将不执行规则的命令来重建目标“foo ”。
就是说,规则中依赖文件$(LIBS)只有在目标文件不存在的情况下,才会参与规则的执行。当目
标文件存在时此依赖不会参与规则的执行过程。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4、wildcard使用
在 Makefile 有这样一个变量定义:“objects = *.o ”。它表示变量“objects”的值是字符串“*.o”(并不是期
望的空格分开的.o 文件列表)。
当需要变量“objects”代表所有.o 文件列表示,需要使
用函数“wildcard”
objects = $(wildcar *.o)
例1:
objects = *.o
foo : $(objects)
cc -o foo $(CFLAGS) $(objects)
如果工作目录下有".o"文件,则"foo"会按照规则进行重建。
但是,如果工作目录下没有".o"文件,在执行make的时候就会报错,这时就需要将变量用wildcard来定义:
objects = $(wildcar *.o)
###############################################################
例2:
“$(patsubst %.c,%.o,$(wildcard *.c))”
表示使用“wildcard”函数获取工作目录下的.c 文件列表;之后将列表中所有文件名的后缀.c 替换为.o
#sample Makefile
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1、=和:=的区别
2、Makefile $@, $^, $<
3、“order-only”依赖 “|”的用法
4、wildcard使用
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1、=和:=的区别。
(1)“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
(2)“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2、Makefile $@, $^, $<
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
如一个目录下有如下文件:
$ ls
hello.c hi.c main.c Makefile
按照 Makefile 规则规规矩矩的写:
main: main.o hello.o hi.o
gcc -o main main.o hello.o hi.o
main.o: main.c
cc -c main.c
hello.o: hello.c
cc -c hello.c
hi.o: hi.c
cc -c hi.c
clean:
rm *.o
rm main
改为用上述符号进行替代:
main: main.o hello.o hi.o
gcc -o $@ $^
main.o: main.c
cc -c $<
hello.o: hello.c
cc -c $<
hi.o: hi.c
cc -c $<
clean:
rm *.o
rm main
beyes@debian:~/makefile_test/semicolon/real$ make
cc -c main.c
cc -c hello.c
cc -c hi.c
gcc -o main main.o hello.o hi.o
beyes@debian:~/makefile_test/semicolon/real$ ls
hello.c hello.o hi.c hi.o main main.c main.o Makefile
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3、“order-only”依赖的使用举例:
LIBS = libtest.a
foo : foo.c | $(LIBS)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)
make在执行这个规则时,如果目标文件“foo ”已经存在。当“foo.c”被修改以后,目标“foo ”
将会被重建,但是当“libtest.a ”被修改以后。将不执行规则的命令来重建目标“foo ”。
就是说,规则中依赖文件$(LIBS)只有在目标文件不存在的情况下,才会参与规则的执行。当目
标文件存在时此依赖不会参与规则的执行过程。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4、wildcard使用
在 Makefile 有这样一个变量定义:“objects = *.o ”。它表示变量“objects”的值是字符串“*.o”(并不是期
望的空格分开的.o 文件列表)。
当需要变量“objects”代表所有.o 文件列表示,需要使
用函数“wildcard”
objects = $(wildcar *.o)
例1:
objects = *.o
foo : $(objects)
cc -o foo $(CFLAGS) $(objects)
如果工作目录下有".o"文件,则"foo"会按照规则进行重建。
但是,如果工作目录下没有".o"文件,在执行make的时候就会报错,这时就需要将变量用wildcard来定义:
objects = $(wildcar *.o)
###############################################################
例2:
“$(patsubst %.c,%.o,$(wildcard *.c))”
表示使用“wildcard”函数获取工作目录下的.c 文件列表;之后将列表中所有文件名的后缀.c 替换为.o
#sample Makefile
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
相关文章推荐
- 现代程序设计 作业9
- 各字符集
- WPF 的FontFamily 列表
- 安卓电池电量的google介绍文档
- [转]存下来
- vs2010无法启动调试
- linux流量监控脚本
- When should we write our own copy constructor?
- Sharepoint 2013 安装部署系列篇 第二篇 -- SQL集群安装
- 遍历Map的四种方法
- 微信公众号推广的十个技巧
- (Relax ST1.7)POJ 1256 Anagram(求一个字符串在特殊规定下的全排列)
- VC画图函数
- Linux Make的有用选项
- 使用yum安装本地源
- Linux系统不可不知的命令:sudo
- 关于TableViewCell生成时dequeueReusableCellWithIdentifier的认识
- 如何利用phpMyAdmin创建数据库,设置编码 php apache MySQL
- 【转载】Intent Flag介绍 intent.addFlags()
- Jmeter 如何让变量中包含变量