make 文件中vpath 的使用

在Linux操作系統管理中,經常需要用到make命令來編譯一些源代碼。如內核升級,驅動程序安裝等過程中,就需要用到這個命令。關於這個命令的使用技巧已經是老生常談了。不過筆者這次要談的是一個被大家所忽視的細節,即VPATH與vpath的區別,以及其在make命令中的應用。

  一、讓系統自動取尋找文件到依賴關係。

  在利用make命令來編譯一些大型項目時,往往會涉及到大量的源文件。可能這個項目有多個管理員參加,爲此存放在系統的不同目錄中。此時在編譯的時候,就需要指定文件的依賴關係。雖然可以在配製文件中指定,但是這不是最好的方法。因爲一旦源代碼改變了,就需要去更改配製文件。所以我們需要尋求一種更加簡便的、更加靈活的方法。在Linux操作系統中,這個需求很容易實現。因爲可以給make命令指定路徑,然其在相關目錄中去自動尋找文件的依賴關係。如此的話,只要存放源代碼的目錄沒有改變,則就不用更改配製文件。所以採取這宗方法的話,相對來說可以簡化make命令的編譯工作。

  二、通過VPATH來定義查找的路徑。

  在Linux操作系統中,有一個PATH環境變量。當用戶輸入一個命令時,操作系統會現在這個環境變量指定的路徑中查找命令。如果找不到的話,就會提示錯誤信息。在make命令中,也有一個類似參數,叫做VPATH。這個變量就是用來指定make命令查找的路徑。如果用戶沒有指定這個VPATH便量,則make命令只會在當前目錄中去查找依賴文件和目標文件。但是如果用戶定義了這個變量,則這個命令首先會在當前的目錄中查找依賴文件和目標文件。如果在當前目錄下找不到的話,則還會自動從VPATH變量定義的路徑中去查找。

  在這個變量中,可以定義多個路徑。這個變量的定義規則根PATH環境變量的定義規則有相同的地方,也有不同的地方。相同的地方是可以同時定義多個路徑,而且路徑之間都是利用英文狀態下的冒號進行分割。兩者的差異也很大。如在定義PATH變量的時候,要求採用的是決定路徑。而在定義VPATH變量時,即可以採用決定路徑,也可以採用相對路徑。如../source,這個目錄的定義方法(採用了相對路徑)在定義PATH環境變量的時候,是不允許的。但是在這裏定義VPATH變量的時候,確是允許的。所以在使用這個變量的時候,這個小細節需要注意。因爲採用相對路徑來表示的時候,相對來說要簡便一點。而且將整個大的文件夾移動到另外一個位置上,原先定義的相對路徑仍然有效。爲此在能夠使用相對路徑來表示的,筆者還是建議大家使用相對路徑。

  三、通過vpath來定義查找的路徑與匹配的模式。

  利用VPATH變量來定義路徑,大家可以看到其只是定義了一個查找的路徑,而沒有定義匹配的文件。如在某個目錄中,除了源代碼文件之外,還有不少的說明文檔。如果在查找的時候,將所有的文件都判斷一遍(包括一些說明文檔),那無疑會增加系統編譯的時間。爲此有時候,系統管理員不僅需要指定make命令查找的路徑,而且還需要指定匹配的模式。即從符號哪些條件的文件中去查找。最常見的就是指定文件到擴展名。如此查找起來比較具有針對性,這個編譯的速度也會提快許多。如現在系統管理員希望make命令查找指定路徑下的以.h結尾的文件。要實現這個需求,就需要用到另一個變量vpath。注意這裏是小寫,跟上面那個大寫的VPATH雖然在功能上相似,不過功能要比其強一點。

  這個vpath變量與VPATH變量很相似,也都是用來指定make命令查找文件依賴關係的目錄。不過這個變量更加的靈活。因爲其除了可以指定文件查找的目錄之外,還可以設置所匹配的模式。根據所帶參數的不同,這個命令主要用來完成三項工作。

  一是什麼參數都不帶的情況下,就是一個vpath光棍司令,並不是表示採用當前的vpath變量。而是指清除所有已經設置好了的文件搜索目錄。注意其清除vpath命令所設置的搜索路徑,而不影響VPATH變量所設置的查找路徑。系統管理員不要被它們的外表所矇騙了。只要記住它們兩個是不同的變量,雖然名字相同。

  二是帶一個參數pattern,如vpath %.h。此時系統會清除符合模式的文件的搜索路徑。如現在系統管理員可能會同時建立多個搜索策略,如.c、.h等等。而通過這種形式就只會刪除符合模式的搜索路徑。而不會影響到其它模式的搜索路徑。

  三是帶兩個參數,如vpath %.h ..(這個命令表示在上級目錄中查找.h文件)。兩個參數(匹配模式與文件的搜索路徑)都帶齊的話,就表示在指定的目錄中按規定的模式進行查找。不過需要注意的是,這裏一個模式最好對應一條語句。也就是說,在一個vpath語句中定義一個匹配模式。如果要定義多個匹配模式的話,此時最好的辦法是連續使用vpath語句來定義,以指定不同的搜索策略。不過需要注意的是,如果模式相同,第二次定義的時候就會更新原有的定義。也即是說,兩者的關係是替換,而不是追加。爲此同一個模式,如果需要在多個路徑中查找的話,那麼要麼在一條語句中定義多個路徑,要麼就是將它們複製到同一個文件夾中。一般最好將同一個模式的文件複製到同一個文件夾裏,以方便管理。除非特別複雜的項目,才根據用途或者模塊將它們分文件夾保存。
