`
test_angel
  • 浏览: 49985 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

Makefile学习(7)

 
阅读更多

makefile还有一些系统的函数,在此就不一一列举l了。今天学习学习伪目标和隐含规则。

1.伪目标

 

在第一讲中的例子中有如下代码:

clean:
               rm   edit main.o  kbd.o 

 这里“clean”就是一个伪目标。

 

我们在编译的过程中生成了许多编译文件,那么也应该提供一个清除它们的“目标”以备完整的重新编译而用。(例如:make clean实现文件的清除)。

 

因为我们并不生成“clean”这个文件,所以称其为“伪目标”。

  • “伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。所以我们只有通过显示的指明这个“目标”才能让其生效。
  • “伪目标”的取名不能和文件名重名,否则就失去了“伪目标”的意义了。

为了避免和文件重名,我们可以使用一个特殊的标记,“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。例如:

 

.PHONY:clean

 只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”。于是整个过程可以这样写:

 

.PHONY:clean
clean:
           rm *.o  temp
  •   伪目标一般没有依赖文件。但是我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”
方法:只要将其放在第一个。
例如:需要makefile一次生成若干个可执行文件,但是只想简单的一次make完事,并且所有的目标文件都写在一个makefile中,就可以使用“伪目标”这个特性。
all:prog1  prog2  prog3
.PHONY:all
prog1:prog1.o utils.o
        cc -o prog1 prog1.o utils.o
prog2:prog2.o
        cc -o prog2 prog2.o
prog3:prog3.o sort.o utils.o
        cc -o prog3 prog3.o sort.o utils.o
 
一些约定俗成的伪目标:(当然也可以重新命名而不使用这些名称)
  • all:这个伪目标是所有目标的目标,其功能一般是编译所有的目标
  • clean:这个伪目标的功能是删除所有被make创建的文件
  • install:这个伪目标的功能是安装已经编译好的程序,其实就是把目标执行文件copy到指定目标中去
  • print:这个伪目标的功能是列出改变过的源文件
  • tar:这个伪目标的功能是把源程序打包备份,也就是一个tar文件
  • dist:这个伪目标的功能是创建一个压缩文件,一般是把tar文件压成z文件或者gz文件
  • TAGS:这个伪目标的功能是更新所有的目标,以备完整的重新编译使用
  • check和test这个伪目标一般用来测试makefie的流程

 

2.隐含规则

“隐含规则”也就是早先约定了的,不需要我们写出来的规则,它是一种惯例。例如,把[.c]文件编译成[.o]文件这个规则,就可以不用写出来,make会自动推导出这种规则,并生成我们需要的[.o]文件。

例如:

foo:foo.o bar.o
      cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)

 以上的代码中并没有写下如何生成foo.o  bar.o这两个目标的规则和命令

  • CFLAGS:C语言编译器的参数。
  • LDFLAGS:链接器参数
注:
  • 如果我们 [.o]文件书写了自己的规则,那么make就不会自动推导并调用隐含规则了。
  • 在make的“隐含规则库”中,每一条隐含规则都在库中有其顺序,越靠前的则是越被经常使用的,所以,这会导致我们有些时候即使我们显示地指定了目标依赖,make也不会管。
例如这条规则(没有命令):
foo.o:foo.p
 依赖文件“foo.p”有可能变得没有意义。
如果目录下存在 了“foo.c”文件,那么我们的隐含规则一样会生效,并会通过“foo.c”调用C的编译器生成foo.o文件。
因为,在隐含规则中,Pascal的规 则出现在C的规则之后,所以,make找到可以生成foo.o的C的规则就不再寻找下一条规则了。
所以如果确实不希望任何隐含规则推导,则需要明确写出命令。

就写到这啦,下次继续,因为这个我理解的还很浅显啦!

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics