Make

如何使用 GNU make 部分序列化

  • May 3, 2018

當我有一個需要在另一個目標之前製作特定目標的製作任務時,在並行模式下,使用 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 手冊中的範例中看到,它確實是為在創建目錄之前添加對正在創建的目錄的依賴關係而量身定制的。

對於您的具體範例,應該這樣做:

dir/file: | dir
       cp source dir/file

雖然您不需要修改現有規則,但您可以將該依賴項添加到 Makefile 的其他位置…

更具體地說,解決方案需要以允許使用其他 make 實現處理 makefile 的方式編寫。

我認為這在其他 make 實現中不起作用……一種可能的解決方案是創建一個實際的GNUmakefile並添加 GNU make 特定擴展。includeMakefile

你也可以讓 GNU make 忽略一個規則,比如.WAIT在你的GNUmakefile.

我希望這些指針對您有所幫助!

您需要添加依賴項,以便在它們下的文件之前創建目錄。

可以對目錄的依賴項使用“標記”文件,這樣在其下創建文件不會觸及目錄的時間戳。這也不需要任何 GNU 製作特定的功能。

在您的範例中:

install: dir/file

dir/.marker:
       mkdir -p dir
       touch dir/.marker

dir/file: dir/.marker
       cp source dir/file

您可以使用類似.directory.dir.folder標記文件的東西……

引用自:https://unix.stackexchange.com/questions/441405