2016-07-27 14 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文件。如果確實在退出時成功移除了該文件,並在重新啓動時重新創建該文件,則會出現一個新問題:文件上的時間戳會錯誤地將任何依賴項定義爲過期,實際上重新啓動的進程沒有「無效他們。

相關問題