关于makefile的书写

1.makefile的核心:
    target...(目标文件|object文件|可执行文件|标签)  : prerequisites( 生成target所需要的文件,也可以是target中的一种...)
       Command (shell 命令)
   
    target 这一个或多个的目标文件依赖于 prerequisites 中的文件,其生成规则定义在 command 中。 prerequisites 中如果有一个以上的文件比 target 文件更新的话, command 所定义的命令就会执行。
        
2.make 的工作原理:
    例, 文件名:makefiletest
    test : test.o
       gcc -o test test.o
    test.o: test.h test.c
       gcc -c test.c
    clean:
       rm test.o test

在默认方式下,只输入make命令。其会做如下工作:

make会在当前目录下找名字为“Makefile文件”或“makefile文件”的文件。如果找到,它会找文件中的第一个目标文件(target)。在上面的例子中,它会找到makefiletest这个文件,并把test作为最终的目标文件;如果test文件不存在,或是test所依赖的后面的 .o 文件的修改时间要比test这个文件新,它就会执行后面所定义的命令来生成test文件。

如果test所依赖的.o文件也存在,make会在当前文件中找目标为.o文件的依赖性,如果找到,则会根据规则生成.o文件(这有点像一个堆栈的过程)

当然,C文件和H文件如果存在,make会生成 .o 文件,然后再用 .o 文件生成make的最终结果,也就是执行文件test

    这就是整个 make 的依赖性, make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到, make 就会直接退出,并报错。而对于所定义的命令的错误,或是编译不成功, make 就不会处理。如果在 make 找到了依赖关系之后,冒号后面的文件不存在, make 仍不工作

通过上述分析,可以看出像clean这样没有被第一个目标文件直接或间接关联时,它后面所定义的命令将不会被自动执行,不过,可以显式使make执行。即使用命令make clean,以此来清除所有的目标文件,并重新编译。

在编程中,如果这个工程已被编译过了,当修改了其中一个源文件时,比如test.c,根据依赖性,目标test.o会被重新编译(也就是在这个依赖性关系后面所定义的命令),则test.o文件也是最新的,即test.o文件的修改时间要比test要新,所以test也会被重新连接了。

3 定义变量:
    ltest=test.h test.c
    上面的makefiletest可以改写为:
       test : test.o
       gcc -o test test.o
    test.o: $(ltest)
       gcc -c test.c
    clean:
       rm test.o test
4 makefile文件的自动推导
    test : test.o
       gcc -o test test.o
    test.o: test.h
    clean:
       rm test.o test
看一下test.o这个target,省略了 prerequisites的 test.c和command的gcc -c test.c,这些是target为test.o能推导出来的.
5 清空目标文件

    .PHONY : clean

        clean :

                -rm test.o test

    前面说过, .PHONY 表示 clean 是一个“伪目标”,而在 rm 命令前面加了一个小减号的目的是,如果某些文    件出现问题将被忽略,继续进行后面的操作。当然, clean 的规则不要放在文件的开头,否则会变成 make 的    默认目标。不成文的规矩是“ clean 从来都放在文件的最后”
6.注释:
 #. 为行注释,与//类似
7.显示指定makefile文件名
    将makefiletest改为make.test
    make -f make.test
8.TAB键
    为command命令的识别键,在command头使用,最好不要用在其它地方
9.包含 其它 makefile文件

    include <filename>

filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)。在include前面可以有一些空字符但是绝不能以[Tab]键开始。include<filename>可以用一个或多个空格隔开。举个例子,有这样几个makefile文件:a.mkb.mkc.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mkf.mk,下面的语句:

include foo.make *.mk $(bar)

等价于:

include foo.make a.mk b.mk c.mk e.mk f.mk

10 -include和sinclude 都可以ignore error,
11. make的工作顺序

(1) 读入所有的makefile文件。

(2) 读入被include包括的其他makefile文件。

(3) 初始化文件中的变量。

(4) 推导隐式规则,并分析所有规则。

(5) 为所有的目标文件创建依赖关系链。

(6) 根据依赖关系,决定哪些目标要重新生成。

(7) 执行生成命令。

12.转义字符与通配符
    /
    *,?,[...],~
其它请参见用户手册.

你可能感兴趣的:(linux,makefile)