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

如何在递归makefile中获取目标的依赖关系?

在递归makefile中获取目标的依赖关系可以通过以下步骤实现:

  1. 创建一个makefile文件,定义目标和依赖关系。每个目标都应该有一个对应的规则,其中包含目标的依赖关系和生成目标的命令。
  2. 在makefile中使用变量来定义目标和依赖关系。变量可以用来存储目标名称、依赖关系和命令等信息。
  3. 使用递归调用的方式来处理依赖关系。当make命令执行时,它会按照makefile中定义的规则递归地处理每个目标的依赖关系。
  4. 在每个目标的规则中,使用特殊的makefile变量$(MAKE)来递归调用make命令。这样可以确保在处理依赖关系时,make命令会按照正确的顺序执行。
  5. 在每个目标的规则中,使用makefile的条件语句来判断是否需要重新生成目标。条件语句可以根据目标和依赖关系的时间戳来判断是否需要重新生成目标。

下面是一个示例makefile文件,演示了如何在递归makefile中获取目标的依赖关系:

代码语言:txt
复制
# 定义目标和依赖关系
TARGET := main
SRCS := main.c foo.c bar.c
OBJS := $(SRCS:.c=.o)
DEPS := $(SRCS:.c=.d)

# 默认目标
all: $(TARGET)

# 递归调用make命令处理依赖关系
$(TARGET): $(OBJS)
    $(MAKE) -C subdir

# 生成目标的命令
$(OBJS): %.o: %.c
    gcc -c $< -o $@

# 获取目标的依赖关系
$(DEPS): %.d: %.c
    gcc -MM $< > $@

# 包含依赖关系文件
-include $(DEPS)

在上述示例中,目标main依赖于foo.obar.o,而foo.obar.o又分别依赖于对应的源文件foo.cbar.c。通过递归调用make命令,可以处理subdir目录下的依赖关系。

请注意,上述示例中的命令和变量仅供参考,具体的实现方式可能因项目的不同而有所差异。此外,腾讯云相关产品和产品介绍链接地址可以根据实际需求进行选择和添加。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

探索Linux内核:Kconfig的秘密

看看如何在Linux内核实现递归make,并借助简化的Makefile代码: # In top Makefile vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps...依赖跟踪 KBuild跟踪三种依赖关系: 所有的前提文件(*.c和*.h) CONFIG_在所有先决条件文件中使用的选项 用于编译目标的命令行依赖关系。 第一个很容易理解,但是第二个和第三个呢?...然后主机程序fixdep通过获取其他两个依赖项来处理其他两个依赖项。depfile命令行作为输入,然后以makefile语法输出.cmd文件,它记录目标的命令行和所有先决条件(包括配置)。...在递归生成过程中将包含一个.cmd文件,提供所有依赖项信息,并帮助决定是否重新构建目标。...这背后的秘密是,Fixdep将解析depfile(.d文件),然后解析其中的所有依赖文件,搜索所有config_string的文本,将它们转换为相应的空头文件,并将它们添加到目标的先决条件

1.7K11

【Linux】自动化构建工具-makeMakefile详解(6)

一.make/Makefile背景简介 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程的源文件不计数,其按类型、功能、模块分别放在若干个目录makefile...详情见下文 二.依赖关系依赖方法 引入:为了带大家更好了解依赖关系依赖方法,YY下面给大家带来一个用例 我们先用vim创建一个makefile文件,并在当中[插入模式]写入如图所示的依赖关系...第一个操作,make clean是在makefile自上而下查找】 三.makefile特性:依赖关系的自动推导 由以下用例可知结论:make会自动推导makefile依赖关系(其非常类似于递归结构...,由于递归中涉及到函数栈帧的调用,我们也能明白其为栈式结构) 改变先后顺序不影响; 如果中途少了一组依赖关系(例如注释掉mycode.s: mycode.i)则无法运行; 四. make特性:根据源文件和目标文件的新旧...结论: make指令会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译 在任何操作,一定是先有源文件(.c),才有可执行程序(.exe) 一般而言,可执行程序的时间一定比源文件更加新

21510