不過在RedHat Linux系統中有點區別。在這個版本地Linux操作系統中,可以相同模式的情況下定義多個路徑。如vpath %.h all、vpath %.h bll 、vpath %.h cll等等。此時後面對定義不會覆蓋前面的定義。即三個語句是各自獨立的,三個語句定義的變量都有效。當系統查找.h結尾的文件時,會根據vpaht變量定義的時間順序來查找。即先查找文件夾all,然後再查找bll,最後再查找cll。如果三個目錄中有一個相同的文件,那麼make命令就會以第一個目錄中的文件爲準。

  從以上的分析中可以看出,兩個變量vpath與VPATH 是兩個不同的變量。其功能相似,都可以在尋找文件依賴關係時指定查找的路徑。但是vpath其功能稍微強一點,可以按模式來查找,即更進一步的進行細分。爲此,用戶可以根據文件的多少、項目規模的大小來確定使用VPATH還是採用vpath。

  四、使用這兩個變量的注意事項。

  在使用這個兩個變量時,需要注意在變量中不用指定當前目錄。在定義PATH環境變量中,大家可以看到其最後還加上了當前目錄(.表示當前目錄)。但是在定義這兩個變量的時候,卻不需要加上。因爲其默認情況下,會先從當前目錄下查找。只有當前目錄下找不到對應的文件時,纔會從這兩個變量指定的路徑中去查找。在存在多個路徑的時候,其查找的時候是按照路徑先後定義的順序來的。爲此筆者要特別體系功能,PATH環境變量是把當前目錄放在最後查找,而VPATH與vpath則是當前目錄優先的。

  其次,對於VPATH與vpath兩個變量來說,是可以採用相對路徑來表示搜索路徑的。而且,無論從便利性還是從移植性來講,採用相對路徑會更加的合適一點。不過這也不是絕對的。需要根據項目實際的情況與用戶的操作習慣來定。不過從筆者的個人傾向來說,還是喜歡採用相對路徑。同時用戶需要牢記的一點是,在定義PATH環境變量的時候,是不能夠採用相對路徑的,必須採用絕對路徑。

  最後就是要注意這個兩個變量的大小寫。如果要在查找的過程中匹配模式話,那麼就要採用小寫的vpath,否則的話,則要採用大寫的VPATH。如果張冠李戴的話,則可能會產生一些不利的影響。Make命令是系統管理員必須要掌握的一個源代碼編譯命令。因爲不僅僅在編寫應用程序的時候需要用到,有時候在對內核進行升級的時候,也需要用到這個命令。所以無論是程序員還是管理員,對於這個命令都要有很深的瞭解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章