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