【问题标题】:Makefile Rules and If Statements -- How?Makefile 规则和 If 语句——如何?
【发布时间】:2011-06-14 19:03:13
【问题描述】:

我是 Makefile 新手,所以请多多包涵。

我需要修改 Makefile,以便某些规则根据变量调用不同的实用程序。

现在,规则如下:

ci:
    [shell syntax for tool (A)]

但是现在我需要 ci 来根据变量使用不同的语法。所以我在文件顶部定义了一个全局变量:

TOOL = toolA

TOOL = toolB

理想情况下我想要的是这样的东西,但是显然它不起作用

ifeq ($TOOL, toolA)
    ci:
        [syntax for tool (A)]
else
    ci:
        [syntax for tool (B)
endif

有谁知道正确实施此类事情的最佳方法?

谢谢!!

EDIT:工具语法比一行复杂。有时它的多行,而不仅仅是“toolA args etc etc”。很抱歉造成混乱!

【问题讨论】:

  • 考虑实现一个工具中立的(shell?)脚本,它被告知(通过参数或其他方式)要做什么,并无条件地使用它。
  • 我一开始也是这么想的,但是我想在不引入外部脚本的情况下这样做。如果我不能让它工作,可能不得不求助于它。不过谢谢!

标签: unix if-statement makefile tcsh


【解决方案1】:

你只是缺少一些括号:

ifeq ($(TOOL), toolA)
...

P.S.您可以使条件更紧一点(并删除一点冗余):

ci:
ifeq ($(TOOL), toolA)
    [syntax for tool (A)]
else
    [syntax for tool (B)
endif

【讨论】:

  • 哇,谢谢!我不是那么远!但是现在我遇到了 if 语句的问题——但我会为此创建一个新问题。谢谢!
  • @Yasky:这比较字符串。你想做什么?
  • 我试图比较一个字符串,它是uname 的输出。不过,我还是求助于在 Makefile 中编写了一个迷你 shell 脚本
  • @Yasky:我不确定您的意思,但如果您将其作为问题发布,我相信有人可以提供帮助。
【解决方案2】:

通常,您使用宏来做到这一点:

  # put tool A or tool B command line here
  TOOL=...

  ci:
       $(TOOL) args

这可以用类似TOOLARGS 宏的东西来扩展,所以类似

  ci:
       $(TOOL) $(TOOLARGS)

然后你可以修改makefile,或者把宏放到命令行

  $ make TOOL=... TOOLARGS=...

如果你想封装它,你可以使用 if 来设置参数。

【讨论】:

  • 那行得通!但是就像@mark4o的回答一样,上面的“工具语法”比一行更复杂……它需要几行,有时不仅仅是“工具A”。我应该在我的原始帖子中更清楚。对于那个很抱歉。不过谢谢!
  • @RaytheonLiszt:命令越复杂,使用脚本来掩盖复杂性的好处就越大。
  • @Jonathan Leffler:非常正确。我想如果我再遇到一个障碍,我就会按照你的方式使用脚本。 =(
【解决方案3】:

试试这个:

TOOLARGS_toolA = -a1 -a2
TOOLARGS_toolB = -b1 -b2

ci:
        $(TOOL) $(TOOLARGS_$(TOOL))

现在如果TOOLtoolA,它将使用参数-a1 -a2,如果TOOLtoolB,那么它将使用参数-b1 -b2

【讨论】:

  • 太好了!但不幸的是,上面的“工具语法”比只有一行更复杂......它需要几个,有时不仅仅是“工具A”。对不起,我应该在我的原始帖子中更清楚。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-11-23
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多