Makeflie基础

一、Makefile书写规则

  Makefile 里面是由一系列的规则组成的,
  targets : prerequisites
  command
  …

二、Makefile变量

  在 Makefile 中的定义的变量,就像是 C/C++语言中的宏一样,他代表了一个文本字串,在 Makefile 中执行的时候其会自动原模原样地展开在所使用的地方。Makefile 中变量的引用方法是“$(变量名)”,变量的赋值符有“=”、“:=”、“+=”和“?=”。
   “=”就是基本的变量赋值
   “:="的意思是不会使用后面定义的变量,只能使用前面已经定义好的
  "?="如果变量 curname 前面没有被赋值,那么此变量就是右面赋值。如果前面已经赋过值了,那么就使用前面赋的值。
  "+="就是变量追加

三、Makefile模式规则

  通过模式规则可以使用一条规则来将所有的.c 文件编译为对应的.o 文件,当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值,如:
  %.o : %.c

四、Makefile 自动化变量

  自动化变量会把模式中所定义的一系列的文件自动的挨个取出,直至所有符合模式的文件都取完,自动化变量只应该出现在规则的命令中。常用的自动化变量:

$@

  表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。

$%

  仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么," $ %“就是"bar.o”,"$@“就是"foo.a”。如果目标不是函数库文件(Unix下是[.a],Windows 下是[.lib]),那么,其值为空。

$<

  依赖目标中的第一个目标名字。如果依赖目标是以模式( 即"%")定义的那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

$?

  所有比目标新的依赖目标的集合。以空格分隔。

$^

  所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份

$+

  这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。

$*

  这个变量表示目标模式中" % “及其之前的部分。如果目标是"dir/a.foo.b”,并且目标的模式是"a.%.b",那么," $ * “的值就是"dir/a.foo”。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么" $ * “也就不能被推导出,但是,如果目标文件的后缀是 make 所识别的,那么” $ " 就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是 make 所能识别的后缀名,所以,"$ “的值就是"foo”。

五、Makefile 函数

  在 Makefile 中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。make 所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函数的返回值可以当做变量来使用。函数的用法如下:
  $(函数名 参数集合)

  可以看出,调用函数和调用普通变量一样,使用符号“$ ”来标识。参数集合是函数的多个参数,参数之间以逗号“,”隔开,函数名和参数之间以“空格”分隔开,函数的调用以“$”开头。

5.1、函数 subst

  函数 subst 用来完成字符串替换,调用形式如下:
  $(subst < from>,< to>,< text>)
  此函数的功能是将字符串< text>中的< from>内容替换为< to>,函数返回被替换以后的字符串。

5.2、函数 patsubst

  函数 patsubst 用来完成模式字符串替换,使用方法如下:
  $(patsubst < pattern>,< replacement>,< text>)
  此函数查找字符串< text>中的单词是否符合模式< pattern>,如果匹配就用< replacement>来替换掉, < pattern>可以使用通配符“%”,表示任意长度的字符串,函数返回值就是替换后的字符串。如果< replacement>中也包涵“%”,那么< replacement>中的“%”将是< pattern>中的那个“%”所代表的字符串,

5.3、函数 dir

  函数 dir 用来获取目录,使用方法如下:
  $(dir <names…>)
  此函数用来从文件名序列< names>中提取出目录部分,返回值是文件名序列< names>的目录部分

5.4、函数 notdir

  函数 notdir 看名字就是知道去除文件中的目录部分,也就是提取文件名,用法如下:
  $(notdir <names…>)
  此函数用与从文件名序列< names>中提取出文件名非目录部分

5.5、函数 foreach

  foreach 函数用来完成循环,用法如下:
  $(foreach < var>, < list>,< text>)
  此函数的意思就是把参数< list>中的单词逐一取出来放到参数< var>中,然后再执行< text>所包含的表达式。每次< text>都会返回一个字符串,循环的过程中, < text>中所包含的每个字符串会以空格隔开,最后当整个循环结束时, < text>所返回的每个字符串所组成的整个字符串将会是函数 foreach 函数的返回值。

5.6、函数 wildcard

  通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,通配符不会自动展开,这个时候就要用到函数 wildcard,使用方法如下:
  KaTeX parse error: Expected 'EOF', got '&' at position 21: …card PATTERN…) &̲emsp;&emsp;比如: …(wildcard *.c)
  上面的代码是用来获取当前目录下所有的.c 文件,类似“%”。

猜你喜欢

转载自blog.csdn.net/xxxx123041/article/details/119906469