一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4376|回复: 0

调试makefile—.PHONY :

[复制链接]
发表于 2017-5-4 09:12 | 显示全部楼层 |阅读模式
调试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

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-20 09:02 , Processed in 0.042271 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表