NMake

NMake

NMake,Microsoft Program Maintenance Utility,,外號NMAKE,顧名思義,是用來管理程序的工具。其實說白了,就是一個解釋程序。

關於NMAKE


Microsoft Program Maintenance Utility,外號NMAKE,顧名思義,是用來管理程序的工具。其實說白了,就是一個解釋程序。它處理一種叫做Makefile的文件(以mak為後綴),解釋裡面的語句並執行相應的指令。我們編寫makefile文件,按照規定的語法描述文件之間的依賴關係,以及與該依賴關係相關聯的一系列操作。然後在調用NMAKE時,它會檢查所有相關的文件,如果目標文件(target file,下文簡稱target,即依賴於其它文件的文件)的time stamp(就是文件最後一次被修改的時間,一個32位數,表示距離1980年以來經過的時間,以2秒為單位)小於依賴文件(dependent file,下文簡稱dependent,即被依賴的文件)的時間標識(time stamp),NMAKE就執行與該依賴關係相關聯的操作。
* 請看下面這個例子:
foo.exe : first.obj second.obj
link first.obj,second.obj
第一行定義了依賴關係,稱為dependency line;
第二行給出了與該依賴關係相關聯的操作,稱為command line。
因為foo.exe由first.obj和second.obj連接而成,所以說foo.exe依賴於first.obj和 second.obj,即foo.exe為target,first.obj和second.obj為dependent。如果first.obj和 second.obj中的任何一個被修改了(其time stamp更大),則調用link.exe,重新連接生成foo.exe。
這就是NMAKE的執行邏輯。
綜上,NMAKE的核心就是這3個傢伙——依賴關係,操作和判定邏輯(target.timestamp < dependent.timestamp,如果為true,就執行相應操作)。

MAKEFILE 的語法


現在詳細討論一下makefile的語法。makefile就像一個玩具型的程序語言,麻雀雖小,但五臟具全。
makefile的組成部分包括:
1. 描述語句(description block)
2. inference rules(推導規則)
3. 宏和指令(directive)
* 描述語句就是dependent lines和command lines的組合;
* inference rules就是預先定義好的或用戶自己定義的依賴關係和關聯命令;
* 宏就不用說了吧;
* 指令就是內定的一些可以被NMAKE識別的控制命令,提供了很多有用的功能。
另外,makefile中使用以下幾個具有特殊意義的符號:
^ # \ ( ) { } ! @ - : ; $
* ^(caret):用於關閉某些字元所具有的特殊意義,使其只表示字面上的意義。例如:^#abc表示#abc這個字元串,而#abc則用於在 makefile中加入註釋,#在這裡為註釋標誌,就像C++中的//。另外,在一行的末尾加上^,可以使行尾的回車換行符成為字串的一部分。
* #(number sign):為註釋標誌,NMAKE會忽略所有從#開始到下一個換行符之間的所有文本。這裡要注意的是:在command lines中不能存在註釋。因為對於command lines,NMAKE是將其整行傳遞給OS的。通常對於command lines的註釋都是放在行與行之間。
* \(backslash):用於將兩行合併為一行。將其放在行尾,NMAKE就會將行尾的回車換行符解釋為空格(space)。
* %(percent symbol):表示其後的字元串為一文件名。用法較複雜,在講dependent lines的時候再詳細討論。
* !(exclamation symbol):命令修飾符,在下面會有詳細的討論。
* @(at sign):命令修飾符,在下面會有詳細的討論。
* :(colon):用於dependent lines和inference rules中,用於分隔target和dependent。
* ;(semicolon):如果對於一個dependent line只有一條命令,則可以將該命令放在dependent line的後面,二者之間用“;”分隔。
* $(dolor sign):用於調用宏。