Makefile,目标作为依赖

时间:2014-07-08 15:27:49

标签: makefile target

我是Makefiles的新手,我正在尝试调试扩展到多个Makefile的内容。

  

target2:target1

     

命令1

目标1构建源代码(大约需要4个小时)。目标2只是将结果文件复制到某些目录中。

我已经制定了目标1.当我立即尝试制作目标2时,似乎认为它缺少一些文件/库并重建约5-10分钟。文件尚未移动或更改。我可以在目标1之后立即执行目标2,它将始终重建几分钟。

目标1和命令1正在创建相同的目录。此目录上的时间戳是否可能导致重建这些库?或者只是文件会触发重建与时间戳差异?

2 个答案:

答案 0 :(得分:1)

目标实际上是文件名。配方(命令)必须创建或更新该目标文件,否则make会认为目标丢失或过时,并将尝试在下次运行时重建它;除非它是每次都重建的虚假目标。

使用make选项调用-d以查看其正在构建的目标及其原因。

答案 1 :(得分:0)

请参阅,GNU make默认将所有目标名称视为文件名,以便您可以从先决条件列表中生成一些文件,如下面的示例所示,main.o目标文件将通过编译生成{{1与main.c

main.h

然而,这并不总是你想要做的事情,有时候你想要一个名为main.o : main.c defs.h gcc -c main.c 的目标做一些在执行目标foo之前需要完成的事情,这是完全可以的除了你需要告诉make bar不是文件名,这样它就不会尝试生成名为foo的文件。你在这里需要的是一个foo目标。伪目标是一个实际上不是文件名的目标;相反,它只是在您发出明确请求时要执行的配方的名称。 GNU Make Manual on Phony Targets

.PHONY

在上面的示例中,.PHONY: foo foo: bar 被告知不要将目标foo视为文件名,因此不要尝试生成名为make的文件。

在您的情况下,foo可能取决于target that has no recipe 或者您可能有一个与target1同名的文件,以便target1始终尝试构建此文件(在这种情况下,您需要make目标),或者最终您构建.PHONY后,可能会以某种方式更改时间戳或目标文件,以便target1认为需要重新重建它。

此外,在您的make中,您可能会构建target1无法分析的内容,因此无法判断它是否已构建;这包括使用某些类型的档案,生成或转换文本,在子例程中调用另一个构建系统(例如make)等。