检查Makefile中是否存在程序,否则运行命令
我想创建一个Makefile来识别系统中是否存在给定的程序,如果不存在,则运行另一个目标(或命令)。请先阅读问题末尾的我的帖子脚本,然后再将其标记为重复 总之,我想做如下伪代码:检查Makefile中是否存在程序,否则运行命令,makefile,Makefile,我想创建一个Makefile来识别系统中是否存在给定的程序,如果不存在,则运行另一个目标(或命令)。请先阅读问题末尾的我的帖子脚本,然后再将其标记为重复 总之,我想做如下伪代码: if (myProgram.exists()): myProgram arg0 arg1 arg2 else: otherProgram arg0 arg1 arg2 #suppose that otherProgram will always exists 我尝试了一些解决方案,下面是的最佳答案,它
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,它可能支持不同的语法,或者您可以使用嵌入式目标技术作为解决方法(然后可以将其定义为宏)。