一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

调试makefile—.PHONY :

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

本版积分规则

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

GMT+8, 2024-4-26 09:14 , Processed in 0.053613 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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