ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
下面是定义变量的一般方法:
  VARNAME=some_text [...]
把变量用括号起来,并在前面加上"$"符号,就可以引用变量的值:
  $(VARNAME)
变量一般都在makefile的头部定义,并且,按照惯例,所有的makefile变量都应该大写.

在makefile中使用变量
OBJS = howdy.o helper.o
HDRS = helper.h
howdy: $(OBJS) $(HDRS)
    gcc $(OBJS) -o howdy
helper.o: helper.c $(HDRS)
    gcc -c helper.c
howdy.o: howdy.c
    gcc -c howdy.c
hello: hello.c
    gcc hello.c -o hello
all: howdy hello
clean:
    rm howdy hello *.o

make使用两种变量:递归展开变量和简单展开变量.递归展开变量在引用时逐层展开,即如果在展开式中包含了对其他变量的引用,则这些变量也将被展开,直到没有需要展开的变量为止,这就是所谓的递归展开.

考虑下面的变量定义:
  CC = gcc
  CC = $(CC) -o
CC在被引用时递归展开,从而陷入一个无限循环中:CC将展开为$(CC)的值,从而永远也读不到-o选项.

为了避免这个问题,可以使用简单展开变量.与递归展开变量在引用时展开不同,简单展开变量在定义处展开,并且只展开一次,从而取消了变量的嵌套引用.在定义时,其语法与递归展开变量有细微的不同:
  CC := gcc -o
  CC += -O2
第一个定义使用":="设置CC的值为gcc -o, 第二个定义使用"+="在前面定义的CC后附加了-O2,从而CC最终的值是gcc -o -O2.

除用户定义变量外,make也允许使用环境变量,自动变量和预定义变量.使用环境变量非常简单.在启动时,make读取已定义的环境变量,并且创建与之同名同值的变量.但是,如果makefile中有同名的变量,则这个变量将取代与之相应的环境变量,所以应当注意这一点.

                                自动变量
变量                          说明
$@                            规则的目标所对应的文件名
$<                            规则中的第一个相关文件名
$^                            规则中所有相关文件的列表,以空格为分界符
$?                            规则中日期新于目标的所有相关文件的列表,以空格为分隔符
$(@D)                       目标文件的目录部分(如果目标在子目录中)
$(@F)                       目标文件的文件名部分(如果目标在子目录中)

                  用于文件名和标志的预定义变量
变量                     说明
AR                       归档维护程序,默认值=ar
AS                       汇编程序,默认值=as
CC                       C编译程序,默认值=cc
CPP                       C预处理程序,默认值= cpp
RM                       文件删除程序,默认值="rm -f"
ARFLAGS                   传给归档维护程序的标志,默认值=rv
ASFLAGS                   传给汇编程序的标志,没有默认值
CFLAGS                   传给C编译器的标志,没有默认值
CPPFLAGS                 传给C预处理程序的标志,没有默认值
LDFLAGS                   传给链接程序(ld)的标志,没有默认值
posted on 2005-08-04 21:54 ivaneeo 阅读(268) 评论(0)  编辑  收藏 所属分类: GNU牛力

只有注册用户登录后才能发表评论。


网站导航: