首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度刨析makefile

(2)makefile 的书写规则 最基本的就是按照三要素去写:目标、依赖和命令。 目标 : 依赖 Tab 命令 目标和命令都可以使用通配符、变量、函数去代替,命令是一条 shell 命令。...我们使用的通配符主要有两个: * :匹配任意个字符 ?...② 模式匹配字符 % 第二种用于字符匹配的是 % , % 字符作用类似于通配符 * ,它和 * 的区别是,模式匹配字符可以对目标文件与依赖文件进行匹配。...但是有两个特殊变量 SHELL 和 MAKEFLAGS,这两个变量不管是否使用关键字 export 都会传递给下一级 makefile 文件。...如果上层 makefile 文件中定义了 MAKEFLAGS 变量,或者说在执行 make 命令的时候使用了 make 的参数,那么这些参数将会被 MAKEFLAGS 变量传递到下一层 makefile

13110

Makefile学习2

Makefile学习2 Makefile条件判断 使用条件判断,可以让make在编译程序时,根据不同的情况,执行不同的分支:可以执行不同的命令,使用不同的编译参数,生成不同的目标。...ifeq后面的比较语句使用小括号抱起来,ifeq和小括号之间要用空格隔开,小括号里的两个参数用逗号隔开。当小括号里的条件满足时,make就会执行这个分支的命令,否则执行else部分。...给函数传递的参数在函数中使用 (0)、 (1)引用。 用户自定义函数使用call函数间接调用,各个参数之间使用空格隔开。...匹配任意一个字符 [] 我们可以指定匹配的字符放在 “[]” 中 除此之外,Makefile还有经常使用的几个自动变量也可以看做特殊通配符: $@:所有目标文件 $^:目标依赖的所有文件 $<:第一个依赖文件...:所有更新过的依赖文件 在Makefile中,通配符主要用在两个场合: 用在规则的目标和依赖中:make在读取Makefile时会自动对其进行匹配处理 test: *.o gcc -o $@ $

