2016-07-27 15 views
0

在我尝试使用GNU Make Makefile实现的软件构建自动化的某些步骤中,我遇到了不仅要求将目标作为源文件的情况,而且作为一种不同类型的要求,我希望启动依赖于另一软件的目标,因此作为操作系统进程存在。GNU makefiles规则是否可以将流程作为需求来处理,如果是这样的话?

这样的程序可以是后台进程,也可以是前台进程,例如运行HTML5应用程序的Webbrowser,它可能在构建过程中发挥作用,例如通过与通过构建过程馈送的文件进行交互。

我会因此喜欢有点编写规则是这样的:

.PHONY: firefoxprocess 

Html5DataResultFile: HTML5DataSourceFile firefoxprocess 
    cp HTML5DataSourceFile folder/checked/by/html5app/ 
    waitforHtml5DataResultFile 

firefoxprocess: 
    /usr/bin/firefox file://url/to/html5app & 

正如所看到的我采取的想法,.PHONY目标是有点非文件的目标,因此将允许requirering的过程是开始了吗?但我不确定这是否正确。 GNU make的文档非常好,而且相当大,我完全不能理解它。就我所知,文档并没有真正报告规则中使用的流程的使用情况,这引发了这里的问题。

我的感觉一直是PID文件是有点进程和文件之间的联系,但他们提出的几个问题(即竞争条件,独特性等)

回答

0

有时一个Makefile的依赖关系树包含元素不自然或必然依赖于时间的文件。有两个答案:

  1. 创建一个文件来代表步骤,或
  2. 只是做“一致”的工作作为步骤的一部分。

第二个选项通常是最简单的。例如,如果要在尚不存在的目录中创建目标文件,则不希望将目录名称本身作为依赖项,因为只要目录更改就会导致文件过期。相反,我这样做:

d/foo: 
    @test -d d || mkdir -p d 
    ... 

就你而言,你可能有类似的东西;你只需要一种方法来测试一个正在运行的firefox实例,并且能够启动它。像这样的东西可能会做:

Html5DataResultFile: HTML5DataSourceFile 
    pgrep firefox || { /usr/bin/firefox && sleep 5; } 
    cp HTML5DataSourceFile folder/checked/by/html5app/ 
    waitforHtml5DataResultFile 

sleep电话只是让FF初始化,因为它可能还没有准备好做任何事情,它返回的瞬间。

在你的情况下选项#1的问题是它是不可靠的,有点圆形。如果进程死亡,Firefox将无法可靠地删除pid文件。如果确实在退出时成功移除了该文件,并在重新启动时重新创建该文件,则会出现一个新问题:文件上的时间戳会错误地将任何依赖项定义为过期,实际上重新启动的进程没有“无效他们。

相关问题