首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新评估makefile变量

重新评估makefile变量
EN

Stack Overflow用户
提问于 2009-02-16 22:00:13
回答 3查看 3.8K关注 0票数 11

有没有办法在每次使用时重新评估变量的定义?例如:

代码语言:javascript
复制
MAP_FILES = $(shell find $(TMP) -name "*.map")

all: generate_map_files work_with_map_files

generate_map_files:
   ./map-builder

work\_with\_map_files: $(MAP_FILES)
   ./map-user

%.map:
   ./map-edit $@

因此,在读取makefile时将计算MAP_FILES,如果$TMP目录中没有.map文件,则该变量将为空。但是,在generate_map_files规则完成之后,目录中将有.map文件,我希望这些.map文件的列表是work_with_map_files规则的先决条件。

在生成.map文件之前,我不知道它们的文件名,所以我不能显式地声明带有文件名的变量。我需要的变量是设置与地图文件的列表,一旦他们已经生成。任何建议都会非常有帮助。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-16 22:39:42

您可以尝试执行递归make,如下所示

代码语言:javascript
复制
MAP_FILES = $(shell find $(TMP) -name "*.map")

all: generate_map_files

generate_map_files:
   ./map-builder; $(MAKE) work_with_map_files

work\_with\_map_files: $(MAP_FILES)
   ./map-user

%.map:
   ./map-edit $@
票数 5
EN

Stack Overflow用户

发布于 2009-03-22 05:21:44

使用GNU make,您可以利用makefile remaking特性,该特性会使GNU make在初始遍历期间包含的任何makefile发生更改时自动重新启动。例如:

代码语言:javascript
复制
.PHONY: map_files.d
-include map_files.d
map_files.d:
        ./map_builder
        echo "work_with_map_files: `ls *.map`" > map_files.d

work_with_map_files:
        ./map_user

除了makefile remaking特性之外,此解决方案还利用了GNU make允许您为目标指定多行先决条件这一事实。在这种情况下,映射文件prereqs在动态生成的map_files.d文件中声明。将map_files.d声明为伪目标可确保在运行构建时始终重新生成它;这取决于您的需求是否合适。

票数 4
EN

Stack Overflow用户

发布于 2009-02-16 22:13:48

一般来说,这在Makefiles中是不可能的,因为要确定要创建什么目标以及以什么顺序,make需要在执行规则之前提前知道它们的依赖关系。

在您的示例中,make如何知道何时评估work_with_map_files规则中的$(MAP_FILES)?顺序不是显式定义的,而是从依赖关系中推导出来的。在您的示例中,您希望在执行generate_map_files规则之后对其求值,但make无法知道这一点,因为它需要知道依赖项的此变量的值,这些依赖项是确定求值顺序所必需的-这是一个自引用循环。

当然,一个简单的技巧是运行make两次-您可以通过在generate_map_files模板中的./mapbuilder命令之后添加一个make work_with_map_files命令来自动完成这一操作,但总体上要小心,因为如果work_with_map_files实际上被声明为依赖于generate_map_files (它应该这样做),这将导致无限的递归make循环。当然,这破坏了make自动确定顺序的想法。否则,您将需要一个make替换,这可以在这样的订单上提示,并进行多次通过。

这就是为什么在包含多个包含文件的较大代码库中,人们不希望在Makefile中重复包含依赖项的情况下,通常使用makedepend来生成包含这些依赖项的单独Makefile,该文件包含在主Makefile中。要构建一个,首先运行make depend,它调用makedepend来生成包含文件依赖项,然后运行make

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/554742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档