打印
[学习资料]

学习u-boot 需要了解的makfile 相关知识

[复制链接]
1491|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、常用函数
1. origin 函数
origin 函数的返回值就是变量来源。使用格式如下:

$(origin <variable>)


使用示例
ifeq ("$(origin V)", "command line")


这里判断变量 V 的来源是不是 command line。

2. filter 函数
$(filter <pattern...>,<text>)


函数功能
以 pattern 模式过滤 text 字符串中的单词,仅保留符合模式 pattern 的单词,可以有多个模式。

函数返回值
函数返回值就是符合pattern 的字符串。

应用示例
$(filter 4.%,$(MAKE_VERSION))


表示 从 字符串 MAKE_VERSION 中找出符合 “4.%” 的字符( % 为通配符),其中MAKE_VERSION 表示 make 的版本号,当前make 的版本号为 4.1,所以这个函数返回字符串:4.1。

3. firstword 函数
$(firstword <text>)


函数用于取出 text 字符串中的第一个单词,函数的返回值就是获取到的单词。

应用示例
VAR1=hello world
test:
        @echo 'firstword=' $(firstword $(VAR1))



执行返回结果如下:

firstword= hello

4. words 函数
words 用于统计单词个数。函数格式如下:

$(words <text>)


使用示例如下:

VAR1=hello world hello
test1:
        @echo "num:" $(words $(VAR1))


执行 make,输出 num:3

5. patsubst 函数
模式字符串替换函数。使用格式如下:

$(patsubst <pattern> , <replacement> , <text>)


功能
将 中单词(单词以 空格,Tab,回车,换行分割)符合模式 的部分,替换成 。

通配符
可以包括通配符 % ,表示任意长度的字符串。

转义字符
可以用 \ 进行转义。以 \% 来表示真正含义的 % 字符。

使用示例
makefile 文件如下定义

all:
        @echo $(patsubst %.c,%.o,bar.c test.c)


执行 make all ,输出

输出 bar.o test.o

二、环境变量
1. MAKECMDGOALS
MAKECMDGOALS 是 make 的一个环境变量,这个变量会保存你所指定的目标列表。

使用示例如下:

test1:
        @echo "test1"

test2:
        @echo "test2"

all:
        @echo "all target list:" $(MAKECMDGOALS)


执行: make test1 test2 all

输出如下:

test1
test2
all target list: test1 test2 all


2. MAKEFLAGS
MAKEFLAGS 用于记录 执行 make 命令时,输入的选项(OPTION)。主makefile 调用其他makefile 时,会自动将 MAKEFLAGS 变量传递过去。

make 的使用规则
make [OPTION]... [TARGET]...


使用示例
主makefile 定义如下:

all:
        @echo "main makefile:" $(MAKEFLAGS)
        @$(MAKE) -C sub
        @$(MAKE) -f ../makefile


sub 目录下的makefile 定义如下:

all:
        @echo "sub makefile:" $(MAKEFLAGS)


主目录上一层 makefile 定义如下:

all:
        @echo "outside makefile:" $(MAKEFLAGS)


在主目录下 执行: make -ikr

输出如下:



调用其他makefile 文件时,会自动在 命令选项(OPTION )中附加上 -w (--print-directory)选项,用于打印进入和退出调用的makefile 路径,方便调试跟踪问题。

我们也可以使用 选项 --no-print-directory 禁止打印目录信息,也就禁止了自动添加 -w 选项。

例如,在主目录 下执行:

make -ikr --no-print-directory

输出如下:



三、make 命令选项
1. -f
-f FILE, --file=FILE, --makefile=FILE

指定make 程序执行的makefile 文件。默认情况下,在命令行输入 make ,make 程序会在当前目录下寻找 makefile 文件,并执行。

但是当我们要执行的 makefile 文件不在当前目录,或者文件名 不是 “makefile” 时,我们可以用命令选项 -f 指定要执行的makefile 文件。

使用示例如下所示:

make -f ./sub/makefile.build


2. -C
-C DIRECTORY, --directory=DIRECTORY

详情见下面章节

四、与子make 通信
1. 执行子目录makefile
主目录的 makefile 可以使用如下代码来编译子目录:

$(MAKE) -C subdir


作用:进入 subdir 目录,并执行该目录下的 makefile
$(MAKE) 就是调用 make 命令
-C 指定子目录
2. 变量传递
2.1 export
使用 export 来导出要传递给子make 的变量。

export VAR1 VAR2 VAR3


2.2 unexport
使用unexport 声明不导出某个变量给子make

unexport VAR1 VAR2 VAR3


3. 特殊的变量
变量 SHELL 和 MAKEFLAGS 除非使用 unexport 声明,否则的话在整个make的执行过程中,它们的值始终自动传递给子make。
————————————————
版权声明:本文为CSDN博主「gdut_llkkyy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gdut_liujiangyi/article/details/129716321

使用特权

评论回复
沙发
tpgf| | 2024-2-2 11:46 | 只看该作者
学习uboot  就必须要学会使用这些函数吗

使用特权

评论回复
板凳
zljiu| | 2024-2-2 12:17 | 只看该作者
Makefile文件中的命令有一定规范,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程

使用特权

评论回复
地板
nawu| | 2024-2-2 12:48 | 只看该作者
看楼主的截图感觉像是使用的脚本吧

使用特权

评论回复
5
gwsan| | 2024-2-2 13:37 | 只看该作者
Makefile的核心规则,类似于一位厨师做菜,目标就是做好一道菜,那么所谓的依赖就是各种食材,各种厨具等等,然后需要厨师好的技术方法类似于命令,才能作出一道好菜

使用特权

评论回复
6
aoyi| | 2024-2-2 17:58 | 只看该作者
对于新手来说 怎么才能makefile入门呢?

使用特权

评论回复
7
tfqi| | 2024-2-2 18:31 | 只看该作者
Makefile并不会关心命令是如何执行的,仅仅只是会去执行所有定义的命令,和我们平时直接输入命令行是一样的效果

使用特权

评论回复
8
SophiaOP| | 2024-2-21 16:14 | 只看该作者
uboot真是难啊

使用特权

评论回复
9
SophiaOP| | 2024-2-21 16:15 | 只看该作者
比驱动还要难感觉

使用特权

评论回复
10
OliviaSH| | 2024-2-25 21:49 | 只看该作者
区分空格跟tab是真难搞啊

使用特权

评论回复
11
CarterERO| | 2024-2-28 22:50 | 只看该作者
这个确实有人写的很简单有的很复杂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

4068

帖子

2

粉丝