调试makefile—.PHONY : , W/ L7 A0 u6 j) }2 ^
$ _3 C+ Y& ?1 `% u1 j' N
% W s: E1 C/ I# x! m- o
操作系统:ubuntu10.042 M. |$ E; e) i$ b2 ^
% P( M5 W' D) N% m% w. W
+ {- M4 ?* M1 c0 D.PHONY是一个特殊工作目标(special target)4 Q1 M( l( g# H: x3 Z6 C1 l; R
它用来指定一个假想的工作目标,也就是说它后面的并不是一个实际文件,而且肯定要视为未更新(也就是说条件总是满足,需要处理)6 d6 v6 g3 c: G( q @* O
PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突(防止存在和PHONY执行目标的名称相同的文件,虽然在写比较小的makefile工程的时候看不出来.PHONY的好处,但是当面对一些大工程的时候,.PHONY则显得相当有用),改善性能。. _" M2 f$ e# O+ U% Z8 a
如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。
! {+ d% E9 r( W2 D 例如:
; c9 Q1 V1 V# M/ o0 E6 \( S2 {5 d clean:
% V5 B* I6 o' z$ z( B' t+ U5 h rm *.o temp; G: v5 Z, z" I; U
因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有
6 E% d* \" ?" J1 I( n* k) l' K 依赖文件,文件"clean"始终是最新的,命令永远不会执行;为避免这个问题,可使用".PHONY"指明该目标。如:
, I$ s% o* r. ?) L .PHONY : clean2 c& F. H/ }' N
这样执行"make clean"会无视"clean"文件存在与否。
0 b6 b W/ }5 b- h 已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。
) Q( K4 |/ U& |$ W 完整的例子如下:7 a( g0 U; a2 z" X! E s
.PHONY : clean2 Z, Y' y( E: j8 A) {! Y
clean :
( h8 C, Z( }5 f1 _ rm *.o temp
! s" {: P& O9 y; B" }: U phony 目标不应是真正目标文件的依赖。如果这样,每次make 在更新此文件时,命令都会执行。只要phony 目标不是真正目标的依赖,规则的命令只有在指定此目标时才执行。
% |& b) I. n- q0 |1 v phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:' [7 D" e2 z: C# w& s4 ? O
all : prog1 prog2 prog3
7 c7 U1 |4 u, v7 [4 ^' o Y .PHONY : all
( Z! K; D# x9 s' _( N# z. i prog1 : prog1.o utils.o$ w3 [! S; t4 [2 G
cc -o prog1 prog1.o utils.o g0 `- C& Z% j3 r. [+ P4 K
prog2 : prog2.o
8 g6 y, \) ?& z" [; L3 b cc -o prog2 prog2.o8 ^( G# F1 ^7 {- }6 P* r
prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o
: _8 s; D0 K% h) \8 J! N3 m" ]! E3 ?6 Z
实例:
% m4 Q/ F6 U5 H9 A* F p点击(此处)折叠或打开
" H3 g% l' V8 |# I" A/ B6 a0 N- test1:main.o file1.o file2.o file3.o " N, K Q( b& ]8 F
- 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
6 g: A6 c* Q. ^: P" E ) F, B+ u- d; d2 w# k! y, S5 K
% ^6 L* j6 }; I' m( `* M
在makefile 所在的目录下,建立一个test的文件夹,此时你输入make test 可以成功的执行删除命令 如果你把.PHONY : test 这句给删除了那么当make test时就会提示+ a2 [0 \2 k3 W. t9 _
make: “test”是最新的。也就无法达到删除目的。 8 @5 U* I0 o) h0 e6 C
4 Y, `, F3 m# y# ^5 G
参考文件:" _7 ^6 r5 M) h) H3 ^/ _
1,http://blog.csdn.net/wxdcxp/article/details/4826480+ t3 f% s/ m; B* A9 E
2,http://www.360doc.com/resaveArt.aspx?articleid=293265741&isreg=12 q! `; Y6 q" j2 g; x2 F* M. F
/ i! p7 h u; A" a# N+ l
0 f0 V+ X. R* n1 Z |