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

如何在GNU makefile中扩展变量时限制递归深度?

在GNU makefile中,可以通过使用条件判断和递归调用来限制变量的递归深度。下面是一个示例:

代码语言:txt
复制
# 定义递归深度的最大值
MAX_DEPTH := 5

# 定义递归变量
recursive_var = $(if $(filter $(depth),$(MAX_DEPTH)),,$(call recursive_func,$(depth)))

# 定义递归函数
define recursive_func
    # 增加递归深度
    depth := $(shell echo $$(($(1) + 1)))
    
    # 条件判断递归深度是否超过最大值
    $(if $(filter $(depth),$(MAX_DEPTH)),,$(call recursive_func,$(depth)))
    
    # 执行其他操作,例如打印递归深度
    @echo Recursive depth: $(depth)
endef

# 默认目标
all:
    # 调用递归变量
    $(recursive_var)

在上述示例中,我们通过定义MAX_DEPTH变量来限制递归的深度,这里设置为5。然后,我们定义了一个递归变量recursive_var,它使用条件判断和递归调用来限制递归深度。在递归函数recursive_func中,我们增加递归深度并进行条件判断,如果递归深度未超过最大值,则继续递归调用。最后,我们在默认目标all中调用递归变量recursive_var

使用以上的makefile,可以限制递归深度在5以内。你可以根据实际需求调整MAX_DEPTH的值来限制不同的递归深度。

请注意,上述示例中没有提及具体的腾讯云产品和链接地址,因为该问题与云计算品牌商无关。

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

相关·内容

Linux: Makefile自动化基础指南

Makefile调用目标 为了在Makefile调用目标,可以使用内置的$(MAKE)变量。这是一个特殊变量,确保使用当前的Make命令及其所有参数。这在递归调用Makefile特别有用。...Makefile支持使用环境变量,可以通过在命令行传递变量的方式来覆盖Makefile的默认值。...复杂示例 以下是一个更复杂的示例,展示了如何通过递归调用Makefile的目标来处理不同的构建和部署场景: makefile # 定义变量 HOST = localhost VERSION = 1.0.0...处理多值变量 我们将在现有的复杂示例基础上,扩展Makefile以同时处理两个HOST和两个VERSION。为了实现这一点,我们将使用for循环和$(MAKE)递归调用。...总结 本文详细介绍了如何在Makefile调用当前脚本的目标,包含基础概念、环境变量的使用以及复杂示例的实现。通过学习这些内容,我们可以更灵活地使用Makefile来管理项目的构建和部署流程。

12810

makefile

GNU make工作的执行步骤如下: 1、读入所有的Makefile。...(2)变量定义:在Makefile可以定义一系列的变量变量一般都是字符串,当Makefile被执行时,变量的值会被扩展到相应的引用位置上。...(5)注释:Makefile只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,如果你要在你的Makefile中使用“#”字符,可以用反斜杠进行转义,:“\#”。...2.1 Makefile变量 (1)Makefile定义的变量,与C/C++语言中的宏一样,代表一个文本字串,在Makefile被执行时候变量会自动地展开在所使用的地方。...以下给出了一些主要的预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。 $@ ——表示规则的目标文件集。

1.9K00

Linux 下的make命令与Makefile

在Unix世界,软件发布,特别是GNU这种开源软件的发布,其makefile都包含了编译、安装、打包等功能。 我们可以参照这种规则来书写我们的makefile的目标。...“隐含规则”会使用一些我们系统变量,我们可以改变这些系统变量的值来定制隐含规则的运行时的参数。系统变量CFLAGS 可以控制编译的编译器参数。我们还可以通过“模式规则”的方式写下自己的隐含规则。...用“后缀规则”来定义隐含规则会有许多的限制。使用“模式规则”会更回得智能和清楚,但“后缀规则”可以用来保证我们Makefile的兼容性。...有一点需要注意的是,% 的展开发生在变量和函数的展开之后,变量和函数的展开发生在make载入Makefile,而模式规则的% 则发生在运行时。...在上述所列出来的自动量变量。四个变量(@ 、< 、% 、* )在扩展只会有一个文件,而另三个的值是一个文件列表。

