如何在没有固定起点的依赖关系图中指定从哪里开始

时间:2012-02-25 07:56:49

标签: build makefile scons

我正在使用更像网络的工具链。有许多备用起点,所有这些都产生了单一的最终输出。

我通常使用make或scons - 实际上,我更喜欢scons,但我的团队非常喜欢make。我对其他构建工具持开放态度。

E.g。 final_result取决于倒数第二个

final_result: penultimate

倒数第二个可以用几种不同的方式制作:

如果从file1开始,那么

penultimate: file1 ; rule1

如果从file2开始,那么

penultimate: file2 ; rule2

问:如何指定以file2开头,而不是file1?

我想我可以使用命令行开关和ifdeffing。但我宁愿让make或scons弄清楚“嘿,周围有一个文件2,所以我应该使用rule2,而不是fil1 / rule1”。部分原因是网络比这复杂得多......

更糟糕的是,有时一条路上的中间人可能是另一条路上的中间人。我们来看看:

A。生成.diag

foo.diag: foo.s

但有时没有.s,我只有一个其他人给我已经建成的.diag。

.diag生成.heximg和.hwresult

foo.hwresult: hwsim foo.heximg

foo.heximg: foo.diag

但有时我直接给予.img

我只想编写整体依赖图,并说“好了,现在这就是我给出的 - 现在你如何得到最终结果?”

凭借我现在所拥有的,当我得到一个foo.img时,我被告知(在这种情况下是make)“foo.s not dfound”。因为make想要在依赖图中一直返回来判断foo.img是否过时,而我想说“假设foo.img是最新的,并且为依赖于foo.img的东西工作转发而不是回去foo.img所依赖的东西。“

2 个答案:

答案 0 :(得分:2)

您必须使用模式规则(隐式规则)完成所有操作。如果您指定了一个显式规则,那么make会认为这是一个硬依赖项,如果不满足某些依赖项,make就会失败。

如果您使用隐式规则,那么make将考虑构建目标的可能方式。如果这种方式不起作用(因为某些先决条件不存在而且make不知道如何构建它),make会尝试另一种方式。如果没有办法,并且目标已经存在,make将只使用该目标而无需更新它。

另外你说“.diag生成.heximg和.hwresult”然后给出了一个奇怪的示例makefile语法我无法识别,但是FYI带有模式规则你可以指定单个命令生成多个输出(你不能用明确的规则来做到这一点):

%.heximg %.hwresult: %.diag

这是坏消息:在GNU make中定义隐式规则的唯一方法是文件名中是否存在共同的“词干”。也就是说,您可以编写一个隐式规则,通过编写模式规则“%。heximg:%。diag”将foo.diag转换为foo.heximg,因为它们有一个共同的词干“foo”,但是没有办法创建一个编译规则从“foo1”到“倒数第二”,因为它们没有共同的词干。

答案 1 :(得分:1)

我不确定,但可能您正在寻找Double-Colon Rules

  

双冒号规则是在目标名称后使用::而不是:编写的显式规则。当同一目标出现在多个规则中时,它们的处理方式与普通规则不同。

     

双冒号规则有点模糊,通常不太有用;它们为用于更新目标的方法根据导致更新的先决条件文件而不同的情况提供了一种机制,这种情况很少见。