Linux 下的make命令与Makefile

如果这些依赖自身也是目标,继续为这些依赖扫描Makefile 建立其依赖关系,然后编译它们。...要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如前面提到的“make hello_kitty”形式)任何在makefile的目标都可以被指定成终极目标,甚至没有被我们明确写出来的目标也可以成为...j: 也就是jobs,输出执行规则命令的详细信息,命令的PID、返回码等。 m: 也就是makefile,输出make读取makefile,更新makefile,执行makefile的信息。...因为在目标和依赖目标同时有%时,依赖标的“茎”会传给目标,当做目标的“茎”。...(d) 对于不存在的依赖文件,递归调用这个算法查找他是否可以被隐含规则找到。 (e) 如果所有的依赖文件存在或是理当存在,或是就根本没有依赖文件。那么这条规则被采用,退出该算法。

10.1K20

make menuconfig makefile kconfig详解

相互作用关系 顶层的Makefile文档读取内核配置文件.config文档的内容,确定内核配置情况,通过递归向下访问子目录的形式完成build内核和模块的工作。....如果你的makefile的第一个目标是由许多个目标组成,你可以指示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(make clean)。...任何在makefile的目标都可以被指定成终极目标,但是 除了以“-”打头,或是包含了“=”的目标,因为有这些字符的目标,会被解析成命令行参数或是变量。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系...递归进行时,这两个变量被传递进子makefile

1.8K10

技术栈系列基础篇2-Makefile

如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,:“#”。...、推导关系如下,test 依赖于 test1.o 、test2.otest1.o 依赖于 test1.c 、test1.htest2.o 依赖于 test2.c 、test2.hmakefile会把所有依赖关系列举出来...,执行make命令的时候,会根据依赖关系自动编译隐晦规则每个.o文件的依赖文件默认会有同名的.c文件,比如有一个target是test.o,那么test.c默认就是test.O的依赖文件,这个是makefile...文件的依赖性,生成.o文件make的依赖性,会自动推到一层层的依赖关系,最终编译出最终的目标。...递归赋值 ( = ) 赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响。条件赋值 ( ?= ) 如果变量未定义,则使用符号的值定义变量。

56530

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

书写规则 ———— 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。...的filter函数,过滤“ 八、自动生成依赖性 在Makefile,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c中有一句“#include “defs.h””,那么我们的依赖关系应该是...GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件,为每一个“name.c”的文件都生成一个“name.d”的Makefile文件,[.d]文件中就存放对应[.c]文件的依赖关系。...于是,我们可以写出[.c]文件和[.d]文件的依赖关系,并让make自动更新或自成[.d]文件,并把其包含在我们的主Makefile,这样,我们就可以自动化地生成每个文件的依赖关系了。...要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如前面提到的“make clean”形式) 任何在makefile的目标都可以被指定成终极目标,但是除了以“-”打头,或是包含了“=

4.3K20

Linux基础操作

写入到文件。 追加重定向:不覆盖,从下一行开始写入。...输入重定向: more 一页一页的显示文件内容 less 显示文件内容:(相对与more来说,可以上下翻看查看) head 获取文件头多少行 head -几行 文件名 tail 获取文件尾后几行 tail...grep 在文件查找字符串,并打印出来。 zip/unzip 打包,压缩,解压缩。 -r:递归式压缩,把目录以及子目录一并处理。 tar 打包,压缩,解压。...自动化的进行程序的编译链接,make会在当前文件查找makefile或者Makefile。...makefile的写法: 目标:依赖项 目标和依赖项的依赖关系 执行make,默认只执行makefile里面的第一个依赖关系。下面的目标都可以用make 目标的方法执行。

47020

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

3 Makefile书写规则 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。...3.8 自动生成依赖性 在Makefile,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c中有一句“#include "defs.h"”,那么我们的依赖关系应该是:    ...GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件,为每一个“name.c”的文件都生成一个“name.d”的Makefile文件,[.d]文件中就存放对应[.c]文件的依赖关系。...于是,我们可以写出[.c]文件和[.d]文件的依赖关系,并让make自动更新或自成[.d]文件,并把其包含在我们的主Makefile,这样,我们就可以自动化地生成每个文件的依赖关系了。...要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如前面提到的“make clean”形式)任何在makefile的目标都可以被指定成终极目标,但是除了以“- ”打头,或是包含了“=