10.1K20

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

Makefile我们要定义一系列的变量变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。 4、文件指示。...特别注意的是,make是在读取Makefile就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量“$@”等)放入条件表达式,因为自动化变量是在运行时才有的。...在Unix世界,软件发布,特别是GNU这种开源软件的发布,其makefile都包含了编译、安装、打包等功能。我们可以参照这种规则来书写我们的makefile的目标。...在“隐含规则链”,禁止同一个目标出现两次或两次以上,这样一来,就可防止在make自动推导出现无限递归的情况。 Make会优化一些特殊的隐含规则,而不生成中间文件。...这个动作很像数据库的”扩展C”语言(即在C语言中用”EXEC SQL”的样子执行SQL语句,在用cc/gcc编译之前,需要使用”扩展C”的翻译程序,cpre,把其翻译成标准C)。

4.3K20

探索Linux内核:Kconfig的秘密

KBuild 组件式建筑,称为递归制作,是GNU的一种常见方式。制作,使管理一个大型项目。KBuild是递归make的一个很好的例子。...通过将源文件划分为不同的模块/组件,每个组件都由自己的Makefile管理。当您开始构建,顶级Makefile按正确的顺序调用每个组件的makefile,构建组件,并将它们收集到最终的执行程序。...看看如何在Linux内核实现递归make,并借助简化的Makefile代码: # In top Makefile vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps...virt-y))) # The entry of recursive make $(vmlinux-dirs): $(Q)$(MAKE) $(build)=$@ need-builtin=1 递归的配方扩展...在管理一个大型项目,您需要很多这样的规则;所有这些规则都会乏味。幸运的是,大多数现代C编译器可以通过查看#include源文件的行。

1.7K11

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

Makefile我们要定义一系列的变量变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。 文件指示。...特别注意的是,make是在读取Makefile就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量“$@”等)放入条件表达式,因为自动化变量是在运行时才有的。...在Unix世界,软件 发布,特别是GNU这种开源软件的发布,其 makefile都包含了编译、安装、打包等功能。我们可以参照这种规则来书写我们的makefile的目标。...在“隐含规则链”,禁止同一个目标出现两次或两次以上,这样一来,就可防止在make自动推导出现无限递归的情况。 Make 会优化一些特殊的隐含规则,而不生成中间文件。...在上述所列出来的自动量变量。四个变量($@、$<、$%、$*)在扩展只会有一个文件,而另三个的值是一个文件列表。

2.7K20

可移植的 Makefile 教程

在我写 Makefile 的头 10 年里,我养成了一个非常不好的习惯 -- 完全严格使用 GNU Make 的扩展名。...虽然每个实现都实现了与 GNU Make 完全相同的一些扩展,但是它会捕获一些常见的错误。 什么是 Makefile?...Recursive Makefiles 当你的项目被分为几个子目录,你可能会试图在每个子目录下放一个 Makefile ,然后递归调用。 不要使用递归Makefile。...使用递归Makefile 毫无益处。好的选择是在项目的根目录放置一个 Makefile, 在那里进行调用。你可能需要告诉你的编辑器如何做到这一点。 当涉及子目录下的文件,在名字包含子目录即可。...有很多教程讲述了如何在构建同时生成依赖,但是它很脆弱和缓慢。最好是在一次性完成,在 Makefile 写好依赖,以便于 make 能够如期工作。

1.3K10

Android.mk语法解析

Android.mk将是GNU Makefile的一部分,且将被Build System解析一次或多次。 所以,请尽量少的在Android.mk声明变量,也不要假定任何东西不会在解析过程定义。...CLEAR_VARS include $(CLEAR_VARS) clear_vars变量由构建系统提供,并指向一个特殊的GNU makefile,它将为您清除许多LOCAL_xxx变量。...注意,C++源文件的默认扩展名是“.CPP”。但是,可以通过定义变量LOCAL_CPP_EXTENSION来指定不同的变量本地扩展名。不要忘记初始点(即“.cxx”有效,而不是“cxx”)。...小写字母名字:my-dir 如果想要定义自己在Android.mk中使用的变量名,建议添加MY_前缀。...LOCAL_CFLAGS LOCAL_CFLAGS += -I 一个可选的设置,在编译C/C++ source 添加Flags LOCAL_STATIC_LIBRARIES 要链接到本模块的静态库

