This commit is contained in:
Dongdong Tian 2016-02-17 16:44:09 +08:00
parent af8550262e
commit eead23a313
6 changed files with 23 additions and 61 deletions

View File

@ -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)
函数库成员的隐含规则 函数库成员的隐含规则
-------------------- --------------------

View File

@ -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>

View File

@ -12,9 +12,7 @@
$(<function> <arguments>) $(<function> <arguments>)
或是 或是::
.. code-block:: makefile
${<function> <arguments>} ${<function> <arguments>}

View File

@ -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 $^)

View File

@ -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

View File

@ -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