2.7K20

make menuconfig执行流程分析

如果你的makefile的第一个目标是由许多个目标组成,你可以指示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(make clean)。...任何在makefile的目标都可以被指定成终极目标,但是 除了以“-”打头,或是包含了“=”的目标,因为有这些字符的目标,会被解析成命令行参数或是变量。...递归进行时,这两个变量被传递进子makefile。...如果你的makefile的第一个目标是由许多个目标组成,你可以指示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(make clean)。...任何在makefile的目标都可以被指定成终极目标,但是 除了以“-”打头,或是包含了“=”的目标,因为有这些字符的目标,会被解析成命令行参数或是变量。

3.5K10

深入理解Android Build系统

在Linux系统,我们可以通过make命令来编译代码。Make命令在执行的时候,默认会在当前目录找到一个Makefile文件,然后根据Makefile文件的指令来对代码进行编译。...gcc,Linux系统的shell命令cp、rm等等。 看到这里,有的小伙伴可能会说,在Linux系统,shell和make命令有什么区别呢?...Make命令是怎么知道两个文件之间存在依赖关系,以及当被依赖文件发生变化时如何处理目标文件的呢?答案就在前面提到的Makefile文件。...Makefile文件最基础的功能就是描述文件之间的依赖关系,以及怎么处理这些依赖关系。...这个过程并不是在 droid 一个目标定义的,而是 droid 目标会依赖许多其他的目标,这些目标的互相配合导致了整个系统的编译。 那么需要编译出系统镜像,需要哪些依赖呢? !

1.8K60

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

第五部分、书写规则 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。...指明了我们的目标从$object获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.o bar.o”,也就是变量$object集合的模式,而依赖模式“%.c”则取模式“%.o”的“%”,也就是...八、自动生成依赖性 在Makefile,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的main.c 中有一句“#include "defs.h"”,那么我们的依赖关系应该是: main.o...于是,我们可以写出[.c]文件和[.d]文件的依赖关系,并让make自动更新或自成[.d]文件,并把其包含在我们的主Makefile,这样,我们就可以自动化地生成每个文件的依赖关系了。...当然,“自动化变量”除外,“$<”等这种类量的自动化变量就属于“规则型变量”,这种变量的值依赖于规则的目标和依赖标的定义。

3.1K20

make与makefile

首先:先向大家说明,make是一个命令行的命令,而makefile则是一个文件名称,make这个命令是用来执行makefile这个文件的 makefile: 1.mekefile编译过程: Makefile...同时这些依赖也有可能此时并不存在,需要现场制作,或者是由其他厨师做好,那么这个依赖就成为了其他规则的目标,该目标也会有他自己的依赖和命令。这样就形成了一层一层递归依赖组成了Makefile文件。...伪目标的存在告诉 Make 工具该目标不是用于生成文件,而是执行相应的操作。 组织和管理构建任务:伪目标可以用来组织和管理构建流程的各个任务或操作。...通过定义伪目标,可以将相关的任务组织在一起,并通过依赖关系和命令定义来控制它们的执行顺序。 提高可读性和可维护性:通过使用伪目标,可以使 Makefile 更具可读性和可维护性。...假如我们在系统的某一个目录下,创建一份名为hello.cc的文件,那么我们就在同一个目录下创建一个依赖对象为hello.cc的makefile即可,当我们进入目录后,在命令行输入make,系统就会在这一目录下查找是否存在

7010

Makefile基本用法

