update introduction
This commit is contained in:
parent
8fa0788da2
commit
9bb399d30d
@ -24,11 +24,11 @@ makefile的规则
|
||||
...
|
||||
|
||||
target
|
||||
可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的“伪目标”章节中会有叙述。
|
||||
可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的“伪目标”章节中会有叙述。
|
||||
prerequisites
|
||||
就是,要生成那个target所需要的文件或是目标。
|
||||
生成该target所依赖的文件和/或target
|
||||
command
|
||||
也就是make需要执行的命令。(任意的shell命令)
|
||||
该target要执行的命令(任意的shell命令)
|
||||
|
||||
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说::
|
||||
|
||||
@ -41,7 +41,7 @@ command
|
||||
一个示例
|
||||
--------
|
||||
|
||||
正如前面所说的,如果一个工程有3个头文件,和8个c文件,我们为了完成前面所述的那三个规则,我们的makefile应该是下面的这个样子的。
|
||||
正如前面所说,如果一个工程有3个头文件和8个c文件,为了完成前面所述的那三个规则,我们的makefile应该是下面的这个样子的。
|
||||
|
||||
.. code-block:: makefile
|
||||
|
||||
@ -70,7 +70,7 @@ command
|
||||
rm edit main.o kbd.o command.o display.o \
|
||||
insert.o search.o files.o utils.o
|
||||
|
||||
反斜杠( ``\`` )是换行符的意思。这样比较便于makefile的易读。我们可以把这个内容保存在名字为“makefile”或“Makefile”的文件中,然后在该目录下直接输入命令 ``make`` 就可以生成执行文件edit。如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下 ``make clean`` 就可以了。
|
||||
反斜杠( ``\`` )是换行符的意思。这样比较便于makefile的阅读。我们可以把这个内容保存在名字为“makefile”或“Makefile”的文件中,然后在该目录下直接输入命令 ``make`` 就可以生成执行文件edit。如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下 ``make clean`` 就可以了。
|
||||
|
||||
在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件( ``*.o`` ),依赖文件(prerequisites)就是冒号后面的那些 ``.c`` 文件和 ``.h`` 文件。每一个 ``.o`` 文件都有一组依赖文件,而这些 ``.o`` 文件又是执行文件 ``edit`` 的依赖文件。依赖关系的实质就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。
|
||||
|
||||
@ -155,7 +155,7 @@ makefile中使用变量
|
||||
|
||||
GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个 ``.o`` 文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
|
||||
|
||||
只要make看到一个 ``.o`` 文件,它就会自动的把 ``.c`` 文件加在依赖关系中,如果make找到一个 ``whatever.o`` ,那么 ``whatever.c`` ,就会是 ``whatever.o`` 的依赖文件。并且 ``cc -c whatever.c`` 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的新makefile又出炉了。
|
||||
只要make看到一个 ``.o`` 文件,它就会自动的把 ``.c`` 文件加在依赖关系中,如果make找到一个 ``whatever.o`` ,那么 ``whatever.c`` 就会是 ``whatever.o`` 的依赖文件。并且 ``cc -c whatever.c`` 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的新makefile又出炉了。
|
||||
|
||||
.. code-block:: makefile
|
||||
|
||||
@ -178,7 +178,7 @@ GNU的make很强大,它可以自动推导文件以及文件依赖关系后面
|
||||
clean :
|
||||
rm edit $(objects)
|
||||
|
||||
这种方法,也就是make的“隐晦规则”。上面文件内容中, ``.PHONY`` 表示,clean是个伪目标文件。
|
||||
这种方法,也就是make的“隐晦规则”。上面文件内容中, ``.PHONY`` 表示 ``clean`` 是个伪目标文件。
|
||||
|
||||
关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来。
|
||||
|
||||
@ -223,7 +223,7 @@ GNU的make很强大,它可以自动推导文件以及文件依赖关系后面
|
||||
clean :
|
||||
-rm edit $(objects)
|
||||
|
||||
前面说过,.PHONY意思表示clean是一个“伪目标”。而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。
|
||||
前面说过, ``.PHONY`` 表示 ``clean`` 是一个“伪目标”。而在 ``rm`` 命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然, ``clean`` 的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”。
|
||||
|
||||
上面就是一个makefile的概貌,也是makefile的基础,下面还有很多makefile的相关细节,准备好了吗?准备好了就来。
|
||||
|
||||
@ -232,7 +232,7 @@ Makefile里有什么?
|
||||
|
||||
Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
|
||||
|
||||
#. 显式规则。显式规则说明了,如何生成一个或多个目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
|
||||
#. 显式规则。显式规则说明了如何生成一个或多个目标文件。这是由Makefile的书写者明显指出要生成的文件、文件的依赖文件和生成的命令。
|
||||
#. 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较简略地书写Makefile,这是由make所支持的。
|
||||
#. 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
|
||||
#. 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
|
||||
@ -250,15 +250,15 @@ Makefile的文件名
|
||||
引用其它的Makefile
|
||||
------------------
|
||||
|
||||
在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是:
|
||||
在Makefile使用 ``include`` 关键字可以把别的Makefile包含进来,这很像C语言的 ``#include`` ,被包含的文件会原模原样的放在当前文件的包含位置。 ``include`` 的语法是:
|
||||
|
||||
.. code-block:: makefile
|
||||
|
||||
include <filename>;
|
||||
include <filename>
|
||||
|
||||
filename可以是当前操作系统Shell的文件模式(可以包含路径和通配符)。
|
||||
``filename`` 可以是当前操作系统Shell的文件模式(可以包含路径和通配符)。
|
||||
|
||||
在include前面可以有一些空字符,但是绝不能是 ``Tab`` 键开始。 ``include`` 和 ``<filename>;`` 可以用一个或多个空格隔开。举个例子,你有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量 ``$(bar)`` ,其包含了 ``e.mk`` 和 ``f.mk`` ,那么,下面的语句:
|
||||
在 ``include`` 前面可以有一些空字符,但是绝不能是 ``Tab`` 键开始。 ``include`` 和 ``<filename>`` 可以用一个或多个空格隔开。举个例子,你有这样几个Makefile: ``a.mk`` 、 ``b.mk`` 、 ``c.mk`` ,还有一个文件叫 ``foo.make`` ,以及一个变量 ``$(bar)`` ,其包含了 ``e.mk`` 和 ``f.mk`` ,那么,下面的语句:
|
||||
|
||||
.. code-block:: makefile
|
||||
|
||||
@ -270,23 +270,23 @@ filename可以是当前操作系统Shell的文件模式(可以包含路径和
|
||||
|
||||
include foo.make a.mk b.mk c.mk e.mk f.mk
|
||||
|
||||
make命令开始时,会找寻include所指出的其它Makefile,并把其内容安置在当前的位置。就好像C/C++的#include指令一样。如果文件都没有指定绝对路径或是相对路径的话,make会在当前目录下首先寻找,如果当前目录下没有找到,那么,make还会在下面的几个目录下找:
|
||||
make命令开始时,会找寻 ``include`` 所指出的其它Makefile,并把其内容安置在当前的位置。就好像C/C++的 ``#include`` 指令一样。如果文件都没有指定绝对路径或是相对路径的话,make会在当前目录下首先寻找,如果当前目录下没有找到,那么,make还会在下面的几个目录下找:
|
||||
|
||||
#. 如果make执行时,有 ``-I`` 或 ``--include-dir`` 参数,那么make就会在这个参数所指定的目录下去寻找。
|
||||
#. 如果目录<prefix>/include(一般是:/usr/local/bin或/usr/include)存在的话,make也会去找。
|
||||
#. 如果目录 ``<prefix>/include`` (一般是: ``/usr/local/bin`` 或 ``/usr/include`` )存在的话,make也会去找。
|
||||
|
||||
如果有文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误。它会继续载入其它的文件,一旦完成makefile的读取,make会再重试这些没有找到,或是不能读取的文件,如果还是不行,make才会出现一条致命信息。如果你想让make不理那些无法读取的文件,而继续执行,你可以在include前加一个减号“-”。如:
|
||||
|
||||
.. code-block:: makefile
|
||||
|
||||
-include <filename>;
|
||||
-include <filename>
|
||||
|
||||
其表示,无论include过程中出现什么错误,都不要报错继续执行。和其它版本make兼容的相关命令是sinclude,其作用和这一个是一样的。
|
||||
|
||||
环境变量MAKEFILES
|
||||
-----------------
|
||||
|
||||
如果你的当前环境中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似于include的动作。这个变量中的值是其它的Makefile,用空格分隔。只是,它和include不同的是,从这个环境变量中引入的Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。
|
||||
如果你的当前环境中定义了环境变量 ``MAKEFILES`` ,那么,make会把这个变量中的值做一个类似于 ``include`` 的动作。这个变量中的值是其它的Makefile,用空格分隔。只是,它和 ``include`` 不同的是,从这个环境变量中引入的Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。
|
||||
|
||||
但是在这里我还是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用make时,所有的Makefile都会受到它的影响,这绝不是你想看到的。在这里提这个事,只是为了告诉大家,也许有时候你的Makefile出现了怪事,那么你可以看看当前环境中有没有定义这个变量。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user