检查Makefile中是否存在程序,否则运行命令

检查Makefile中是否存在程序,否则运行命令,makefile,Makefile,我想创建一个Makefile来识别系统中是否存在给定的程序,如果不存在,则运行另一个目标(或命令)。请先阅读问题末尾的我的帖子脚本,然后再将其标记为重复 总之,我想做如下伪代码: if (myProgram.exists()): myProgram arg0 arg1 arg2 else: otherProgram arg0 arg1 arg2 #suppose that otherProgram will always exists 我尝试了一些解决方案,下面是的最佳答案,它

我想创建一个Makefile来识别系统中是否存在给定的程序,如果不存在,则运行另一个目标(或命令)。请先阅读问题末尾的我的帖子脚本,然后再将其标记为重复

总之,我想做如下伪代码:

if (myProgram.exists()):
    myProgram arg0 arg1 arg2
else:
    otherProgram arg0 arg1 arg2 #suppose that otherProgram will always exists
我尝试了一些解决方案,下面是的最佳答案,它告诉我要这样做:

check: ; @which myProgram > /dev/null
mytarget: check
    myProgram arg0 arg1 arg2
该解决方案实际上是可行的,但这会中止程序,而不是执行另一个makefile目标/命令。我尝试了很多不同的实现,但都没有解决我的问题

如何在Makefile中实现类似的功能? 注意:这个问题不是“”的重复问题,因为后者的目的是在程序不存在时停止执行,而前者的目的是在程序不存在时运行另一个目标。

一般用例: 在Makefile中这样做很容易(对于简单的问题;复杂的问题需要更多的关注,也许还需要另一种解决方案)

对于您的示例,以下代码将实现此功能:

run: check
    myProgram arg0 arg1 arg2

check: 
    @type myProgram >/dev/null 2>&1 || otherProgram arg0 arg1 arg2
当然,您应该针对您的问题修改它。为了帮助您,下面您可以从我的一个项目中阅读一个真实的用例


一个真实的用例: 现在,让我们看一个来自的真实用例。我已经用
unittest
编写了一些测试,其方式是(a)我可以直接从Python执行它,或者(b)可以从Python执行它。后者更为冗长,因此更适合用于测试目的

要运行(a),我需要类似于
pythonmytest.py的东西。对于(b)我需要类似于
nosetests-v mytest.py的东西。看看我的
makefile

all: run_tests

run_tests: check
    nosetests -v test_digraph.py 
    nosetests -v test_not_digraph.py

check: 
    @type nosetests >/dev/null 2>&1 || /usr/bin/env python test_digraph.py
    @type nosetests >/dev/null 2>&1 || /usr/bin/env python test_not_digraph.py
这个生成文件将检查是否存在
nosetests
,如果不存在,它将直接从Python执行测试(使用
/usr/bin/env-Python-test\u-digraph.py
)。如果存在
nosetests
,则它将执行
run\u tests
target中的指令(换句话说,
nosetests-v test\u digraph.py
nosetests-v test\u not\u digraph.py


希望有帮助

您可以在代码中放入任意shell脚本片段。不过,只定义一次命令是有意义的

COMMAND:=$(shell type -p foo || echo bar)
命令设置为
foo
(如果存在),否则设置为
bar

如果您愿意,可以将类似的代码片段嵌入到目标中,但您可能希望避免代码重复

target: prerequisites
    { type -p foo && foo $^ || bar $^; } >$@

您可能已经知道,
ack&&ick|poo
if ack;然后是艾克;否则便便;fi

您为什么要为这项工作设置单独的目标?为什么不在一个目标中这样做呢<代码>@类型测试…&&鼻测试\n
@类型鼻测试…||python`?您能扩展它吗?
$(shell…
显然是一个GNU Make扩展。如果您的平台不是GNU Make,它可能支持不同的语法,或者您可以使用嵌入式目标技术作为解决方法(然后可以将其定义为宏)。