Makefile文件列出了依赖关系。默认执行第一行。 ? 其中,下面两行等价 ? ? 使用变量简化 添加objects变量后,形成以下简化形式。内容不变。 ?...然后在/lib目录,/usr/lib,和prefix/lib查找(/usr/local/lib)。...递归for循环 ? 一些等价 ? 使用了subst语法去掉了$@的output信息。 ? &是一个分组目标符号。 ?...依赖关系生成的格式为:target.o : target.c *.h 在这里将依赖关系写入了每个.d文件名对应的 文件, 的值是当前进程号,每两个 sed的替换命令,使用逗号作为分隔符,s,g作为开头和结尾...在替换的目标,\1表示替换的源的第一部分,然后添加.o和空格和该规则下的先决条件名。 sed将上一句生成的依赖关系的一些部分进行了替换,写入到了每个先决条件文件下。

2.5K40

C编译: makefile基础

UNIX系统下的make工具用于自动记录和处理文件之间的依赖关系。我们不用输入大量的"gcc"命令,而只需调用make就可以完成整个编译过程。所有的依赖关系都记录在makefile文本文件。...make是一个递归创建的过程: Base Case 1: 如果当前依赖关系没有说明前提文件,那么直接执行操作。...$@包含有当前依赖关系的目标文件名,而$^包含当前目标的前提文件: CC = gcc # helloworld is a binary file helloworld: test.o   echo...其他 makefile的续行符为\ makefile中经常会定义下面依赖关系: all: 如果make后没有跟随文件名,那么将执行该依赖关系。 clean: 常用于清理历史文件。...总结 make的核心功能是根据依赖关系来实现编译管理。 make的其他功能是让用户可以更加便捷的写出makefile

1.2K100

可移植的 Makefile 教程

Makefile 指定了依赖树的内容,并且提供了 Shell 命令来从目标的 先决条件(prerequisite) 生成目标。 ?...,但是还没有告诉 make 如何真正地从目标的先决条件构建出目标。...Recursive Makefiles 当你的项目被分为几个子目录,你可能会试图在每个子目录下放一个 Makefile ,然后递归调用。 不要使用递归Makefile。...它会在几个分离的 make 实例之间打破依赖树,并且常常会产生脆弱的构建。使用递归Makefile 毫无益处。好的选择是在项目的根目录放置一个 Makefile, 在那里进行调用。...有很多教程讲述了如何在构建时同时生成依赖,但是它很脆弱和缓慢。最好是在一次性完成,在 Makefile 写好依赖,以便于 make 能够如期工作。

1.3K10

程序员C语言快速上手——工程篇(十三)

实际上表达的是一种依赖关系,即要生成前面的target,所需要依赖的文件或是另一个目标 command 表示需要执行的命令。...,而Makefile脚本正是将这个依赖关系反过来描述,即一个可执行程序需要依赖哪些.o文件,每一个.o文件又依赖于哪些.c、.h文件。...message (STATUS ${CMAKE_C_SOURCE_FILE_EXTENSIONS}) message (STATUS ${CMAKE_CXX_SOURCE_FILE_EXTENSIONS}) 递归获取文件列表...aux_source_directory命令只能获取源码文件列表,且无法递归获取给定路径下的嵌套子文件夹下的各种源文件,这时可以使用file命令,结合GLOB_RECURSE参数,对指定的文件拓展名进行递归获取...# 递归遍历当前目录下的所有.c .cpp后缀名的文件,并将结果列表保存到SRC_LIST变量 FILE(GLOB_RECURSE SRC_LIST *.c *.cpp) # 打印 message (

3K30

Linux: Makefile自动化基础指南

接下来将详细介绍如何在Makefile调用当前脚本的目标,例如:make HOST=10.0.0.1 VERSION=v1.0 all。我们将通过具体示例和详细解释,帮助读者理解并掌握这一技巧。...all是一个伪目标,它依赖于build和deploy。 在Makefile调用目标 为了在Makefile调用目标,可以使用内置的$(MAKE)变量。...这在递归调用Makefile时特别有用。...复杂示例 以下是一个更复杂的示例,展示了如何通过递归调用Makefile的目标来处理不同的构建和部署场景: makefile # 定义变量 HOST = localhost VERSION = 1.0.0...总结 本文详细介绍了如何在Makefile调用当前脚本的目标,包含基础概念、环境变量的使用以及复杂示例的实现。通过学习这些内容,我们可以更灵活地使用Makefile来管理项目的构建和部署流程。

13010
领券