在 Makefile.am 中使用 AND 组合两个条件



是否可以在 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相当陌生,无法使ANDed条件起作用,并想知道这是否可能。到目前为止,我还没有找到任何表明它是的参考资料。

我会使用嵌套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-ftest会解释的类似的东西。您可以在此处使用任何您想要的字母,但"x"是一个受欢迎的选择。

如果您知道CONDITION_1CONDITION_2变量的值是什么,当它们是您想要的时,您可以检查它们是否相等,如下所示:

ifeq ($(CONDITION_1)/$(CONDITION_2),no/no)

或类似。

最新更新