1.7K00

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

Makefile我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。 4、文件指示。...五、make的工作方式 GNU的make工作的执行步骤入下:(想来其它的make也是类似) 1、读入所有的Makefile。 2、读入被include的其它Makefile。...而在完成下层make后离开目录,我们会看到: make: Leaving directory `/home/hchen/gnu/make' 当你使用“-C”参数来指定make下层Makefile,“...二、变量变量 在定义变量的值,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来在用变量定义变量的值。...但这种形式也有不好的地方,那就是递归定义,: CFLAGS = $(CFLAGS) -O 或: A = $(B) B = $(A) 这会让make陷入无限的变量展开过程中去,当然,我们的make是有能力检测这样的定义

3.1K20

Makefile基本用法

Makefile文件列出了依赖关系。默认执行第一行。 ? 其中,下面两行等价 ? ? 使用变量简化 添加objects变量后,形成以下简化形式。内容不变。 ?...当一个先决条件的名称的格式为'-lname',make通过搜索文件来专门处理它libname.so文件 如果找不到,则在当前目录的libname.a文件 在通过匹配vpath搜索路径和vpath搜索路径指定的目录...然后在/lib目录,/usr/lib,和prefix/lib查找(/usr/local/lib)。...递归for循环 ? 一些等价 ? 使用了subst语法去掉了$@的output信息。 ? &是一个分组目标符号。 ?....POSIX 如果.POSIX被称为目标,那么makefile将被解析并以符合POSIX的模式运行。 变量导出 使用export进行导出,供子makefile使用。

2.5K40

linux下,Makefile是啥??

为什么要学习Makefile? Linux环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是Unix程序员。...最好不要用“GNUmakefile”,是GNU的make识别的。...在Makefile我们要定义一系列的变量变量一般都是字符串,这个有点像你C语言中的 宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。 文件指示。...Makefile只有行注释,和UNIX的Shell脚本一样,其注释是用#字符,这个就 像C/C++的//一样。如果你要在你的Makefile中使用#字符,可以用反斜杠进行 转义,:\# 。...make的工作方式 make的执行步骤如下: 读入所有的Makefile。 读入被include的其它Makefile。 初始化文件变量。 推导隐晦规则,并分析所有规则。

1.2K20

伯克利人工智能研究院开源深度学习数据压缩方法Bit-Swap,性能创新高

作者 | Friso Kingma 译者 | Tianyu 责编 | 夕颜 出品 | AI科技大本营(ID: rgznai100) 【导读】在本篇文章,伯克利人工智能研究院(BAIR)介绍了一种可扩展的...该技术基于之前的 bits-back 编码和非对称数字系统,对隐变量模型进行压缩的方法进行了扩展。在实验,Bit-Swap 在高度多样化的图集的表现上超过了压缩器的 benchmark。...当一次性压缩较长的序列,这种额外的开销就显得很微不足道了。 ? 成果 当我们把隐变量模型设计成复杂的高密度估计器,模型被限制在全因子分布上,这会影响模型的灵活性。...我们通过递归的方式对隐变量模型进行扩展,将全因子先验分布替换为第二个隐变量模型,将其先验替换为第三个隐变量模型,以此类推。 ?...Bit-Swap 有以下几个优势: 用递归的形式使用 bits-back 编码可以节省模型的开销,而且不会随模型的深度增加而增加。

98300

Makefile学习2

ifdef 关键字 ifdef 关键字用来判断一个变量是否已经定义。如果变量的值非空(在Makefile,没有定义的变量的值为空),表达式为真。...ifndef 关键字 ifndef关键字和ifdef相反,如果一个变量没有定义,表达式为真。 Makefile函数 GNU make 提供了大量的函数用来处理文件名、变量、文本和命令。...如果在参数引用了变量变量的引用建议和函数引用使用统一格式:要么是一对小括号,要么是一对大括号。...通配符 在Makefile中表示一个文件名,可以使用通配符。...匹配任意一个字符 [] 我们可以指定匹配的字符放在 “[]” 除此之外,Makefile还有经常使用的几个自动变量也可以看做特殊通配符: $@:所有目标文件 $^:目标依赖的所有文件 $<:第一个依赖文件

30810

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

C语言工程构建 shell脚本(bat脚本) Makefile 脚本 基本语法规则 补充说明 CMake工具 安装 简单示例 基础规则 外部构建 定义变量 内置变量 命令 指定构建环境 生成 Makefile...Makefile 脚本 Makefile 脚本文件是GNU make 工具的输入文件,它也包含一套自己的语法规则,它也能帮助C语言实现编译和链接。...CMake工具 它首先允许开发者编写一种平台无关的 CMakeLists.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 或工程文件,Linux 下的...sub.c mul.c div.c),此外,还可以通过设置变量BUILD_SHARED_LIBS来修改默认行为,当该变量为真,默认会生成动态库, # 使用option命令定义选项 option(BUILD_SHARED_LIBS...# 递归遍历当前目录下的所有.c .cpp后缀名的文件,并将结果列表保存到SRC_LIST变量 FILE(GLOB_RECURSE SRC_LIST *.c *.cpp) # 打印 message (

3K30

makefile从入门到放弃——博主吐血整理的笔记

文件: $ make #默认生成第一个文件 $ make '目标名'#选择性的编译 当工程的文件名和makefile的目标重名,就会有伪目标。...: 变量变量含义 – $* 不包含扩展名的目标文件名称 – $+ 所有的依赖文件,以空格分开,并以出现后的先后为序,可能包含重复依赖文件 – $< 第一个依赖文件的名称 – $?...变量定义的两种方式 - 递归展开方式 VAR=var - 简单方式 VAR: =var 一般使用递归展开方式进行变量定义 变量的使用 示例1: dir :=/foo/bar...,但是不执行这些命令 -p 显示make变量数据库的隐含规则 -s 在执行命令不显示命令 -w 如果执行make在执行过程改变目录,打印当前目录名 当然makefile也可以像C语言一样调用其他的...如果执行总控 Makefile ,make 命令带有参数或者在上层的 Makefile 定义了这个变量,那么 MAKEFLAGS 变量的值将会是 make 命令传递的参数,并且会传递到下层的 Makefile

1.6K20

Ubuntu下如何安装并使用Objective-C

它跟Java相比更接近底层,你可以直接在里面写内联汇编或直接与汇编文件一起连接(因为它就是C语言,在C语言基础上扩展了SmallTalk的消息机制与OO机制)。...下面我将为大家介绍如何在最新版本的 Ubuntu下(14.10)来安装、编译Objective-C。...Unicode前缀字面量表达式——u'加',表示一个UTF-16字符,因此我们在GNUmakefile也加入了-std=gnu11这个编译选项来使得编译器使用最新的C11标准与GNU规范语法扩展。...,我这里的做法是将汇编文件单独编译成.o目标文件,然后再跟其它makefile编译好的目标文件进行连接。...其余一些可用的make变量见如下链接: http://www.gnu.org/software/gnustep/resources/documentation/Developer/Gui/ProgrammingManual

81700

Linux下automake工具使用(自动构建Makefile文件)

一、前言 linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划,设计出了一种叫做Autoconf...格式详解 6.1 Makefile.am可用的全局变量 变量 含义 示例 INCLUDES 链接所需要的头文件 LDADD 链接所需要的库文件 LDFLAGS 链接所需要的库文件选项标志 EXTRA_DIST...配置打包需要打包的其他文件 SUBDIRS 设置处理本目录之前需要递归处理的子目录 示例: SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA...可用的路径变量Makefile.am尽量使用相对路径,系统预定义了两个基本路径: 路径变量 含义 $(top_srcdir) 工程最顶层目录,用于引用源程序 $(top_builddir) 定义了生成目标文件最上层目录...:example_SCRIPTS,如果用这样的话,需要我们自己定义安装目录下的example目录 DATA。数据文件,不能执行。

6.1K21
领券