linux学习笔记-makefile3

来源:互联网 发布:淘宝天刀代购流程 编辑:程序博客网 时间:2024/06/06 23:29
makefile使用变量


makefile中定义变量的一般形式是:
变量名 赋值符 变量值
变量名要求与C语言相似。在含有变量的makefile中,make执行时把变量名出现的地方用对应的变量值替换。makefile中的变量类是C语言的宏。变量名区分大小写。
有一些变量是系统预定义的,如自动变量"$@","$?","$<","$*"等。


1.引用变量
当定义变量后可以在makefile中使用这个变量。引用方式是:$(变量名)或者${变量名}。


2.定义变量
makefile中有两种类型的变量:递归展开变量和立即展开变量。
通过"="赋值的变量是递归展开变量;
通过":="赋值的变量是立即展开的变量;


例子:
foo = $(bar)
bar = $(ugh)
ugh = Huh
all:
echo $(foo)
执行make是将后打印出Hub。整个过程如下:
make执行echo命令时,首先$(foo)被替换为$(bar);
接下来$(bar)被替换为$(ugh);
最后$(ugh)被替换为Huh。
整个过程是在执行 echo $(foo) 时完成的。
这种递归定义的好处:变量未定义时就可以使用变量,但是有可能造成死循环。


使用":="的例子:
x := foo
y := $(x) bar
x := later
等价于:
y := foo bar
x := later
这种类型的变量定义时就会立即展开,而不是在引用时才展开。这样变量未定义时展开这个变量的值为空。


还有一个赋值符"?=",这个赋值符只有在变量没有被定义时使用。


通常一个变量定义后,可以对其值进行追加。使用"+="来增加它的值,如:
object += another.o
这个操作把字符串 another.o 添加到变量 object 原有值的末尾,并用空格和原有值分开。


3.预定义变量
makefile中,预定义了许多变量,可以直接使用:


宏名: 初始值:说明:
CC cc默认使用的编译器
CFLAGS -o 编译器使用的选项
MAKE makemake命令
MAKEFLAGS make命令的选项
SHELL 默认使用的shell类型
PWD 运行make命令时的当前目录
AR ar库管理命令
ARFLAGS -ruv 库管理命令选项
LIBSUFFIE .a 库的后缀
A a库的扩展名


例如:
module1.o:module1.c head1.h
   gcc -c module1.c
改为:
module1.o:module1.c head1.h
   $(CC) -c module1.c
CC是系统预先定义的变量,可以直接使用。
如果需要使用gcc编译module1.c,我们可以预定义变量的值,
module1.o:module1.c head1.h
$(CC)=gcc
$(CC) -c moudle1.c
现在这个规则等价与开始的规则。


makefile还定义了一组变量,它们的值在make运行过程中动态改变,它们是隐含规则所需要的变量,这类变量称为自动变量:$@,$%,$<,$>,$?,$^,$+,$*。
$@:表示一个规则中目标文件名。如果目标文件是一个文档文件(linux中一般称.a文件为文档文件,也称为静态链接库文件),那么它代表这个文件名。如:
file.o file2.o : header.h
      cp $@ /backup
这条规则的功能是当目标文件过时时,将原来的目标文件备份到 /backup 目录下,然后重新生成新的目标文件。


$%:当规则的目标文件是一个静态链接库文件时,$%代表静态链接库的一个成员名。如:某个规则目标是"foo.a(bar.o)",那么 $% 代表bar.o,而 $@ 代表foo.a。如果目标不是静态链接库文件,$% 值为空

$<:规则中的第一个依赖文件名。如果规则使用了隐含规则,那么$<的值是由隐含规则引入的第一个依赖文件名。如:
file1.o file2.o header.h
cp $@ /backup
file.o过时时,相当于:
file1.o:file1.c header.h
cp $@ /backup
gcc -c file2.c -o file1.o
规则中第一个依赖文件名是file1.c,即 $< 的值是file1.c而不是header.h。


$>:和$%一样适用于库文件,它的值是库名。


$?:所有比目标文件新的依赖文件列表,以空格分隔。如果目标是静态库文件名,代表的是库成员。


$^:规则所有的依赖文件列表,适用空格分隔。如果是静态库文件名,代表的是所有库成员名。


$+:类似$^,但是保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。


$*:目标文件去掉后缀后的名称。如:
file1.o file2.o : $$*.c header.h
gcc -c $*.c -o $@
运行make,当处理目标文件为file1.o时,$$*和$*代表file1;当处理目标文件为file2.o时,$$*和$*代表file2,因此上式等价与:
file1.o : $$*.c header.h
gcc -c $*.c -o $@
file2.o : $$*.c header.h
gcc -c $*.c -o $@
或者等价于:
file1.o : file1.c header.h
gcc -c file1.c -o file1.o
file2.o : file2.c header.h
gcc -c file2.c -o file2.o

4.隐含规则
0 0
原创粉丝点击