有没有办法在每次使用时重新评估变量的定义?例如:
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文件之前,我不知道它们的文件名,所以我不能显式地声明带有文件名的变量。我需要的变量是设置与地图文件的列表,一旦他们已经生成。任何建议都会非常有帮助。谢谢。
发布于 2009-02-16 22:39:42
您可以尝试执行递归make,如下所示
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 $@发布于 2009-03-22 05:21:44
使用GNU make,您可以利用makefile remaking特性,该特性会使GNU make在初始遍历期间包含的任何makefile发生更改时自动重新启动。例如:
.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声明为伪目标可确保在运行构建时始终重新生成它;这取决于您的需求是否合适。
发布于 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。
https://stackoverflow.com/questions/554742
复制相似问题