|
1 | 1 | 使用条件判断
|
2 | 2 | ============
|
3 | 3 |
|
4 |
| -使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。 |
| 4 | +使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值, |
| 5 | +或是比较变量和常量的值。 |
5 | 6 |
|
6 | 7 | 示例
|
7 | 8 | ----
|
|
20 | 21 | $(CC) -o foo $(objects) $(normal_libs)
|
21 | 22 | endif
|
22 | 23 |
|
23 |
| -可见,在上面示例的这个规则中,目标 ``foo`` 可以根据变量 ``$(CC)`` 值来选取不同的函数库来编译程序。 |
| 24 | +可见,在上面示例的这个规则中,目标 ``foo`` 可以根据变量 ``$(CC)`` 值来选取不同的函数库来 |
| 25 | +编译程序。 |
24 | 26 |
|
25 |
| -我们可以从上面的示例中看到三个关键字: ``ifeq`` 、 ``else`` 和 ``endif`` 。 ``ifeq`` 的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。 ``else`` 表示条件表达式为假的情况。 ``endif`` 表示一个条件语句的结束,任何一个条件表达式都应该以 ``endif`` 结束。 |
| 27 | +我们可以从上面的示例中看到三个关键字: ``ifeq`` 、 ``else`` 和 ``endif`` 。 ``ifeq`` 的 |
| 28 | +意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括 |
| 29 | +起。 ``else`` 表示条件表达式为假的情况。 ``endif`` 表示一个条件语句的结束,任何一个条件表达 |
| 30 | +式都应该以 ``endif`` 结束。 |
26 | 31 |
|
27 | 32 | 当我们的变量 ``$(CC)`` 值是 ``gcc`` 时,目标 ``foo`` 的规则是:
|
28 | 33 |
|
|
89 | 94 | <text-if-empty>
|
90 | 95 | endif
|
91 | 96 |
|
92 |
| -这个示例中使用了 ``strip`` 函数,如果这个函数的返回值是空(Empty),那么 ``<text-if-empty>`` 就生效。 |
| 97 | +这个示例中使用了 ``strip`` 函数,如果这个函数的返回值是空(Empty),那么 |
| 98 | +``<text-if-empty>`` 就生效。 |
93 | 99 |
|
94 | 100 | 第二个条件关键字是 ``ifneq`` 。语法是:
|
95 | 101 |
|
|
109 | 115 |
|
110 | 116 | ifdef <variable-name>
|
111 | 117 |
|
112 |
| -如果变量 ``<variable-name>`` 的值非空,那到表达式为真。否则,表达式为假。当然, ``<variable-name>`` 同样可以是一个函数的返回值。注意, ``ifdef`` 只是测试一个变量是否有值,其并不会把变量扩展到当前位置。还是来看两个例子: |
| 118 | +如果变量 ``<variable-name>`` 的值非空,那到表达式为真。否则,表达式为假。当然, |
| 119 | +``<variable-name>`` 同样可以是一个函数的返回值。注意, ``ifdef`` 只是测试一个变量 |
| 120 | +是否有值,其并不会把变量扩展到当前位置。还是来看两个例子: |
113 | 121 |
|
114 | 122 | 示例一:
|
115 | 123 |
|
|
142 | 150 |
|
143 | 151 | ifndef <variable-name>
|
144 | 152 |
|
145 |
| -这个我就不多说了,和 `ifdef`` 是相反的意思。 |
| 153 | +这个我就不多说了,和 ``ifdef`` 是相反的意思。 |
146 | 154 |
|
147 |
| -在 ``<conditional-directive>`` 这一行上,多余的空格是被允许的,但是不能以 ``Tab`` 键做为开始(不然就被认为是命令)。而注释符 ``#`` 同样也是安全的。 ``else`` 和 ``endif`` 也一样,只要不是以 ``Tab`` 键开始就行了。 |
| 155 | +在 ``<conditional-directive>`` 这一行上,多余的空格是被允许的,但是不能以 ``Tab`` 键 |
| 156 | +作为开始(不然就被认为是命令)。而注释符 ``#`` 同样也是安全的。 ``else`` 和 ``endif`` |
| 157 | +也一样,只要不是以 ``Tab`` 键开始就行了。 |
148 | 158 |
|
149 |
| -特别注意的是,make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如 ``$@`` 等)放入条件表达式中,因为自动化变量是在运行时才有的。 |
| 159 | +特别注意的是,make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句, |
| 160 | +所以,你最好不要把自动化变量(如 ``$@`` 等)放入条件表达式中,因为自动化变量是在运行时才有的。 |
150 | 161 |
|
151 | 162 | 而且为了避免混乱,make不允许把整个条件语句分成两部分放在不同的文件中。
|
0 commit comments