重新评估makefile变量

时间:2009-02-16 22:00:13

标签: variables makefile

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

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文件生成之前的文件名,因此我无法明确声明带有文件名的变量。我需要在生成映射文件列表后设置变量。任何建议都会非常有帮助。感谢。

3 个答案:

答案 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