分享方式:


描述區塊

描述區塊會形成makefile的核心。 他們會描述 要建立的目標或檔案,以及其 相依性,以及建立目標所需的檔案。 描述區塊可能包含 命令,描述如何從相依性建立目標。 描述區塊是相依性行,選擇性地後面接著命令區塊:

targets... : dependents...
    commands...

相依性行

依性行 會指定一或多個目標,以及零個或多個相依專案。 如果目標不存在,或時間戳早於相依,NMAKE 會在命令區塊中執行命令。 如果目標為 虛擬目標,NMAKE 也會執行命令區塊。 以下是範例相依性行:

hi_bye.exe : hello.obj goodbye.obj helper.lib

在此相依性行中, hi_bye.exe 是目標。 相依性為 hello.objgoodbye.objhelper.lib。 相依性行會告訴 NMAKE 每當 hello.objgoodbye.objhelper.lib 最近變更時 hi_bye.exe,建置目標。

目標必須位於行的開頭。 任何空格或索引標籤都無法縮排。 使用冒號 (:) 將目標與相依項分開。 目標、冒號分隔符 (:) 和相依項目之間允許空格或索引標籤。 若要分割相依性行,請在目標或相依項目之後使用反斜杠 (\)。

執行命令區塊之前,NMAKE 會掃描所有相依性和任何適用的推斷規則,以建 置相依性樹狀結構。 相依性樹狀目錄會指定完整更新目標所需的步驟。 NMAKE 會遞歸地檢查相依性是否為另一個相依性清單中的目標。 建置相依性樹狀結構之後,NMAKE 會檢查時間戳。 如果樹狀結構中的任何相依專案比目標還新,NMAKE 會建置目標。

目標

相依性行的目標區段會指定一或多個目標。 目標可以是任何有效的檔名、目錄名稱或 虛擬目標。 使用一或多個空格或索引標籤來分隔多個目標。 目標不區分大小寫。 路徑可搭配檔名使用。 目標及其路徑不能超過 256 個字元。 如果冒號前面的目標是單一字元,請使用分隔空格。 否則,NMAKE 會將字母冒號組合解譯為磁碟驅動器規範。

多個目標

NMAKE 會評估單一相依性中的多個目標,就像是在個別的描述區塊中指定每個目標一樣。

例如,此規則:

bounce.exe leap.exe : jump.obj
   echo Building...

評估為:

bounce.exe : jump.obj
   echo Building...

leap.exe : jump.obj
   echo Building...

累計相依性

如果重複目標,相依性是描述區塊中的累計。

例如,這組規則,

bounce.exe : jump.obj
bounce.exe : up.obj
   echo Building bounce.exe...

評估為:

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

當您在單一描述區塊的多個相依性行中有多個目標時,NMAKE 會評估它們,就像是在個別的描述區塊中指定一樣。 不過,只有最後一個相依性行中的目標會使用命令區塊。 NMAKE 嘗試針對其他目標使用推斷規則。

例如,這組規則,

leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
   echo Building bounce.exe...

評估為:

leap.exe : jump.obj
# invokes an inference rule

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

climb.exe : up.obj
   echo Building bounce.exe...

多個描述區塊中的目標

若要使用不同命令在多個描述區塊中更新目標,請指定兩個連續冒號(::)目標與相依項目之間。

target.lib :: one.asm two.asm three.asm
    ml one.asm two.asm three.asm
    lib target one.obj two.obj three.obj
target.lib :: four.c five.c
    cl /c four.c five.c
    lib target four.obj five.obj

相依性的副作用

您可以指定具有冒號的目標(:)位於不同位置的兩個相依性行中。 如果命令只出現在其中一行之後,NMAKE 會將相依性解譯為相鄰或合併。 它不會針對沒有命令的相依性叫用推斷規則。 相反地,NMAKE 會假設相依性屬於一個描述區塊,並執行以另一個相依性指定的命令。 請考慮下列一組規則:

bounce.exe : jump.obj
   echo Building bounce.exe...

