是否可以在 Makefile.am 中出现如下所示的内容?
if CONDITION_1 and CONDITION_2
...
endif
目前,我的configure.ac
中有类似以下内容的内容
AM_CONDITIONAL([COMBINED_CONDITION],
[test "$cond_1" != "no" -a "$cond_2" != "no"])
并在我的 Makefile.am 中按如下方式使用它。
if COMBINED_CONDITION
...
endif
我对autotools
相当陌生,无法使AND
ed条件起作用,并想知道这是否可能。到目前为止,我还没有找到任何表明它是的参考资料。
我会使用嵌套if ... endif
if CONDITION_1
if CONDITION_2
...
endif
endif
实现伪代码
# pseudo code
if CONDITION_1 and CONDITION_2
...
endif
同样的逻辑适用于其他三个伪代码条件
# pseudo code
if CONDITION_1 and not(CONDITION_2)
if not(CONDITION_1) and CONDITION_2
if not(CONDITION_1) and not(CONDITION_2)
可以实现为例如
if CONDITION1
if !CONDITION2
...
endif
endif
但是,完全布尔表达式的否定不能用嵌套if ... endif
表示。所以如果你需要实现OR
逻辑
# pseudo code
if CONDITION_1 or CONDITION_2
...
endif
你不能应用德摩根定律,纯粹用自动制造if ... else ... endif
做一些事情,因为你不能制定一个组合的else
分支。因此,您需要为OR
条件或任何其他比一堆 AND 更复杂的条件定义专门制定的AM_CONDITIONAL
。
作为关于组合条件的旁白,我记得-a
和-o
被列为test
的不可移植论据,因此
AM_CONDITIONAL([COMBINED_CONDITION_AND],
[test "x$cond_1" != xno && test "x$cond_2" != xno])
AM_CONDITIONAL([COMBINED_CONDITION_OR],
[test "x$cond_1" != xno || test "x$cond_2" != xno])
被推荐过来
AM_CONDITIONAL([COMBINED_CONDITION_AND],
[test "$cond_1" != "no" -a "$cond_2" != "no"])
AM_CONDITIONAL([COMBINED_CONDITION_OR],
[test "$cond_1" != "no" -o "$cond_2" != "no"])
(见 https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.71/html_node/Limitations-of-Builtins.html)
另请注意测试参数中"x$cond"
开头的字母。这避免了不必要的结果,例如,如果$cond
的值是-z
或-f
或test
会解释的类似的东西。您可以在此处使用任何您想要的字母,但"x"
是一个受欢迎的选择。
如果您知道CONDITION_1
和CONDITION_2
变量的值是什么,当它们是您想要的时,您可以检查它们是否相等,如下所示:
ifeq ($(CONDITION_1)/$(CONDITION_2),no/no)
或类似。