make: Makefile或makefile文件
make -f othername
make --file=othername 這兩個命令使用其他名字的文件make
makefile寫法:
target: components[;rule]
<TAB>rule
說明:target依賴於components,其生成規則定義於rule。components中有一個文件比target新,rule就執行
例如:
main: main.o
gcc -o $@ $^
..c.o:
gcc -o $<
說明:以上後三行是隱含規則。只不過隱含規則裏是CC,首先要CC=gcc
兩條隱含規則:
$(CC) $(CFLAGS) $@ $<
$(CC) -c $< $@
1).PHONY:clean
clean:
-rm -f *.o
說明:.PHONY說明clean是僞目標文件
2)include filename 把別的makefile文件包含進來,使用空格分隔
3)例子:
objects=foo.o far.o
all: $(objects)
$(objects): %.c
$(CC) -c $(CFLAGS) $< -o $@
說明:$(objects)表示變量;
%用來匹配0個或若干個字符
4)- 如執行本命令有錯誤,繼續執行不退出
+ 本命令始終被執行
@ 執行本命令不打印本命令內容
5)makefile中第一個目標文件爲終極目標
6)多個文件使用同一個頭文件的簡單寫法:
module1.o module2.o module3.o: head.h
7)vpath %.h ../headers 空格或:分隔,指定頭文件位置
或者使用VPATH=……
vpath 清除所有
vpath<pattern> 清楚該模式
8)\續行,但是\與新的一行之間不能有空白符
9)根據隱含規則,以下等價
a)module1.o: head1.h
b) mudule1.o: module1.c head1.h
gcc -c module1.c -o module1.o
10)變量名 賦值符 變量值
賦值符包括:
=
:= 定義時展開
?= 沒有值則賦值
+= 追加
11)預定義變量: CC CFLAGS PWD
12)自動變量:
$^ 所有依賴文件名
$< 第一個依賴文件名
$@ 目標文件名
$* 目標文件去後綴名
$? 比目標文件新的依賴文件列表
這些只能出現在命令裏,出現在文件列表裏爲$$^之類
13)ifeq ifneq ifdef ifndef