【问题标题】:Only make target if file exists仅当文件存在时才创建目标
【发布时间】:2013-08-02 15:01:24
【问题描述】:

在我的 makefile 中,我想做这样的事情:

all: foo bar python

python:
    if /usr/bin/someprogram
        do some stuff
    else
        echo "not doing some stuff, coz someprogram ain't there"
    endif

实现这一目标的最简单方法是什么?

【问题讨论】:

  • 如果您放入正确的行继续标记等,那么 makefile 的 sn-p 应该可以正常工作。
  • 它与请求的功能不匹配,即如果/usr/bin/someprogram 存在,则“做一些事情”。如所写(假设添加了续行),它将运行 /usr/bin/someprogram,如果成功,它将“做一些事情”。根本不是一回事。

标签: bash unix makefile


【解决方案1】:

一个简单的方法是使用test:

python:
    @test -s /usr/bin/someprogram && echo "someprogram exists" || echo "someprogram does not exist"
    @test -s /bin/ls && echo "ls exists" || echo "ls does not exist"

正如@MadScientist 所说,您可能需要一个 if 语句以防万一您想做多件事:

python:
        if [ -s /bin/ls ]; then \
          echo "ls exists"; \
        fi;

【讨论】:

  • 这是正确的答案。虽然如果原始问题中的“做一些事情”更复杂,但您需要一个 if 语句,以使其在没有别的情况下可读。
【解决方案2】:

您可以使用 'if' 和 'shell' make 函数:

all: foo bar python

CMD=/some/missing/command

foo:
    echo "foo"

bar:
    echo "bar"

python:
    $(if $(shell $(CMD) 2>/dev/null), \
    echo "yes", \
    echo "no")

这与“不”相呼应。如果您将 CMD 更改为 /bin/ls,它会回显“是”。

【讨论】:

  • 我绝对不会这样做。 make if 语句不像 shell if 语句那样工作:它不是基于 shell 运行的命令的退出代码。它基于命令生成的输出。如果该命令没有正常生成任何输出,那么这是不可靠的。另外,您在这里运行命令,但最初的问题并没有说他们想要运行该程序:它说他们想要“做一些事情”。
  • 我同意疯狂科学家的观点。我试图解决的问题是make conditional更像是C中的#ifdef,并且不能执行代码(例如shell测试)。devnull的解决方案是优越的。
猜你喜欢
  • 2012-10-05
  • 2019-12-25
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2018-04-03
相关资源
最近更新 更多