基本规则:
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键之后),标记为不管命令出不出错都认为是成功的。
原文:https://www.cnblogs.com/linbingfeng/p/9189016.html