关于makefile
-
基本规则:
target...: prerequisites ...(预备知识,先决条件)command(指令)
-
引用其它的Makefile
在include前面可以有一些空字符,但是绝不能是[Tab]键开始。include和可以用一个或多个空格隔开。举个例子,你有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:include foo.make *.mk $(bar)
如果文件都没有指定绝对路径或是相对路径的话,make会在当前目录下首先寻找,如果当前目录下没有找到,那么,make还会在下面的几个目录下找:
1.如果make执行时,有“-I”或“--include-dir”参数,那么make就会在这个参数所指定的目录下去寻找。
2.如果目录/include(一般是:/usr/local/bin或/usr/include)存在的话,make也会去找。
3、 make的工作方式
GNU的make工作时的执行步骤入下:(想来其它的make也是类似)
(1). 读入所有的Makefile。
(2). 读入被include的其它Makefile。
(3). 初始化文件中的变量。
(4). 推导隐晦规则,并分析所有规则。
(5). 为所有的目标文件创建依赖关系链。
(6). 根据依赖关系,决定哪些目标要重新生成。
(7). 执行生成命令。
4、 为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
.PHONY: clean
clean:
rm*.o temp
-
静态模式
objects: foo.o bar.o
all: $(objects)
$(objects): %o:%c
$(cc) -c $(CFLAGS) $< -o $@file: foo.elc bar.o lose.o
$(filter %.o, %(file)): %.o:%c
$(cc) -c %(CFLAGS) $< -o $@ -
自动生成依赖性
大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。
[.d]文件中就存放对应[.c]文件的依赖关系。 -
Makefile 书写命令
(1). @加在命令开头,不会输出命令
(2)我们可以在Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的。
- 自动化变量
$@
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
$%
仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是
[.a],Windows下是[.lib]),那么,其值为空。
$<
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$?
所有比目标新的依赖目标的集合。以空格分隔。
$^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
$+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
$*
这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir /a.foo"。9