当我有一个需要在另一个目标之前制作特定目标的制作任务时,在并行模式下,使用 SunPro Make (dmake) 时这很简单。以下生成文件:
install: dir dir/file
dir:
mkdir dir
dir/file:
cp source dir/file
可以通过将第一行更改为:
install: dir .WAIT dir/file
或通过使用:
.NO_PARALLEL: install
makefile 的其余部分仍将在并行模式下处理,即使是左侧或右侧目标的列表.WAIT
也将以并行模式处理。
请参阅:http ://schilytools.sourceforge.net/man/man1/make.1s.html和http://schilytools.sourceforge.net/man/man1/dmake.1.html
但 GNU make 似乎没有类似的选项。用 GNU make 真的没有办法做到这一点吗?
更具体地说,解决方案需要以允许使用其他 make 实现处理 makefile 的方式编写。
特殊目标 .WAIT 可以在一个依赖于 make 程序的宏中,例如 $(WAIT)
请注意,有一个明显的解决方案没有帮助:
从理论上讲,可以dir
依赖. dir/file
_ 结果,多次调用将一次又一次地复制到,而没有预期的结果,只有在源变得更新的情况下才进行复制dir
dir/file,
dir,
dir
dir/file
make
dir/file
make
dir/file.
这提出了另一个问题,是否可能存在强制在复制到之前make
创建而不依赖于dir
dir/file
dir
dir/file.
在 GNU make 中,您可以使用order-only-prerequisites来确保
dir
在创建规则dir/file
运行之前创建。有关详细信息,请参阅此页面。
您可以从 GNU make 手册中的示例中看到,它实际上是为在创建目录之前添加对正在创建的目录的依赖而量身定制的。
对于您的具体示例,应该这样做:
虽然您不需要修改现有规则,但您可以将该依赖项添加到 Makefile 的其他位置...
我认为这在其他 make 实现中不起作用......一种可能的解决方案是创建一个实际的
GNUmakefile
并添加 GNU make 特定扩展。include
Makefile
你也可以让 GNU make 忽略一个规则,比如
.WAIT
在你的GNUmakefile
.我希望这些指示对您有所帮助!
您需要添加依赖项,以便在它们下的文件之前创建目录。
可以对目录的依赖项使用“标记”文件,这样在其下创建文件不会触及目录的时间戳。这也不需要任何 GNU 制作特定的功能。
在您的示例中:
您可以使用类似
.directory
或.dir
或.folder
标记文件的东西......这是我自己的答案,它源自 Filipe Brandenburger 提出的想法和 Schily Makefile 系统中使用的通用方法:
makefile 系统确保以
make macros
这种方式设置以下内容:现在使用上面的宏定义的makefile:
$(NORULE)
sunpro
使用 gmake 和SunPro Make扩展至无。在 gmake 的情况下,整个 makefile 扩展为:
对于 SunPro Make,整个 makefile 扩展为:
最后一行被视为没有相关性的垃圾规则。