【问题标题】:How to write multiple conditions in Makefile.am with "else if"如何使用“else if”在 Makefile.am 中编写多个条件
【发布时间】:2011-11-09 02:01:53
【问题描述】:

我想用 autoconf/automake 编译我的项目。我的 configure.ac 中定义了 2 个条件

AM_CONDITIONAL(HAVE_CLIENT, test $enable-client -eq 1)
AM_CONDITIONAL(HAVE_SERVER, test $enable-server -eq 1)

我想在 Makefile.am 中将 _LIBS 与这两个条件分开

if HAVE_CLIENT

libtest_LIBS = \

    $(top_builddir)/libclient.la

else if HAVE_SERVER

libtest_LIBS = \

    $(top_builddir)/libserver.la

else

libtest_LIBS = 

endif

但是else if HAVE_SERVER 不起作用。

如何在 makefile.am 中写“else if”?

【问题讨论】:

    标签: automake


    【解决方案1】:

    ptomato 的代码也可以用更简洁的方式编写,例如:

    ifeq ($(TARGET_CPU),x86) TARGET_CPU_IS_X86 := 1 否则 ifeq ($(TARGET_CPU),x86_64) TARGET_CPU_IS_X86 := 1 别的 TARGET_CPU_IS_X86 := 0 万一

    这并不能回答 OP 的问题,但由于它是 google 上的最高结果,因此我将其添加到此处,以防它对其他人有用。

    【讨论】:

    • 但是这里你需要将两个endif放在同一个缩进级别,这样看起来也不太好
    • @amc 在上面的示例中,单个 endif 就足够了,我刚刚添加了它。在所有情况下都会出现缩进问题(使用更大/嵌套的else 块时)。
    • 继续本着“因为它是 google 上的最佳结果”的精神 :) 如果你想复制它,请确保不要忘记 else ifeq (…) 中括号前的空格。 make 如果缺少它会感到困惑,并会提前结束条件。
    • 你不能在 Makefile.am 中使用这个语法
    • 这在 GNU Make 3.80 中失败。错误消息是,Extraneous text after 'else' directive.
    【解决方案2】:

    如果我是你,我会接受 ldav1s 的回答,但我只想指出,'else if' 可以用任何语言写成 'else's 和 'if's:

    if HAVE_CLIENT
      libtest_LIBS = $(top_builddir)/libclient.la
    else
      if HAVE_SERVER
        libtest_LIBS = $(top_builddir)/libserver.la
      else
        libtest_LIBS = 
      endif
    endif
    

    (为了清楚起见,缩进。不要缩进这些行,它们不起作用。

    【讨论】:

    • 我试过这个,但失败了。是否有可能 Makefile.am 不支持递归 if 条件。
    • 您是否删除了缩进?所有这些语句都应该从第 1 列开始。
    • 对不起,我没有去掉缩进,我试试看。
    • 我刚刚试过,效果很好。非常感谢您的帮助。
    • 您可以在第 2、5 和 7 行使用缩进。(仅限制表符,不带空格)只有 if、else 和 endif 语句不允许缩进。
    【解决方案3】:
    ifeq ($(CHIPSET),8960)
       BLD_ENV_BUILD_ID="8960"
    else ifeq ($(CHIPSET),8930)
       BLD_ENV_BUILD_ID="8930"
    else ifeq ($(CHIPSET),8064)
       BLD_ENV_BUILD_ID="8064"
    else ifeq ($(CHIPSET), 9x15)
       BLD_ENV_BUILD_ID="9615"
    else
       BLD_ENV_BUILD_ID=
    endif
    

    【讨论】:

    • 这在 GNU Make 3.80 中失败。错误消息是,Extraneous text after 'else' directive
    • 我喜欢这种风格,而且这种语法的工作方式与我使用的 gnu make 版本一样。问题:如果条件测试是针对每个“else ifeq”不同的东西,这种语法可以工作吗???例如我可以这样做: ifeq ($chipset),1860) BLD_ENV_BUILD_ID="8960" else ifeq ($hostname, "JohnsLaptop") BLD_ENV_BUILD_ID="9615" else BILD_ENV_BUILD_ID= endif
    【解决方案4】:

    正如您所发现的,您不能那样做。你可以这样做:

    libtest_LIBS = 
    

    ...

    if HAVE_CLIENT
    libtest_LIBS += libclient.la
    endif
    
    if HAVE_SERVER
    libtest_LIBS += libserver.la
    endif
    

    【讨论】:

    • 是的,这很好。感谢您的回复,但实际上我有 3 个条件。客户端、服务器、非客户端-非服务器。我不知道如何在我的代码中添加第三个条件。
    • AM_CONDITIONAL 实际上有 4 个条件:!CLIENT && !SERVER、!CLIENT && SERVER、CLIENT && SERVER、CLIENT && !SERVER。这个答案将适用于所有这些条件。对于“第三个条件”(!CLIENT && !SERVER),libtest_LIBS 设置为您在“else if”中想要的值。
    【解决方案5】:
    ifdef $(HAVE_CLIENT) libtest_LIBS = \ $(top_builddir)/libclient.la 别的 ifdef $(HAVE_SERVER) libtest_LIBS = \ $(top_builddir)/libserver.la 别的 libtest_LIBS = 万一 万一

    注意:不要缩进 if then 它不起作用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 2019-04-25
      相关资源
      最近更新 更多