在我的软件构建自动化的某一步,我尝试使用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在某些过程和文件之间存在联系,但是它们有几个问题(即竞争条件,唯一性等)
答案 0 :(得分:0)
有时,Makefile依赖关系树包含的元素不是自然或必然是时间相关的文件。有两个答案:
第二种选择通常最简单。例如,如果要在可能尚不存在的目录中创建目标文件,则不希望将目录名称本身作为依赖项,因为这会导致文件在目录更改时过期。相反,我做:
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文件。如果 在文件退出时成功删除该文件,并在重新启动时重新创建该文件,则会出现一个新问题:文件上的时间戳虚假地将任何依赖关系定义为过时,实际上重新启动的进程没有使它们失效。