bounce.exe : up.obj

評估為:

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

如果使用雙冒號 (::) ,則不會發生這個效果。 例如,這組規則:

bounce.exe :: jump.obj
   echo Building bounce.exe...

bounce.exe :: up.obj

評估為:

bounce.exe : jump.obj
   echo Building bounce.exe...

bounce.exe : up.obj
# invokes an inference rule

虛擬目標

虛擬目標是用來取代相依性行中檔名的標籤。 它會解譯為不存在的檔案,因此已過期。 NMAKE 假設虛擬目標時間戳與其所有相依專案的最新時間戳相同。 如果沒有相依專案,則會假設目前的時間。 如果使用虛擬目標作為目標,則一律會執行其命令。 做為相依專案的虛擬目標,也必須在另一個相依性中顯示為目標。 不過,該相依性不需要有命令區塊。

虛擬目標名稱會遵循目標的檔名語法規則。 不過,如果名稱沒有擴展名,它可能會超過檔名的8個字元限制,而且長度最多可達256個字元。

當您想要 NMAKE 自動建置多個目標時,虛擬目標會很有用。 NMAKE 只會建置命令行上指定的目標。 或者,如果未指定任何命令行目標,它只會建置makefile中第一個相依性中的第一個目標。 您可以告訴 NMAKE 建置多個目標,而不需在命令行上個別列出目標。 撰寫包含虛擬目標之相依性的描述區塊,並列出您想要建置的目標作為其相依專案。 然後,將此描述區塊放在makefile中,或在NMAKE命令行上指定虛擬目標。

在此範例中,UPDATE 是虛擬目標。

UPDATE : *.*
COPY $** c:\product\release

評估 UPDATE 時,NMAKE 會將目前目錄中的所有檔案複製到指定的磁碟驅動器和目錄。

在下列makefile中,虛擬目標all會同時建置 project1.exe ,如果在project2.exeall命令行上指定或未指定目標,則為 。 虛擬目標 setenv 會在更新檔案之前 .exe 變更 LIB 環境變數:

all : setenv project1.exe project2.exe

project1.exe : project1.obj
    LINK project1;

project2.exe : project2.obj
    LINK project2;

setenv :
    set LIB=\project\lib

相依性

在相依性行中,使用任何有效的檔名或虛擬目標,在冒號 () 或雙冒號之後:::指定零個或多個相依專案。 使用一或多個空格或索引標籤來分隔多個相依專案。 相依專案不區分大小寫。 路徑可搭配檔名使用。

推斷相依

除了您在相依性行中明確列出相依專案之外,NMAKE 也可以假設 推斷的相依性。 推斷的相依性衍生自推斷規則,並在明確相依專案之前進行評估。 相較於其目標,推斷的相依性已過期時,NMAKE 會叫用相依性命令區塊。 如果推斷的相依性不存在,或與其自己的相依專案相較,NMAKE 會先更新推斷的相依性。 如需推斷相依性的詳細資訊,請參閱 推斷規則

相依的搜尋路徑

您可以為每個相依專案指定選擇性的搜尋路徑。 以下是指定要搜尋的一組目錄的語法:

{directory[;directory...]}依靠

以大括弧 ({ }) 括住目錄名稱。 以分號分隔多個目錄(;)。 不允許空格或索引標籤。 NMAKE 會先尋找目前目錄中的相依項目,然後依指定的順序在目錄清單中尋找 。 您可以使用巨集來指定部分或所有搜尋路徑。 只有指定的相依專案會使用此搜尋路徑。

目錄搜尋路徑範例

此相依性行示範如何建立搜尋的目錄規格:

reverse.exe : {\src\omega;e:\repo\backwards}retro.obj

目標 reverse.exe 有一個相依的 , retro.obj。 大括弧括住的清單會指定兩個目錄。 NMAKE 會先在目前目錄中搜尋 retro.obj 。 如果不存在,NMAKE 會 \src\omega 搜尋目錄,然後搜尋 e:\repo\backwards 目錄。

另請參閱

NMAKE 參考