[英]How do I tell a Makefile which dependencies are satisfied by which target
我正在創建一個Makefile,以驅動XML文檔檔案庫中EPUB3電子書的生成。 我無法理解如何告訴做一個特定的文件名或目錄的依賴可以通過另一個目標得到滿足。
大大簡化:
dir:
mkdir testing
files: testing
echo foobar >testing/blort
這當然會產生:
% make files
make: *** No rule to make target `testing', needed by `files'. Stop.
目標文件需要存在測試目錄才能正常工作。 我如何告訴做出該目錄可以通過執行目標目錄中創建?
(在這種簡化的情況下,答案是使測試依賴項成為目標目錄,而不是硬目錄名稱。)
但是實際上,這些食譜很長,並且會做很多其他事情(例如,從XML文檔中提取元數據),並且使用變量而不是硬編碼的文件名。 有沒有辦法告訴做出一個具體的文件名或目錄的依賴性可以通過執行另一個目標感到滿意? 還是我需要將整個事情分解成原子(基本上每個目標一個shell命令)?
實際上,有沒有辦法告訴做出靶X創建文件y? 這是模式規則可以做到的(我從未使用過的make的一部分)嗎?
有沒有辦法告訴目標x創建文件y
您需要調整術語。 目標是被創造的東西。 配方 (shell命令或其他命令)創建目標。 前提條件是用於創建目標的文件或目標,因此,如果前提條件比目標新,則需要更新目標(使用配方)。 Make首先會遞歸地將每個先決條件視為目標,然后嘗試確保它是最新的。
然后編寫規則:
<target> : [<prerequisite> [<prerequisite> ...]]
<recipe>
因此,如果要編寫一個從先決條件x創建文件y的規則,則應編寫:
y : x
<recipe>
在上面的示例中,您依賴於先決條件testing
,但是您沒有建立目標testing
規則。 您有一個建立目標dir
的規則,這沒有幫助。 重寫規則:
testing:
mkdir testing
(盡管這並不是處理目錄的好方法)。
如果您對Makefile中的文件夾有依賴性,則應使用僅順序先決條件,而不是常規先決條件。 使用僅訂購的先決條件,該文件夾將僅創建一次,make不會在乎時間戳記。
例:
all: testing/file1.txt testing/file2.txt
testing:
@mkdir -p testing
testing/file1.txt: | testing
<generate testing/file1.txt>
testing/file2.txt: | testing
<generate testing/file2.txt>
它認為您應該始終使用make-targets創建文件夾,尤其是如果兩個或多個目標依賴於該文件夾時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.