Makefile 理解(2) .

 

上次提到了伪目标、变量及函数

先说说伪目标 与 变量: 函数不多但用法很灵活 换句话说就是 太复杂了 以后慢慢讨论
先看一个例子:

  1. OBJS = main.o a.o b.o  
  2.   
  3. main: $(OBJS)  
  4.     cc -o main $(OBJS)  
  5.   
  6. main.o: main.h  
  7.   
  8. a.o: a.h  
  9.   
  10. b.o: b.h  
  11.   
  12. <span style="color:#FF0000;">.PHONY: clean  
  13. clean:  
  14.     rm -f main $(OBJS)</span>  
伪目标就是以关键字.PHONY开头的,表示clean是一个为目标,因为我们并不会去生成一个clean文件,所以伪目标并不是一个文件而是一个标签,既然在编译时生成了一下目标文件与可执行文件,就应该可以将他们都删除(make clean)以便重新编译,
  1. OBJS = main.o a.o b.o  
  2.   
  3. <span style="color:#FF0000;">.PHINY: all  
  4. all:main</span>  
  5.   
  6. main: $(OBJS)  
  7.     cc -o main $(OBJS)  
  8.   
  9. main.o: main.h  
  10.   
  11. a.o: a.h  
  12.   
  13. b.o: b.h  
  14.   
  15. <span style="color:#FF0000;">.PHONY: clean  
  16. clean:  
  17.     rm -f main $(OBJS)</span>  
如果将Makefile写成这样就可以使用make all 编译全部  make clean 删除中间件以及生成的可执行文件,这也是写Makefile的一般规则 当然可以有更所的伪目标根据项目需要

变量的使用
在Makefile中变量就是 一个字符串文本 在使用的地方会自动原样展开,上面那个例子就用到了OBJS这个变量, 展开后就是main.o a.o b.o
在变量是使用时 使用$在变量之前最好加上()或者{ }  $(OBJS)   如果要表示真正的$符就得用$$表示,
  1. FOO = $(PHELLO)  
  2. PHELLO = $(HELLO)  
  3. HELLO = hello  
  4. all:  
  5.     echo $(FOO)  

make all 时候会打印出hello出来, 这样看起来 变量的声明是不需要一定顺序的 ,但是看起来很费劲, 你得FOO引用到PHELLO 而PHELLO在FOO下面定义,这样如果一个定义引用到隔着n多行的定义 看起来就没那么容易了
为了避免上边的问题,make中使用另一种变量定义方法这样他前面的变量不能使用后面的变量

  1. X := main.c  
  2. Y := $(X) a.c  
  3. Z := $(Y) b.c  

Z的值是main.c a.c b.c
而如果这样:

  1. Z := $(Y) b.c  
  2. Y := $(X) a.c  
  3. X := main.c  
那么Z的值也就是 b.c 因为在Z上面没有定义Y所以默认Y就是空

上面是比较简单的例子看一个带MAKELEVEL的(这是指当make嵌套的层数)

  1. <pre name="code" class="plain">ifeq ($(MAKELEVEL), 0)  
  2. CUR_DIR := $(shell pwd)  
  3. WHOAMI := $(shell whoami)  
  4. HOST_TYPE := $(shell arch)  
  5. endif  
 
  1. FOO ?= bar  
  2. 等价于  
  3. ifeq($(origin FOO), undefined)  
  4.     FOO = bar  
  5. endif   

?=表示在此变量没有定义事对变量赋值,如果变量已经定义了则此句无效

追加变量值

  1. OBJS = main.o a.o b.o  
  2. OBJS += c.o  
  3. OBJS展开后就是main.o a.o b.o c.o  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值