一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2193|回复: 0
收起左侧

调试makefile—.PHONY :

[复制链接]
发表于 2017-5-4 09:12 | 显示全部楼层 |阅读模式
调试makefile—.PHONY : # N1 t4 @+ Q- F9 H/ _& O

; H4 K. |+ |& j" l

2 q$ h" B# Q/ m  R; o+ J) l; x! t8 Q7 c5 U操作系统:ubuntu10.042 N; p$ X# D7 g/ Q# [% {+ ]4 n4 k
  p1 j2 R  S9 K- h) x- x- f1 w

2 C7 H4 {7 b% n4 C8 }

.PHONY是一个特殊工作目标(special target)
( ?. W0 ~3 _6 L7 y! Y- o    它用来指定一个假想的工作目标,也就是说它后面的并不是一个实际文件,而且肯定要视为未更新(也就是说条件总是满足,需要处理)- L7 @: M* S9 G2 l. \2 D
  PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突(防止存在和PHONY执行目标的名称相同的文件,虽然在写比较小的makefile工程的时候看不出来.PHONY的好处,但是当面对一些大工程的时候,.PHONY则显得相当有用),改善性能。
  a! R3 J: r' e6 F% v* y; B  如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。
( f7 Q: B. Y+ ^0 z5 o  例如:
; D8 D' [- @: k' y( `% l: c  clean:
2 E) ^8 x+ O% ^6 w( }' ~8 N  rm *.o temp
* U' w% @- m8 f  因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有
( K; M, f8 n) e3 z    依赖文件,文件"clean"始终是最新的,命令永远不会执行;为避免这个问题,可使用".PHONY"指明该目标。如:
4 z: a4 R( _. i  O. t- ~  .PHONY : clean
5 d( M% l; ~; P" J7 a0 W  这样执行"make clean"会无视"clean"文件存在与否。. x- o  _- K2 f2 [+ n, q% Q; s+ x0 ~
  已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。
% |- u0 Z' T+ M; O$ O: Y  完整的例子如下:
' J2 {# S5 y; q$ K& D( _$ n  .PHONY : clean' V  v+ E$ O, x: h
  clean :
6 D( F' z+ \! o6 f  rm *.o temp
: X. a+ L! C5 i. V. ~  phony 目标不应是真正目标文件的依赖。如果这样,每次make 在更新此文件时,命令都会执行。只要phony 目标不是真正目标的依赖,规则的命令只有在指定此目标时才执行。6 f3 o5 l5 z" I; C! r* H  v
  phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
$ q$ G$ h) E3 U! [  all : prog1 prog2 prog3
: C- H" O% Q% T+ a  .PHONY : all5 _5 Q% n  o) e3 y4 C+ B. F1 X
  prog1 : prog1.o utils.o
+ K& N1 ~, E- ^. w3 K   cc -o prog1 prog1.o utils.o
) O, F8 z4 ^, m) `/ b  prog2 : prog2.o1 s) P* d, J( L8 R: W* W' h
   cc -o prog2 prog2.o8 J% T" w4 c5 H
  prog3 : prog3.o sort.o utils.o

   cc -o prog3 prog3.o sort.o utils.o

! B0 l) _% e4 u- h

* v4 p! d' i; f实例:) {! p& N7 M% Y2 u# H
点击(此处)折叠或打开

) T9 T/ u% ~3 @- A4 P( s$ T( I
  • test1:main.o file1.o file2.o file3.o ) u5 i1 y! x  F! u3 X
  •     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( \- N7 Q; ?+ D8 q7 @# ]1 g

4 X# {1 e; }( M* V& g! L& `  C  [
8 k, D" X6 b9 @6 Z' W

在makefile 所在的目录下,建立一个test的文件夹,此时你输入make test 可以成功的执行删除命令

如果你把.PHONY : test 这句给删除了那么当make test时就会提示4 v0 L  Z  q$ _
make: “test”是最新的。也就无法达到删除目的。

" U' S& S2 R' p# ~8 r7 {$ a
7 C/ P& \) K0 H% m! x, D
参考文件:
8 K0 O. y9 p! l3 G1,http://blog.csdn.net/wxdcxp/article/details/4826480  A+ E* ^3 q0 @1 c0 q7 Q
2,http://www.360doc.com/resaveArt.aspx?articleid=293265741&isreg=1
/ v8 m. H" u4 ?" J5 Q$ Q. C
$ l7 _4 Q6 j6 {4 {! s1 f& F4 ?. i' ^1 l" ]+ ~1 _

本版积分规则

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

GMT+8, 2024-4-26 21:49 , Processed in 0.046369 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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