学习u-boot 需要了解的makfile 相关知识
创始人
2025-06-01 21:37:06
0

一、常用函数

1. origin 函数

origin 函数的返回值就是变量来源。使用格式如下:

$(origin )

使用示例

ifeq ("$(origin V)", "command line")

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

2. filter 函数

$(filter ,)

函数功能

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

函数返回值

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

应用示例

$(filter 4.%,$(MAKE_VERSION))

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

3. firstword 函数

$(firstword )

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

应用示例

VAR1=hello world
test:@echo 'firstword=' $(firstword $(VAR1))

执行返回结果如下:

firstword= hello

4. words 函数

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

$(words )

使用示例如下:

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

执行 make,输出 num:3

5. patsubst 函数

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

$(patsubst  ,  , )

功能

中单词(单词以 空格,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. 特殊的变量

变量 SHELLMAKEFLAGS 除非使用 unexport 声明,否则的话在整个make的执行过程中,它们的值始终自动传递给子make。

相关内容

热门资讯

美国不提安卓系统华为,迈向自主... 华为与美国:一场关于技术、市场与政策的较量在当今这个数字化的世界里,智能手机已经成为我们生活中不可或...
安卓系统怎么打开ppt,选择文... 你有没有遇到过这种情况:手里拿着安卓手机,突然需要打开一个PPT文件,却怎么也找不到方法?别急,今天...
谷歌退回到安卓系统,探索创新未... 你知道吗?最近科技圈可是炸开了锅,谷歌竟然宣布要退回到安卓系统!这可不是一个简单的决定,背后肯定有着...
安卓系统待机耗电多少,深度解析... 你有没有发现,手机电量总是不经用?尤其是安卓系统,有时候明明没怎么用,电量就“嗖”的一下子就下去了。...
小米主题安卓原生系统,安卓原生... 亲爱的手机控们,你是否曾为手机界面单调乏味而烦恼?想要给手机换换“衣服”,让它焕然一新?那就得聊聊小...
voyov1安卓系统,探索创新... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那个让手机焕发青春的Vivo V...
电脑刷安卓tv系统,轻松打造智... 你有没有想过,家里的安卓电视突然变得卡顿,反应迟钝,是不是时候给它来个“大保健”了?没错,今天就要来...
安卓系统即将要收费,未来手机应... 你知道吗?最近有个大消息在科技圈里炸开了锅,那就是安卓系统可能要开始收费了!这可不是开玩笑的,这可是...
雷凌车载安卓系统,智能出行新体... 你有没有发现,现在的汽车越来越智能了?这不,我最近就体验了一把雷凌车载安卓系统的魅力。它就像一个聪明...
怎样拍照好看安卓系统,轻松拍出... 拍照好看,安卓系统也能轻松搞定!在这个看脸的时代,拍照已经成为每个人生活中不可或缺的一部分。无论是记...
安卓车机系统音频,安卓车机系统... 你有没有发现,现在越来越多的汽车都开始搭载智能车机系统了?这不,咱们就来聊聊安卓车机系统在音频方面的...
老苹果手机安卓系统,兼容与创新... 你手里那台老苹果手机,是不是已经陪你走过了不少风风雨雨?现在,它竟然还能装上安卓系统?这可不是天方夜...
安卓系统7.dns,优化网络连... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,别急,让我来给你揭秘这可能与你的安卓系...
安卓手机系统怎么加速,安卓手机... 你有没有发现,你的安卓手机最近变得有点“慢吞吞”的?别急,别急,今天就来给你支几招,让你的安卓手机瞬...
小米note安卓7系统,探索性... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,小米Note这款手机,自从升级到了安卓7...
安卓和鸿蒙系统游戏,两大系统游... 你有没有发现,最近手机游戏界可是热闹非凡呢!安卓和鸿蒙系统两大巨头在游戏领域展开了一场激烈的较量。今...
安卓手机没有系统更,揭秘潜在风... 你有没有发现,现在安卓手机的品牌和型号真是五花八门,让人挑花了眼。不过,你知道吗?尽管市面上安卓手机...
充值宝带安卓系统,安卓系统下的... 你有没有发现,最近手机上的一款充值宝APP,在安卓系统上可是火得一塌糊涂呢!这不,今天就来给你好好扒...
安卓系统8.0镜像下载,轻松打... 你有没有想过,想要给你的安卓手机升级到最新的系统,却不知道从哪里下载那个神秘的安卓系统8.0镜像呢?...
安卓系统修改大全,全方位修改大... 你有没有想过,你的安卓手机其实是个大宝藏,里面藏着无数可以让你手机焕然一新的秘密?没错,今天就要来个...