make幾個知識點

即時變量和延時變量

在下面代碼中,定義了一個值爲x的x變量,以延時變量的方式將它的值賦給y,以即時變量的方式將它的值賦給z。
由於y爲延時變量,因此y的取值並不會當即計算,而是在整個文件解析完成以後纔開始計算y的值。
由於z爲即時變量,因此運行到z:=$(x)這句話時,z的值當即計算得出。java

x = x
y = $(x)
z := $(x)
x = nothing
one:
    @echo $(x)
two:
    @echo $(y)
three:
    @echo $(z)

運行命令make one two three
輸出爲編程

nothing
nothing
x

自動變量

$@  規則目標的文件名.若是目標是檔案文件的一個成員,"$@"就是檔案文件的名稱
$%   當目標是檔案文件的一個成員時,"$%"是該成員的名稱.不然"$%"爲空
$< 第一個依賴文件的名稱
$?  以空格隔開的比目標新的全部依賴文件名.若依賴文件是檔案文件的成員,只使用成員的名稱
$^  以空格隔開的全部依賴文件名.若依賴文件是檔案文件的成員,只使用成員名稱.不管一個依賴文件出現過多少次,"$^"值中只包含其名稱的一個拷貝
$+  與"$^"類似,但屢次列出的依賴文件按照它們在構造文件中出現的順序複製.這對於連接命令中以特定順序重複出現的庫文件名有做用
$*  隱含規則匹配的詞幹.若目標爲"dir/a.foo.b"且目標模式爲"a.%.b",則詞幹爲"dir/foo".對靜態模式規則,詞幹是文件名中與目標模式中"%"匹配的部分.應避免在隱含規則或靜態模式規則以外使用"$*"
$(@D)  刪除結尾斜槓的目標文件名的目錄部分.若"$@"的值爲"dir/foo.o",則"$(@D)"爲"dir".若"$@"不包含斜槓,則"$(@D)"爲"."
$(@F)  目標文件名中目錄下的文件部分.若是"$@"的值爲"dir/foo.o",那麼"$(@F)"爲"foo.o".它等同於"$(notdir $@)"
$(*D)   詞幹中的目錄部分,例如上例中的"dir"
$(*F)   詞幹中的目錄下文件部分,例如上例中的"foo"
$(%D)  目標檔案文件成員的目錄部分.僅對形爲"archive(member)"的檔案文件成員目標有意義,且僅在member包含目錄名時有用
$(%F)  目標檔案文件成員中的目錄下文件部分
$(<D)  第一個依賴文件的目錄部分
$(<F)  第一個依賴文件的目錄下文件部分
$(^D)  全部依賴文件的目錄部分
$(^F)   全部依賴文件的目錄下文件部分
$(?D)  比目標新的全部依賴文件的目錄部分
$(?F)  比目標新的全部依賴文件的目錄部分this

one.java:two.java three.java
    @echo 目標名稱:$@
    @echo 不帶擴展名的目標名稱(這個變量只能在含有%目標名的命令中使用):$*
    @echo 第一個依賴文件的名稱:$<
    @echo 所有依賴,去重:$^
    @echo 所有依賴,不去重,按照出現順序出現:$+
    @echo 所有須要從新構建的依賴:$?
%.java:
    @echo this is $*.java

輸入make命令,輸出爲:code

this is two.java
this is three.java
目標名稱:one.java
不帶擴展名的目標名稱:
第一個依賴文件的名稱:two.java
所有依賴,去重:two.java three.java
所有依賴,不去重,按照出現順序出現:two.java three.java
所有須要從新構建的依賴:two.java three.java

預約義變量

AR      歸檔維護程序的名稱,默認值爲 ar。
ARFLAGS   歸檔維護程序的選項。
AS      彙編程序的名稱,默認值爲 as。
ASFLAGS   彙編程序的選項。
CC      C編譯器的名稱,默認值爲 cc。
CCFLAGS   C編譯器的選項。
CPP     C預編譯器的名稱,默認值爲$(CC) -E
CPPFLAGS  C預編譯的選項。
CXX     C++編譯器的名稱,默認值爲 g++。
CXXFLAGS  C++編譯器的選項。
FC      FORTRAN編譯器的名稱,默認值爲 f77。
FFLAGS    FORTRAN編譯器的選項。three

相關文章
相關標籤/搜索