浅析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
阅读(17360) | 评论(0) | 转发(0) |