调试makefile—.PHONY : 3 e! Q; ?& e* h% @$ s
$ h, j7 a7 n# O+ Z, P
1 h- @# h1 n/ B* x操作系统:ubuntu10.04
/ \5 X( g' m# ?: A& Z1 z/ w( H2 M* f7 Y* p- @' b
- {- }0 S5 ?$ s( k1 P$ r6 X7 V.PHONY是一个特殊工作目标(special target)
2 K7 a. ?& u3 Y1 q 它用来指定一个假想的工作目标,也就是说它后面的并不是一个实际文件,而且肯定要视为未更新(也就是说条件总是满足,需要处理)
$ B; j; X @; e) K5 K2 Q PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突(防止存在和PHONY执行目标的名称相同的文件,虽然在写比较小的makefile工程的时候看不出来.PHONY的好处,但是当面对一些大工程的时候,.PHONY则显得相当有用),改善性能。8 Q: ^ y T1 P( }
如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。* L5 A* O( ~4 z& B* W: ]
例如:# t3 V0 c- e* U. o6 [3 s& @
clean:; o( P" m2 Q8 x8 Q; J I; ]6 B
rm *.o temp0 \: T6 c2 [, V B" K
因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有' @/ A$ \9 `* m
依赖文件,文件"clean"始终是最新的,命令永远不会执行;为避免这个问题,可使用".PHONY"指明该目标。如:; F$ K( m) Y; ]# B+ L( [
.PHONY : clean
& s1 k( b" {6 v. T$ j0 Z" |4 D 这样执行"make clean"会无视"clean"文件存在与否。6 \/ ^9 Q" n3 l+ t; b
已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。7 @. M. z9 w( ^4 B. E5 }( ? }
完整的例子如下:+ Y4 o( V" Z1 |$ {
.PHONY : clean7 Y" r# I+ C/ z7 K* }
clean :
$ a% t* q4 Z8 q7 _% C# N rm *.o temp
) _& D2 X }" C% W0 Y3 \, f5 B0 \ phony 目标不应是真正目标文件的依赖。如果这样,每次make 在更新此文件时,命令都会执行。只要phony 目标不是真正目标的依赖,规则的命令只有在指定此目标时才执行。& y+ R X B: G; D, F
phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:. y% e# m: b, r
all : prog1 prog2 prog3' E' ]* S8 V( {6 q
.PHONY : all
3 [: k$ B, g7 {3 D- }. m prog1 : prog1.o utils.o5 e A: B6 h+ I; B+ S4 m# w0 `8 ~
cc -o prog1 prog1.o utils.o+ R8 l4 o3 r" A$ Q# K
prog2 : prog2.o
- `5 M7 [- F4 v9 S' Z" c3 y cc -o prog2 prog2.o5 `7 S8 f- ^- C5 @
prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o 2 `6 Q' M2 x) A' D1 T5 V
9 t6 z/ H6 L+ Z- k
实例:
3 v r' }! C# v点击(此处)折叠或打开
9 ]5 G, A# R w7 B% H- test1:main.o file1.o file2.o file3.o
4 a0 {$ D5 a0 B# W. Q: C - cc -o test1 main.o file1.o file2.o file3.o
- main.o:main.c
- cc -c main.c
- file1.o :file1.c
- cc -c file1.c
- file2.o :file2.c
- cc -c file2.c
- file3.o :file3.c
- cc -c file3.c
- .PHONY:test
- test:
- rm main.o file1.o file2.o /
- file3.o
9 O J9 y! m1 O, b 1 D, r- g: h1 W2 v6 u) D7 H# N
6 h% C) W E! Q! v4 j在makefile 所在的目录下,建立一个test的文件夹,此时你输入make test 可以成功的执行删除命令 如果你把.PHONY : test 这句给删除了那么当make test时就会提示; K' Y3 R( H) C2 Y8 _. ^7 m
make: “test”是最新的。也就无法达到删除目的。
' O# j- W# ^* u3 L8 r8 |+ N4 ]5 q1 y1 p; Q8 A
参考文件:3 k! S- o1 A- m! P% [6 i! u$ H
1,http://blog.csdn.net/wxdcxp/article/details/4826480
1 A! k! B, |, U6 Y2,http://www.360doc.com/resaveArt.aspx?articleid=293265741&isreg=1
, A& h7 r2 X/ B+ i% a% k C% R/ A" h0 P6 [+ H8 b3 Y: j
' H9 H6 u% V1 }, X4 Q$ x# x: D$ \
|