美文网首页
makefile 一 书写规则

makefile 一 书写规则

作者: 癞痢头 | 来源:发表于2019-09-29 00:15 被阅读0次

1.make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。

  1. makefile规则
target ... : prerequisite ...
   command
target : 目标文件
prerequisite: 依赖文件
command:任意shell 命令
  1. makefile 内容都有啥

    • 显式规则
      规则说明了如何生成一个或多个目标文件

    • 隐晦规则
      由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较简略地书写 Makefile,这是由make所支持的

    • 变量定义
      在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像你C语言中的 宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置

    • 文件指示:
      在一个文件中引用另外一个文件

    • 注释
      Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用 # 字符

  2. 引用其它的makefile

        include <filename>
    

    filename 可以是当前操作系统Shell的文件模式(可以包含路径和通配符)

    在 include 前面可以有一些空字符,但是绝不能是 Tab 键开始。 include 和 <filename> 可以用一个或多个空格隔开。举个例子,你有这样几个Makefile: a.mk 、 b.mk 、 c.mk ,还有一个文件叫 foo.make ,以及一个变量 $(bar) ,其包含 了 e.mk 和 f.mk ,那么,下面的语句:

include foo.make *.mk $(bar)

等价于:

include foo.make a.mk b.mk c.mk e.mk f.mk
  1. 通配符例子
  objects = *.o

上面这个例子,表示了通配符同样可以用在变量中。并不是说 *.o 会展开,不!objects的值就是 *.o 。Makefile中的变量其实就是C/C++中的宏。如果你要让通配符在变量中展开,也就是 让objects的值是所有 .o 的文件名的集合,那么,你可以这样:

objects := $(wildcard *.o)
  • i另给一个变量使用通配符的例子:
objects := $(wildcard *.c)
  • ii. 列出(i)中所有文件对应的 .o 文件,在(iii)中我们可以看到它是由make自动编译出的
$(patsubst %.c,%.o,$(wildcard *.c))
  • iii. 由(i)(ii)两步,可写出编译并链接所有 .c 和 .o 文件
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
  cc -o foo $(objects)
  1. 文件搜索

在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。 所以,当make需要去找寻文件的依赖关系时,你可以在文件前加上路径,但最好的方法是把一个路径告 诉make,让make在自动去找。

Makefile文件中的特殊变量 VPATH 就是完成这个功能的,如果没有指明这个变量,make只会在当前 的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当前目录找不到的情况下 ,到所指定的目录中去找寻文件了。

  VPATH = src:../headers

上面的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。目录由“冒号”分隔 。(当然,当前目录永远是最高优先搜索的地方)

另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,这是 一个make的关键字,这和上面提到的那个VPATH变量很类似,但是它更为灵活。它可以指定不同的文件在不 同的搜索目录中。这是一个很灵活的功能。它的使用方法有三种:

1. vpath <pattern> <directories>  
为符合模式<pattern>的文件指定搜索目录<directories>

2. vpath <pattern> 
清除符合模式<pattern>的文件的搜索目录。

3. vpath 
清除所有已被设置好了的文件搜索目录。

vapth使用方法中的<pattern>需要包含 % 字符。 % 的意思是匹配零或若干字符,(需引用 % ,使用 \ )例如, %.h 表示所有以 .h 结尾的文件。<pattern>指定了要搜索 的文件集,而<directories>则指定了< pattern>的文件集的搜索的目录。

我们可以连续地使用vpath语句,以指定不同搜索策略。如果连续的vpath语句中出现了相同的<pattern> ,或是被重复了的<pattern>,那么,make会按照vpath语句的先后顺序来执行搜索。

vpath %.h ../headers
vpath %   blish
  1. 伪目标

.PHONE 声明目标并没有文件对应,

  1. 多目标
bigoutput littleoutput : text.g
    generate text.g -$(subst output,,$@) > $@

上述规则等价于:

bigoutput : text.g
    generate text.g -big > bigoutput
littleoutput : text.g
    generate text.g -little > littleoutput

其中, -$(subst output,,$@) 中的 $ 表示执行一个Makefile的函数,函数名为subst, 后面的为参数。关于函数,将在后面讲述。这里的这个函数是替换字符串的意思, $@ 表示目标的 集合,就像一个数组, $@ 依次取出目标,并执于命令。

  1. 静态模式
<targets ...> : <target-pattern> : <prereq-patterns ...>
    <commands>
    ...

相关文章

  • Linux Kernel Makefiles特殊符号

    Makefile基本规则: Makefile文件中可使用特殊的符号简化Makefile文件的书写。 1、$@:表示...

  • makefile 一 书写规则

    1.make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。 makef...

  • makefile编写(一)

    makefile或者Makefile 书写规则:命令就是用依赖来生成目标 目标:依赖 (tab) 命令 目录结构:...

  • Makefile入门(三):书写规则

    书写规则 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。在Makefile中,规则的顺序是很重要的,因为...

  • Makefile入门

    make是由一组一组的规则组成的 规则的书写形式: 目标:依赖 [tab]命令 makefile变量 变量名 = ...

  • Makefile自动化变量

    学习笔记,摘自陈皓的《跟我一起写 Makefile》 Makefile规则 Makefile文件由一系列规则构成。...

  • Makefile 工程管理

    Ⅰ Makefile的用途 Ⅱ Makefile的构成 Ⅲ Makefile构成-----规则 Ⅳ Makefil...

  • 编写Makefile及简单分析

    makefile的好处:一次编写,终身受益 makefile的命名规则: makefile Makefile ma...

  • makefile相关

    Makefile的规则 在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。 tar...

  • 004-Makefile 总述

    一、Makefile 里有什么? Makefile 里主要包含了五个东西:显示规则、隐晦规则、变量定义、文件指示和...

网友评论

      本文标题:makefile 一 书写规则

      本文链接:https://www.haomeiwen.com/subject/jgjsuctx.html