Makefile 语法以及关键字说明

文章目录

  • 相关资料文档
  • 关键字
    • include、sinclude
    • export
    • MAKELEVEL
    • MAKE
  • 文件名操作函数
    • 取目录函数dir
    • 取文件名称函数notdir
    • 取后缀函数suffix
    • 取前缀函数basename
    • 加后缀函数——addsuffix
    • 加前缀函数——addprefix
    • 连接函数——join
  • 字符串处理函数
    • subst
  • 特殊字符
    • $@
    • $%
    • $<
    • $?
    • $^
    • $+
    • $*

相关资料文档

GNU_makefile中文手册
GNU make-英文

关键字

include、sinclude

在 Makefile 使用 include 关键字可以把别的 Makefile 包含进来,这很像 C 语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。

include 的语法是:

include   

filename 可以是当前操作系统 Shell 的文件模式 (可以保含路径和通配符) 在 include前面可以有一些空字符,但是绝不能是[Tab]键开始。include 和可以用一个或多个空格隔开。
举个例子,你有这样几个 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 

sinclude与include作用是一样的,为兼容而存在.

export

设置make生命周期内的环境变量(方便全局使用);设置后,其他路径的makefile(make -C 指定的路径makefile)即可以使用相关的变量.

export	TOPDIR SRCTREE OBJTREE

MAKELEVEL

当前的嵌套层数.

MAKE

预设的 make 这个命令的名称(或者路径)

文件名操作函数

取目录函数dir

$(dir )

名称:取目录函数——dir。
功能:从文件名序列中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。返回:返回文件名序列的目录部分。示例: $(dir src/foo.c hacks)返回值是“src/ ./”。

取文件名称函数notdir

名称:取文件函数——notdir。包括后缀,去除文件夹路径;
功能:从文件名序列中取出非目录部分。非目录部分是指最后一个反斜杠(“/”
)之后的部分。
返回:返回文件名序列的非目录部分。
示例: $(notdir src/foo.c hacks)返回值是“foo.c hacks”。

取后缀函数suffix

( s u f f i x < n a m e s . . . > ) 名 称 : 取 后 缀 函 数 — — s u f f i x 。 功 能 : 从 文 件 名 序 列 < n a m e s > 中 取 出 各 个 文 件 名 的 后 缀 。 返 回 : 返 回 文 件 名 序 列 < n a m e s > 的 后 缀 序 列 , 如 果 文 件 没 有 后 缀 , 则 返 回 空 字 串 。 示 例 : (suffix ) 名称:取后缀函数——suffix。 功能:从文件名序列中取出各个文件名的后缀。 返回:返回文件名序列的后缀序列,如果文件没有后缀,则返回空字串。 示例: (suffix<names...>)suffix<names><names>(suffix src/foo.c src-1.0/bar.c hacks)返回值是“.c .c”。

取前缀函数basename

$(basename )

名称:取前缀函数——basename。包括路径;
功能:从文件名序列中取出各个文件名的前缀部分。
返回:返回文件名序列的前缀序列,如果文件没有前缀,则返回空字串。
示例:$(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/bar h
acks”。

加后缀函数——addsuffix

$(addsuffix , )

名称:加后缀函数——addsuffix。
功能:把后缀加到中的每个单词后面。
返回:返回加过后缀的文件名序列。
示例:$(addsuffix .c,foo bar)返回值是“foo.c bar.c”。

加前缀函数——addprefix

$(addprefix , )

名称:加前缀函数——addprefix。
功能:把前缀加到中的每个单词后面。
返回:返回加过前缀的文件名序列。
示例:$(addprefix src/,foo bar)返回值是“src/foo src/bar”。

连接函数——join

名称:连接函数——join。
功能:把中的单词对应地加到的单词后面。如果的单词个数要比的多,那么,中的多出来的单词将保持原样。如果的单词个数要比多,那么,多出来的单词将被复制到中。对应位置的叠加,多余的原样输出;
返回:返回连接过后的字符串。
示例:$(join aaa bbb , 111 222 333)返回值是“aaa111 bbb222 333”。

字符串处理函数

subst

Makefile中的字符串处理函数:
用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO
示例:
$(subst a,the,There is a big tree),
把“There is a big tree”中的“a”替换成“the”,返回结果是“There is the big tree”。

特殊字符

$@

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

$%

仅当目标是函数库文件时,表示规则中的目标成员名。例如,如果一个目标是 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 。这个特性是 GNU make 的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用 $* ,除非是在隐含规则或是静态模式中。如果目标中的后缀是make 所不能识别的,那么 $* 就是空值。

你可能感兴趣的:(嵌入式linux)