一個Makefile的進(jìn)化(一)
隱含規(guī)則、變量與Makefile的顯示
這一篇對開篇的Makefile進(jìn)行修改
涉及Makefile的下面知識
變量
多個依賴
隱含規(guī)則
echo顯示前的@
$@目標(biāo)
涉及文件:
string@asus:~/Projects/makefile$ ls
Makefile test.c test_fun1.c
Makefile 文件如下:
OBJ = test.o
OBJ += test_fun1.o
all:test
@echo build all
test:$(OBJ)
gcc $(OBJ) -o $@
clean:
rm -f $(OBJ)
rm -f test
.PHONY : clean
這次文件依賴增加了一個源文件,來演示多個文件依賴
使用OBJ來替代每一個文件的中間文件
使用隱含規(guī)則生成.o文件
- 從Makefile已經(jīng)可以看出來在Makefile中定一個變量是如此簡單,直接變量名=變量值即可
- 變量可以進(jìn)行+=操作,在使用的時候會展開為test.o test_fun1.o,
- 在Makefile中test依賴 test.o test_fun1.o,但是這兩個目標(biāo)并沒有生成規(guī)則,系統(tǒng)是如何生成這兩個文件呢,原來Makefile內(nèi)建了很多隱含規(guī)則,在隱含規(guī)則中生成這兩個目標(biāo)的規(guī)則是:cc -c -o *.o *.c,所以會看到執(zhí)行make后有下面的結(jié)果,至于要怎么樣修改隱含規(guī)則,在后面的文章會講到
- 在 all目標(biāo)中有執(zhí)行這語句 @echo build all,表示編譯完成后進(jìn)行顯示信息,可以進(jìn)行各種信息的顯示,這里只做演示,echo前面的@表示不顯示語句本身,如果沒有@會多余的顯示一行 echo build all,這個在實(shí)際的Makefile中經(jīng)常使用,用于關(guān)閉打開make時候的信息
test:$(OBJ)
gcc $(OBJ) -o $$@
這個規(guī)則中$@是一個內(nèi)建變量,特指在該語句中目標(biāo),在示例中表示test
執(zhí)行make后如下結(jié)果
string@asus:~/Projects/makefile$ make
cc -c -o test.o test.c
cc -c -o test_fun1.o test_fun1.c
gcc test.o test_fun1.o -o test
build all
string@asus:~/Projects/makefile$ make clean
rm -f test.o test_fun1.o
rm -f test