分类: LINUX
2016-05-22 00:32:41
一、文件结构理解
首先我们理解buildroot makefile文件的框架结构,将整个结构简化成如下:
UMASK = 0022
ifneq ($(shell umask),$(UMASK))
.PHONY: _all $(MAKECMDGOALS)
$(MAKECMDGOALS): _all
@:
_all:
@ps
@echo "change umask to 0022"
@umask $(UMASK) && $(MAKE) --no-print-directory $(MAKECMDGOALS) &&ps
else # umask
# This is our default rule, so must come first
all:
@echo "I am main task"
@ps
endif
将以上代码保存成makefile文件,并执行:
我们很容易分析出makefile的执行足迹:
开始执行时,因为$(shell umask)的值为0002,所以先执行目标
-all:
@ps 打印出当前运行中进程相关信息:有bash,make,ps
@echo "change umask to 0022" 打印出 change umask to 0022
@umask $(UMASK) && $(MAKE) --no-print-directory $(MAKECMDGOALS) &&ps
这一行是关键,它首先开启一个新的子sh进程,在sh里,将umask设置成0022
重新运行make子进程,在make子进程里,因为此时$(shell umask)的值为0022,所以执行目标
all:
@echo "I am main task" 打印出I am main task
@ps 打印 出当前运行中进程相关信息:有bash ,make,sh,make,ps
执行完make子进程以后,
执行@umask $(UMASK) && $(MAKE) --no-print-directory $(MAKECMDGOALS) &&ps
这一行余下的ps,因为此时子make进程已经执行完,所以当前的进程只剩:bash,make,sh,ps
特别提醒:
@umask $(UMASK) && $(MAKE) --no-print-directory $(MAKECMDGOALS)
以上语句是在同一shell进程中执行,所以umask=0022能对make起作用,如果把以上改成如下
@umask $(UMASK)
@ $(MAKE) --no-print-directory $(MAKECMDGOALS)
那make执行时umask就不是0022了,因为@umask $(UMASK) 和@ $(MAKE) --no-print-directory $(MAKECMDGOALS)不在同一个shell下执行。
umask的改变只对当前shell有效。
二、具体内容理解
UMASK =0022表示默认创建新文件权限为755,也就是rxwr-xr-x
//UMASK =0027表示默认创建新文件权限为755,也就是rxwr-x---
umask可以输出当前shell进程的权限掩码:
也可以如此测试:
将如下保存成一个makefile文件,然后在当前目录下make:
.PHONY:all
all:
@echo "umask result is $(shell umask)"
执行后得到的输出是 umask result is 0002
$(MAKECMDGOALS)是makefile中的自带变量,不是shell环境变量,它表示你所指定的终极目标的列表,如果在命令行上,你没有指定目标,那么,这个变量是空值。
可以如此测试:
将如下保存成一个makefile文件,然后在当前目录下make:
.PHONY: all
all:
echo “MAKECMDGOALS is $(MAKECMDGOALS)”
如果只是执行make,我的系统make执行后输出MAKECMDGOALS is
如果执行make all,我的系统make执行后输出MAKECMDGOALS is all
$(MAKE)是makefile中的自带变量,不是shell环境变量,它存储的就是当前make程序名称,我的系统$(MAKE)=make
@:是指的空命令:
BR2_VERSION := 2016.05-rc1
$(MAKE_VERSION)是makefile中的自带变量,不是shell环境变量,它表示当前make的版本,我的是4.1
可以如此测试:
将如下保存成一个makefile文件,然后在当前目录下make:
.PHONY: all
all:
echo “make version is $(MAKE_VERSION)”
我的系统make执行后输出make version is 4.1
RUNNING_MAKE_VERSION=$(MAKE_VERSION)=4.1
MIN_MAKE_VERSION=3.81
makefile中的sort函数对4.1 和3.81进行排序,结果是3.81 4.1
makefile中的firstword函数 取得字符串集合3.81 4.1的第一个字符串3.81
如果RUNNING_MAKE_VERSION低于MIN_MAKE_VERSION就会报错
$(CURDIR)是makefile中的自带变量,不是shell环境变量,会自带等于当前的路径
可以如此测试:
将如下保存成一个makefile文件,然后在当前目录下make:
.PHONY: all
all:
echo “current dir is $(CURDIR)”
我的系统make执行后输出 current dir is /home/mark/buildroot
.NOTPARALLEL: 执行接下的语句不能并行执行。
TOPDIR=$(CURDIR)=/home/mark/buildroot
CONFIG_CONFIG_IN=config.in
CONFIG=support/kconfig
DATE=$(shell date +%y%m%d)=160520
可以如此测试:
将如下保存成一个makefile文件,然后在当前目录下make:
DATE=$(shell date +%y%m%d)
.PHONY: all
all:
echo “DATE is $(DATE)”
执行后输出DATE is 160520