33610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    全网最牛Linux内核Makefile系统文件详解(纯文字代码)

    如果你要传递变量到下级Makefile中,那么你可以使用这样的声明: export 如果你不想让某些变量传递到下级Makefile中,那么你可以这样声明: unexport...需要注意的是,有两个变量,一个是SHELL,一个是MAKEFLAGS,这两个变量不管你是否export,其总是要传递到下层Makefile中,特别是MAKEFILES变量,其中包含了make 的参数信息...,如果我们执行“总控Makefile”时有make参数或是在上层Makefile中定义了这个变量,那么MAKEFILES变量将会是这些参数,并会传递到下层Makefile中,这是一个系统级的环境变量。...但是make命令中的有几个参数并不往下传递,它们是“-C”,“-f”,“-h”“-o”和“-W”(有关Makefile参数的细节将在后面说明),如果你不想往下层传递参数,那么,你可以这样来: subsystem...当make嵌套调用时(参见前面的“嵌套调用”章节),上层Makefile中定义的变量会以系统环境变量的方式传递到下层的Makefile中。当然,默认情况下,只有通过命令行设置的变量会被传递。

    3.3K20

    Linux makefile 教程 非常详细,且易懂

    需要注意的是,有两个变量,一个是SHELL,一个是MAKEFLAGS,这两个变量不管你是否export,其总是要传递到下层Makefile中,特别是MAKEFILES变量,其中包含了make的参数信息,...如果我们执行“总控Makefile”时有make参数或是在上层Makefile中定义了这个变量,那么MAKEFILES变量将会是这些参数,并会传递到下层Makefile中,这是一个系统级的环境变量。...但是make命令中的有几个参数并不往下传递,它们是“-C”,“-f”,“-h”“-o”和“-W”(有关Makefile参数的细节将在后面说明),如果你不想往下层传递参数,那么,你可以这样来: subsystem...当make嵌套调用时(参见前面的“嵌套调用”章节),上层Makefile中定义的变量会以系统环境变量的方式传递到下层的Makefile中。当然,默认情况下,只有通过命令行设置的变量会被传递。...功能:从字符串中取从开始到的单词串。和是一个数字。 返回:返回字符串中从到的单词字串。

    4.3K20

    Makefile经典教程(掌握这些足够)

    需要注意的是,有两个变量,一个是SHELL,一个是MAKEFLAGS,这两个变量不管你是否export,其总是要传递到下层Makefile中,特别是MAKEFILES变量,其中包含了make的参数信息,...如果我们执行“总控Makefile”时有make参数或是在上层Makefile中定义了这个变量,那么MAKEFILES变量将会是这些参数,并会传递到下层Makefile中,这是一个系统级的环境变量。...但是make命令中的有几个参数并不往下传递,它们是“-C”,“-f”,“-h”“-o”和“-W”(有关Makefile参数的细节将在后面说明),如果你不想往下层传递参数,那么,你可以这样来:    subsystem...当make嵌套调用时(参见前面的“嵌套调用”章节),上层Makefile中定义的变量会以系统环境变量的方式传递到下层的Makefile中。当然,默认情况下,只有通过命令行设置的变量会被传递。...功能:从字符串中取从开始到的单词串。和是一个数字。 返回:返回字符串中从到的单词字串。

    2.8K20

    Linux中Makefile文件详解

    $(OBJS): 中间文件的生成规则,告诉 Make 如何生成中间目标文件。 %.o: %.c: 通用规则,告诉 Make 如何将 .c 文件编译成对应的 .o 文件。...通用规则 如果有多个类似的目标文件,可以使用通用规则。通用规则使用通配符 % 来匹配文件名的一部分。...通配符 Makefile 支持通配符,用于匹配文件列表。常用的通配符包括 *(匹配任意字符)和 %(匹配任意字符序列)。...描述了一个包含多个源文件的项目,其中包括了默认目标 all、清理目标 clean,以及两个生成目标:一个可执行文件和一个静态库。...注意到这个 Makefile 中的变量和规则可以根据项目的结构和需求进行适当的调整。 23. 安装规则 Makefile 可以包含安装规则,用于将可执行文件、库文件等安装到指定位置。

    1K10

    Linux 开发 | 学习 Makefile

    ---- Makefile概述 基本格式 基本上每一个 Makefile 主体就是由若干个以下规则模块组成 : 表明输出的目标,输出目标的依赖对象和生成目标需要执行的命令。...上面这段规则,目标targets 是 edit, Makefile 中,targets 是文件名也可以是标号(比如clean),多个用空格分开,可以使用通配符(shell)。...静态模式 对应多个目标对象,构建每个对象对应名称的依赖关系的规则。...规则下对应的所有以 Tab 开头的指令,会被传递到对应的 shell 执行。 Makefile 执行指令必须在 recipe 这个位置。...两个变量,一个是 SHELL,一个是 MAKEFLAGS,这两个变量不管你是否 export,其总是要传递到下层 Makefile 中。

    5.4K10

    Linux下开发stm32 ④ | 标准固件库工程开发

    到这里,我们的工程模板就建好了,然后就是编写makefile来编译整个工程了: ?...修改makefile,添加所有的c源文件: ? 接下来解决第二个小问题,如何将这些源文件分别编译为对应的目标文件呢?...这里面targets定义了一系列目标文件,可以有通配符,是目标的一个集合;target-pattern指明了targets的模式,prereq-parrterns是目标的依赖模式,它对target-parrtern...形成的模式再进行一次依赖目标的定义: 首先我们需要一个目标集合,也就是使用刚刚的静态模式将上一步所有搜索到的.c文件换为同名.o文件: ?...这个时候,我们基本的两个大问题就解决完了,接下来编译器参数,一个是添加宏定义,首先是芯片型号宏定义STM32F10X_HD,然后是USE_STDPERIPH_DRIVER,表明我们使用了标准外设驱动库;

    1.7K20

    Linux从入门到入土③(GCC、静态与动态链接库、Git、Make、Makefile)

    ), 依赖(depend) 和命令(command):目标(target): 规则中的目标,这个目标和规则中的命令是对应的通过执行规则中的命令,可以生成一个和目标同名的文件规则中可以有多个命令,因此可以通过这多条命令来生成多个目标...Makefile 中的规则语句中经常会出现目标文件和依赖文件,==自动变量用来代表这些规则中的目标文件和依赖文件,并且它们只能在规则的命令中使用==。...模式匹配 -> 通过一个公式, 代表若干个满足条件的规则# 依赖有一个, 后缀为.c, 生成的目标是一个 .o 的文件, % 是一个通配符, 匹配的是文件名%.o:%.cgcc $通配符是 %在通配符后边指定出要被替换的后缀,比如: %.c, 意味着 .c 的后缀要被替换掉replacement: 这是一个模式字符串,指定参数 pattern 中的后缀最终要被替换为什么还是使用...% 来表示参数 pattern 中文件的路径和名字在通配符 % 后边指定出新的后缀名,比如: %.o 这表示原来的后缀被替换为 .otext: 该参数中存储这要被替换的原始数据返回值:函数返回被替换过后的字符串

    1.6K10

    Makefile学习1

    很多开源项目可能文档不完整,而Makefile就是开源项目的地图,从Makefile入手,可以让你快速窥探整个开源项目的框架和概貌,让你深入代码而不至于迷路。...规则中也可以没有命令,仅仅包含目标和目标依赖,仅仅用来描述一种依赖关系,但一个规则中一定要有一个目标。 默认目标 一个Makefile文件里通常会有多个目标,一般会选择第一个作为默认目标。...时可能会遇到,比如: $%:当规则的目标是一个静态库文件时,$%代表静态库的一个成员名 $+:类似$^,但是保留了依赖文件中重复出现的文件 $*:在模式匹配和静态模式规则中,代表目标模式中%的部分。...从另一个角度上看,就是实现了在Makefile中增加或者修改命令行参数的一种机制。...,会分别到各个子目录下去执行,解析各个子目录下的Makefile并运行,遍历完所有的子目录 make依次遍历到各个子目录下解析新的Makefile时,项目顶层目录的主Makefile定义的一些变量,如何传递到子目录的

    39510

    Makefile基本用法

    管道命令 对要调用的规则施加特定的顺序,而不必强制更新目标,使用管道命令。 当执行此条规则,则首先需要执行先决条件的规则。然而当先决条件存在,不论是否被更改,都属于满足条件。...随后按原始顺序执行规则。 ? 通配符 *.o 匹配所有的.o文件, ? $?匹配修改过的文件 ? 赋值过程中没有被理解为通配符,而是认为就是*.o本身,需要使用wildcard和$进行声明。 ? ?...在替换的目标中,\1表示替换的源的第一部分,然后添加.o和空格和该规则下的先决条件名。 sed将上一句生成的依赖关系中的一些部分进行了替换,写入到了每个先决条件文件下。...当多个.d文件生成后,其中包含了各个依赖关系,使用include方法包括到文件中,如下包含了foo.d和bar.d。 其中的:.c=.d,将source中的.c替换为了对应的.d。....POSIX 如果.POSIX被称为目标,那么makefile将被解析并以符合POSIX的模式运行。 变量导出 使用export进行导出,供子makefile使用。

    2.5K40

    Make 命令教程

    比如,假设文件 a.txt 依赖于 b.txt 和 c.txt ,是后面两个文件连接(cat命令)的产物。那么,make 需要知道下面的规则。...像这样的规则,都写在一个叫做Makefile的文件中,Make命令依赖这个文件进行构建。Makefile文件也可以写为makefile, 或者用命令行参数指定为其他文件名。..."目标"是必需的,不可省略;"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。 每条规则就明确两件事:构建目标的前置条件是什么,以及如何构建。下面就详细讲解,每条规则的这三个组成部分。...Makefile 的通配符与 Bash 一致,主要有星号(*)、问号(?)和 [...] 。比如, *.o 表示所有后缀名为o的文件。...f1.o: f1.c f2.o: f2.c 使用匹配符%,可以将大量同类型的文件,只用一条规则就完成构建。 3.5 变量和赋值符 Makefile 允许使用等号自定义变量。

    2K40

    浅谈 Make 命令

    比如,假设文件 a.txt 依赖于 b.txt 和 c.txt ,是后面两个文件连接(cat命令)的产物。那么,make 需要知道下面的规则。...像这样的规则,都写在一个叫做Makefile的文件中,Make命令依赖这个文件进行构建。Makefile文件也可以写为makefile, 或者用命令行参数指定为其他文件名。..."目标"是必需的,不可省略;"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。 每条规则就明确两件事:构建目标的前置条件是什么,以及如何构建。下面就详细讲解,每条规则的这三个组成部分。...Makefile 的通配符与 Bash 一致,主要有星号(*)、问号(?)和 [...] 。比如, *.o 表示所有后缀名为o的文件。...3.8 判断和循环 Makefile使用 Bash 语法,完成判断和循环。

    1.3K10

    makefile终极奥义

    「类似C语言中的宏」,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上,可以直接把变量当成C语言中的宏理解。...(如:ld ) 隐晦规则 如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。 通配符 符号 含义 % 任意一个 ?...会自动推导生成.o文件 除了通配符,makefile还提供了自动推导的自动变量 自动变量 符号 含义 $@ 代表目标文件 $^ 代表所有依赖文件 $< 代表第一个依赖文件 由此第二个版本出来了 第二个版本...函数 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。...显式规则。显式规则说明了如何生成一个或多个目标文件。这是由Makefile的书写者明显指出要生成的文件、文件的依赖文件和生成的命令。 隐晦规则。

    1.3K30

    如何使用Makefile在Ubuntu上自动执行重复任务

    介绍 如果您有从Linux服务器上的源代码安装软件的经验,您可能会遇到make实用程序。该工具主要用于自动编译和构建程序。它允许应用程序的作者轻松地布置构建该特定项目所需的步骤。...从手册页中,我们可以看到make将查找名为GNUmakefile的文件,然后查找makefile,然后查找Makefile。...此时,make将到达“target2”命令列表的末尾,并将控制权传递回“target1”目标。然后它将执行“target1命令”并退出。 source可以是文件或目标本身。...:此变量包含当前目标的比目标更新的依赖项列表。这些将是在执行此目标下的命令之前必须重新完成的目标。 $@:此变量是当前目标的名称。这允许我们引用您尝试制作的文件,即使此规则通过模式匹配。...对于后缀规则,这是用于创建目标的文件的名称。在我们的示例中,这将包含“file.jpg” $*:此文件是剥离匹配扩展名的当前依赖项的名称。将此视为目标文件和源文件之间的中间阶段。

    2.4K00

    路由通配符,小小的字符有大大的作用,你真的熟悉吗?

    在路由表中,通配符可以用来指定一个或多个网络地址范围,使得路由规则更加灵活和通用。 路由通配符的使用可以简化路由表的配置,使得网络管理员能够用较少的规则来管理更大的地址空间。...例如,如果你有一个IP地址192.168.1.0和通配符掩码0.0.0.255,这意味着你可以匹配从192.168.1.0到192.168.1.255的任何IP地址。...查询参数处理: 虽然查询参数不是路由的一部分,但路由通配符的概念可以扩展到查询参数的处理,允许你根据查询参数的不同来加载不同的视图或数据。...例如,{192.168.1.1, 192.168.1.2}可以匹配这两个IP地址中的任意一个。 // 花括号在路由定义中不常用,但在某些情况下,可以用于表示一组可选的参数。....*)"还有一个好处就是能够将捕获的路径将作为参数传递给对应的组件。在 Vue Router 中,这个参数可以通过 this.

    5500

    【makefile】

    也就是Makefile中最核心的内容。 例如,假设有一个C源文件test.c,该源文件包含有自定义的头文件test.h,则目标文件test.o明确依赖于两个源文件:test.c和test.h。...第一个非注释行指定 test.o 为目标,并且依赖于 test.c 和 test.h 文件。随后的行指定了如何从目标所依赖的文件建立目标。...2、Makefile的基本内容 Makefile一般包括包含:显式规则、变量定义、隐含规则、文件指示和注释等五个内容。 (1)显式规则:显式规则说明如何生成一个或多个的目标文件。...$@ ——表示规则中的目标文件集。在模式规则中,如果有多个目标,那么," $@ " 就是匹配于目标中模式定义的集合。 $% ——仅当目标是函数库文件中,表示规则中的目标成员名。...模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个 % 号,同时可用来定义目标和依赖文件之间的关系,例如下面的模式规则定义了如何将任意一个 X.c 文件转换为 X.o 文件: %.c:%.o

    2K00
    领券