Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15530603
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2009-02-11 10:54:04

浅析Makefile中shell语句和if条件语句的使用范例

//到/vobs/works/lnx2625pxa目录下执行/vobs/tmp/Makefile脚本
cat /vobs/tmp/Makefile | make  --no-print-directory -C /vobs/works/lnx2625pxa -f - luther
-C表示先cd进到/vobs/works/lnx2625pxa目录,然后执行make操作.
如果不加-f那么表示直接使用/vobs/works/lnx2625pxa目录下的Makefile,
加入-f之后,如果没有上面的- luther那么将对/vobs/tmp/Makefile执行默认操作,
等效于cd /vobs/works/lnx2625pxa && make -f /vobs/tmp/Makefile
加入-f之后,加入- PHONY_NAME,表示执行,相应的phony字段,
等效于cd /vobs/works/lnx2625pxa && make -f /vobs/tmp/Makefile luther

luther@gliethttp:~$ cat /vobs/tmp/Makefile

PHONY += luther clean
luther:
    @echo 'luther'
clean:
    @echo 'clean'
luther@gliethttp:~$ cat /vobs/tmp/Makefile | make  --no-print-directory -C /vobs/works/lnx2625pxa -f  - luther
luther
luther@gliethttp:~$ cat /vobs/tmp/Makefile | make  --no-print-directory -C /vobs/works/lnx2625pxa -f  - clean
clean
luther@gliethttp:~$


$(if $(ARCH),ARCH=$(ARCH),)//if语句,如果ARCH变量定义了,那么将返回第一个逗号后面的内容,否则返回第2个逗号后面的内容,所以模型为:$(if CONDITION,then value1,else value)

LINUXVER := $(shell { cat $(LINUXDIR)/Makefile; \ //将Makefile内容cat出来
    echo "bcm$$$$:;@echo \$$(KERNELRELEASE)"; } | \//在Makefile内容的末尾追加该内容
    $(MAKE) --no-print-directory $(if $(ARCH),ARCH=$(ARCH),) -C $(LINUXDIR) -f - bcm$$$$)
我们可以使用tee来保存该结果:
LINUXVER := $(shell { cat $(LINUXDIR)/Makefile; \
    echo "bcm$$$$:;@echo \$$(KERNELRELEASE)"; } | tee luther.gliethttp |\
    $(MAKE) --no-print-directory $(if $(ARCH),ARCH=$(ARCH),) -C $(LINUXDIR) -f - bcm$$$$)
//感觉就是先对$(LINUXDIR)/目录下的kernel执行一次编译操作,当编译完成之后,才继续往下执行
然后:
luther@gliethttp:~$ cat luther.gliethttp |tail -3
# information in a variable se we can use it in if_changed and friends.
.PHONY: $(PHONY)
bcm20467:;@echo $(KERNELRELEASE) //该行就是由上面的语句追加进来的
该句意思很简单,就是当我们执行
make bcm20467时,make将执行
@echo $(KERNELRELEASE)命令,这样kernel的版本号就被打印出来了,
所以make执行之后
LINUXVER就等于$(LINUXDIR)/Makefile中KERNELRELEASE数值了,
我们这里就是2.6.25
如果是pc上,那么我的ubuntu对应内容为2.6.24-22-generic
阅读(17404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~