Chinaunix首页 | 论坛 | 博客
  • 博客访问: 408803
  • 博文数量: 27
  • 博客积分: 470
  • 博客等级: 一等列兵
  • 技术积分: 546
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-24 11:51
文章存档

2016年(12)

2012年(15)

分类: 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文件,并执行:

image

我们很容易分析出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进程的权限掩码:

image

也可以如此测试:

将如下保存成一个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

阅读(6946) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~