GNU makefile规则是否可以将流程作为需求,如果是这样的话?

时间:2016-07-27 10:29:20

标签: makefile process

在我的软件构建自动化的某一步,我尝试使用GNU make Makefiles实现,我遇到的情况是,不仅要求目标是源文件,而是作为一种不同类型的要求我想要启动依赖于另一个软件的目标,因此作为操作系统过程存在。

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

我想写一条有点像这样的规则:

.PHONY: firefoxprocess

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

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

如我所见,我认为.PHONY目标在某种程度上是非文件目标,因此可以要求启动进程? 但我不确定这是否正确。 GNU make的文档非常好而且非常大,我完全不确定它。据我所知,文档并没有真正报告规则中使用的进程的使用情况,这就激发了这里的问题。

我的感觉是pidfiles在某些过程和文件之间存在联系,但是它们有几个问题(即竞争条件,唯一性等)

1 个答案:

答案 0 :(得分:0)

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

  1. 创建一个表示步骤的文件,或
  2. 只是作为步骤的一部分“在线”完成工作。
  3. 第二种选择通常最简单。例如,如果要在可能尚不存在的目录中创建目标文件,则不希望将目录名称本身作为依赖项,因为这会导致文件在目录更改时过期。相反,我做:

    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文件。如果 在文件退出时成功删除该文件,并在重新启动时重新创建该文件,则会出现一个新问题:文件上的时间戳虚假地将任何依赖关系定义为过时,实际上重新启动的进程没有使它们失效。