fixes
This commit is contained in:
		@@ -4,37 +4,28 @@
 | 
				
			|||||||
函数库文件也就是对Object文件(程序编译的中间文件)的打包文件。在Unix下,一般是由命令 ``ar`` 来完成打包工作。
 | 
					函数库文件也就是对Object文件(程序编译的中间文件)的打包文件。在Unix下,一般是由命令 ``ar`` 来完成打包工作。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
函数库文件的成员
 | 
					函数库文件的成员
 | 
				
			||||||
 | 
					 | 
				
			||||||
----------------
 | 
					----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成::
 | 
					一个函数库文件由多个文件组成。你可以用如下格式指定函数库文件及其组成::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    archive(member)
 | 
					    archive(member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了 ``ar`` 命令来服务的。如:
 | 
					这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了 ``ar`` 命令来服务的。如::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    foolib(hack.o) : hack.o
 | 
					    foolib(hack.o) : hack.o
 | 
				
			||||||
        ar cr foolib hack.o
 | 
					        ar cr foolib hack.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
如果要指定多个member,那就以空格分开,如:
 | 
					如果要指定多个member,那就以空格分开,如::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: makefile
 | 
					   foolib(hack.o kludge.o)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    foolib(hack.o kludge.o)
 | 
					其等价于::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
其等价于:
 | 
					   foolib(hack.o) foolib(kludge.o)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: makefile
 | 
					你还可以使用Shell的文件通配符来定义,如::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    foolib(hack.o) foolib(kludge.o)
 | 
					   foolib(*.o)
 | 
				
			||||||
 | 
					 | 
				
			||||||
你还可以使用Shell的文件通配符来定义,如:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    foolib(*.o)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
函数库成员的隐含规则
 | 
					函数库成员的隐含规则
 | 
				
			||||||
--------------------
 | 
					--------------------
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,17 +57,13 @@
 | 
				
			|||||||
语法
 | 
					语法
 | 
				
			||||||
----
 | 
					----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
条件表达式的语法为:
 | 
					条件表达式的语法为::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <conditional-directive>
 | 
					    <conditional-directive>
 | 
				
			||||||
    <text-if-true>
 | 
					    <text-if-true>
 | 
				
			||||||
    endif
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
以及:
 | 
					以及::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <conditional-directive>
 | 
					    <conditional-directive>
 | 
				
			||||||
    <text-if-true>
 | 
					    <text-if-true>
 | 
				
			||||||
@@ -87,9 +83,7 @@
 | 
				
			|||||||
    ifeq "<arg1>" '<arg2>'
 | 
					    ifeq "<arg1>" '<arg2>'
 | 
				
			||||||
    ifeq '<arg1>' "<arg2>"
 | 
					    ifeq '<arg1>' "<arg2>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
比较参数 ``arg1`` 和 ``arg2`` 的值是否相同。当然,参数中我们还可以使用make的函数。如:
 | 
					比较参数 ``arg1`` 和 ``arg2`` 的值是否相同。当然,参数中我们还可以使用make的函数。如::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ifeq ($(strip $(foo)),)
 | 
					    ifeq ($(strip $(foo)),)
 | 
				
			||||||
    <text-if-empty>
 | 
					    <text-if-empty>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,9 +12,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $(<function> <arguments>)
 | 
					    $(<function> <arguments>)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
或是
 | 
					或是::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ${<function> <arguments>}
 | 
					    ${<function> <arguments>}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -86,15 +86,11 @@ make一般是使用环境变量SHELL中所定义的系统Shell来执行命令,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
我们把这个Makefile叫做“总控Makefile”,总控Makefile的变量可以传递到下级的Makefile中(如果你显示的声明),但是不会覆盖下层的Makefile中所定义的变量,除非指定了 ``-e`` 参数。
 | 
					我们把这个Makefile叫做“总控Makefile”,总控Makefile的变量可以传递到下级的Makefile中(如果你显示的声明),但是不会覆盖下层的Makefile中所定义的变量,除非指定了 ``-e`` 参数。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
如果你要传递变量到下级Makefile中,那么你可以使用这样的声明:
 | 
					如果你要传递变量到下级Makefile中,那么你可以使用这样的声明::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    export <variable ...>;
 | 
					    export <variable ...>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
如果你不想让某些变量传递到下级Makefile中,那么你可以这样声明:
 | 
					如果你不想让某些变量传递到下级Makefile中,那么你可以这样声明::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    unexport <variable ...>;
 | 
					    unexport <variable ...>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -165,9 +161,7 @@ make一般是使用环境变量SHELL中所定义的系统Shell来执行命令,
 | 
				
			|||||||
定义命令包
 | 
					定义命令包
 | 
				
			||||||
----------
 | 
					----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
如果Makefile中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一个变量。定义这种命令序列的语法以 ``define`` 开始,以 ``endef`` 结束,如:
 | 
					如果Makefile中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一个变量。定义这种命令序列的语法以 ``define`` 开始,以 ``endef`` 结束,如::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    define run-yacc
 | 
					    define run-yacc
 | 
				
			||||||
    yacc $(firstword $^)
 | 
					    yacc $(firstword $^)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
好了,还是让我们来看一看如何书写规则。
 | 
					好了,还是让我们来看一看如何书写规则。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
规则举例
 | 
					规则举例
 | 
				
			||||||
--------
 | 
					--------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -100,11 +99,9 @@ prerequisites也就是目标所依赖的文件(或依赖目标)。如果其
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        objects := $(wildcard *.c)
 | 
					        objects := $(wildcard *.c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#. 列出(1)中所有文件对应的 ``.o`` 文件,在(3)中我们可以看到它是由make自动编译出的。
 | 
					#. 列出(1)中所有文件对应的 ``.o`` 文件,在(3)中我们可以看到它是由make自动编译出的::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   .. code-block:: makefile
 | 
					       $(patsubst %.c,%.o,$(wildcard *.c))
 | 
				
			||||||
 | 
					 | 
				
			||||||
        $(patsubst %.c,%.o,$(wildcard *.c))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#. 由(1)(2)两步,可写出编译并链接所有 ``.c`` 和 ``.o`` 文件
 | 
					#. 由(1)(2)两步,可写出编译并链接所有 ``.c`` 和 ``.o`` 文件
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -312,9 +309,7 @@ $(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$files”
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    main.o : main.c defs.h
 | 
					    main.o : main.c defs.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
但是,如果是一个比较大型的工程,你必需清楚哪些C文件包含了哪些头文件,并且,你在加入或删除头文件时,也需要小心地修改Makefile,这是一个很没有维护性的工作。为了避免这种繁重而又容易出错的事情,我们可以使用C/C++编译的一个功能。大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。例如,如果我们执行下面的命令:
 | 
					但是,如果是一个比较大型的工程,你必需清楚哪些C文件包含了哪些头文件,并且,你在加入或删除头文件时,也需要小心地修改Makefile,这是一个很没有维护性的工作。为了避免这种繁重而又容易出错的事情,我们可以使用C/C++编译的一个功能。大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。例如,如果我们执行下面的命令::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cc -M main.c
 | 
					    cc -M main.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -254,9 +254,7 @@ dir这个变量的值是“/foo/bar”,后面还跟了4个空格,如果我
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
这个示例中,如果定义了“do_sort”,那么: ``foo := $(sort a d b g q c)`` ,于是 ``$(foo)`` 的值就是 “a b c d g q”,而如果没有定义“do_sort”,那么: ``foo := $(strip a d b g q c)`` ,调用的就是strip函数。
 | 
					这个示例中,如果定义了“do_sort”,那么: ``foo := $(sort a d b g q c)`` ,于是 ``$(foo)`` 的值就是 “a b c d g q”,而如果没有定义“do_sort”,那么: ``foo := $(strip a d b g q c)`` ,调用的就是strip函数。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
当然,“把变量的值再当成变量”这种技术,同样可以用在操作符的左边:
 | 
					当然,“把变量的值再当成变量”这种技术,同样可以用在操作符的左边::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dir = foo
 | 
					    dir = foo
 | 
				
			||||||
    $(dir)_sources := $(wildcard $(dir)/*.c)
 | 
					    $(dir)_sources := $(wildcard $(dir)/*.c)
 | 
				
			||||||
@@ -313,23 +311,17 @@ dir这个变量的值是“/foo/bar”,后面还跟了4个空格,如果我
 | 
				
			|||||||
override 指示符
 | 
					override 指示符
 | 
				
			||||||
---------------
 | 
					---------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
如果有变量是通常make的命令行参数设置的,那么Makefile中对这个变量的赋值会被忽略。如果你想在Makefile中设置这类参数的值,那么,你可以使用“override”指示符。其语法是:
 | 
					如果有变量是通常make的命令行参数设置的,那么Makefile中对这个变量的赋值会被忽略。如果你想在Makefile中设置这类参数的值,那么,你可以使用“override”指示符。其语法是::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    override <variable>; = <value>;
 | 
					    override <variable>; = <value>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    override <variable>; := <value>;
 | 
					    override <variable>; := <value>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
当然,你还可以追加:
 | 
					当然,你还可以追加::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    override <variable>; += <more text>;
 | 
					    override <variable>; += <more text>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
对于多行的变量定义,我们用define指示符,在define指示符前,也同样可以使用override指示符,如:
 | 
					对于多行的变量定义,我们用define指示符,在define指示符前,也同样可以使用override指示符,如::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    override define foo
 | 
					    override define foo
 | 
				
			||||||
    bar
 | 
					    bar
 | 
				
			||||||
@@ -342,9 +334,7 @@ override 指示符
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
define指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以endef 关键字结束。其工作方式和“=”操作符一样。变量的值可以包含函数、命令、文字,或是其它变量。因为命令需要以[Tab]键开头,所以如果你用define定义的命令变量中没有以 ``Tab`` 键开头,那么make 就不会把其认为是命令。
 | 
					define指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以endef 关键字结束。其工作方式和“=”操作符一样。变量的值可以包含函数、命令、文字,或是其它变量。因为命令需要以[Tab]键开头,所以如果你用define定义的命令变量中没有以 ``Tab`` 键开头,那么make 就不会把其认为是命令。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
下面的这个示例展示了define的用法:
 | 
					下面的这个示例展示了define的用法::
 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: makefile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    define two-lines
 | 
					    define two-lines
 | 
				
			||||||
    echo foo
 | 
					    echo foo
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user