高級Makefile技巧
特殊的宏 Special Macros
如果你需要細粒度控制(fine-grained control)目標的行為,你就需要用到一些特殊的宏,他們的值基於指定的目標和依賴。所有的特殊宏都以美元符號$開始,並且不需要使用括弧。
$@
$@表示目標名
。通過它,不同的目標可以產生不同的輸出。例如,下面兩個目標產生的輸出文件將分別以client和server命名。
client: client.c
$(CC) client.c -o $@
server: server.c
$(CC) server.c -o $@
$?
$?儲存了一系列依賴文件
(通常是源文件——譯者注),這些依賴文件要比目標文件(編譯器生成的文件——譯者注)要新。通過使用這個宏,可以把上面例子中的行為變得更一般化:
client: client.c
$(CC) $? -o $@
server: server.c
$(CC) $? -o $@
$@ and @? 應用
CC = gcc
CXX = g++
LDFLAGS = -lm
CFLAGS = -Wall -pedantic -g -O0 -std=c99
OBJS = main.o \
GyroscopeBiasEstimator.o \
HeadTracker.o \
HeadTransform.o \
LowPassFilter.o \
Matrix3x3d.o \
Matrix.o \
OrientationEKF.o \
So3Util.o \
Vector3d.o
main: ${OBJS}
#${CC} -o main ${OBJS} ${LDFLAGS} ${CFLAGS}
${CC} -o $@ $? ${LDFLAGS} ${CFLAGS}
clean:
rm -f main ${OBJS}
$^
$^指當前目標中的所有的依賴文件
,它並不關心這些文件是不是比目標文件新。然而,重複的依賴文件名會被移除。這會在你需要將所有的依賴文件輸出到屏幕時變得非常有用:
# print the source to the screen
viewsource: client.c server.c
less $^
$+
$+與$^類似,但是它並不移除重複的名字
。所有依賴文件出現的順序也不改變:
# print the source to the screen
viewsource: client.c server.c
less $+
$<
當你只需要第一個依賴文件的時候,$<就變得很有用。當你的目標名稱後面只有一個依賴的時候,使用$<要比使用$^來的安全。可以想像,如果你今後加上了第二個依賴文件,使用$^可能帶來麻煩。當然,你也許就想要所有的依賴文件也說不定。所以,請務必事先仔細考慮清楚。
目標的通配符匹配 Wildcard Matching in Targets
百分號%可以用作通配符匹配以寫出更一般的目標。如果%出現在(makefile目標中的)依賴列表中,那麼它將由make命令行中的對應文本替換。如果你想使用目標本身的匹配文本,你需要用到特殊的$*宏。下面的例子假設你輸入make
%.c:
gcc -o $* $*.c
例如,輸入:
% make test_executable
將會執行:
gcc -o test_executable test_executable.c
宏修飾符 Macro Modification
使用宏是為了減少冗餘的文本,通過使用宏修飾符可以將宏從一種形態轉變為另一種形態。
替換文本 Replacing Text
從一個已有的宏創建一個新宏並非不可能。例如宏SRC代表一系列的源文件,你希望生成一個對應的目標文件宏OBJ。要這樣做,你只需要指定OBJ = SRC,除了擴展名不同以外:
OBJ = $(SRC:.c=.o)
注意,這條語句更通俗地因該說成「在宏SRC中,擴展名.c被替換成了.o」。
References:
本文由 lesca 翻譯自cprogramming.com 的文章 Advanced Makefile Tricks 有關Makefile更多的教程,可以參考opus的The Makefile 您可以在CC許可證下自由轉載