有没有办法在每次使用时重新评估变量的定义?例如:
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文件生成之前的文件名,因此我无法明确声明带有文件名的变量。我需要在生成映射文件列表后设置变量。任何建议都会非常有帮助。感谢。
答案 0 :(得分:4)
您可以尝试进行递归制作,例如
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 $@
答案 1 :(得分:3)
使用GNU make,您可以利用makefile重新制作功能,如果在初始传递期间更改了任何包含的makefile,GNU make会自动重新启动。例如:
.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重新映射功能之外,此解决方案还利用了GNU make允许您为目标指定多行先决条件的事实。在这种情况下,映射文件prereqs在动态生成的map_files.d文件中声明。将map_files.d声明为PHONY目标可确保在运行构建时始终重新生成它。根据您的需要,可能适合也可能不适合。
答案 2 :(得分:0)
通常,这在Makefile中是不可能的,因为要确定要制作的目标以及以什么顺序,make
需要在执行规则之前事先知道它们的依赖关系。
在您的示例中,make
如何知道何时评估$(MAP_FILES)
规则中的work_with_map_files
?订单未明确定义,但是从依赖项中推断出来。在您的示例中,您希望在执行generate_map_files
规则后对其进行评估,但make
无法知道这一点,因为它需要知道此变量的值是否为需要确定评估此值的顺序 - 这是一个自引用循环。
一个简单的技巧当然是运行make两次 - 您可以通过在make work_with_map_files
模板中的./mapbuilder
命令之后添加generate_map_files
命令自动完成,但要小心通常,因为如果work_with_map_files
实际上声明依赖于generate_map_files
(它应该),这将导致无限递归make
循环。当然,这违背了make
自动确定订单的想法。否则,您需要make
替换,可以在此类订单上暗示并进行多次传递。
这就是为什么在包含多个包含文件的较大代码库中,其中一个不想重复Makefile
中的包含依赖项,makedepend
通常用于生成单独的Makefile依赖关系,包含在主Makefile
中。要构建一个,然后运行第一个make depend
,调用makedepend
以生成包含文件依赖项,然后make
。