如果python代码没有正确的退出状态,我正在创建一个退出的makefile

时间:2018-01-18 04:30:22

标签: shell makefile

IsoPlot(dose, y=express[56,], type="ordinal", add.curve=TRUE)

# White rectangle to cover default title
rect(0, 11, 10, 15, xpd=TRUE, col="white", border="white")

# New title
title(paste("Gene:", row.names(express[56,])))

我已经制作了cmd=python sol.py A: @$(cmd) .PHONY: disp disp: python sol.py EXIT_STAtus=$$? \ ifeq ($EXIT_STAtus,1) \ @echo "GG"; \ exit 1; \ else \ @echo "ALL GOOD"; \ endif 这样的类型,makefile循环和退出都可以正常工作,但回声不会发生在任何一个部分。 你能说出原因吗?

1 个答案:

答案 0 :(得分:3)

您感到困惑和误解make所以请花几个小时阅读documentation of GNU make,以及Unix shell的文档,可能是GNU bash。请理解make时间内发生的情况以及make食谱中发生的情况(操作由您的shell解释,而不是make解释;该shell 运行 make)。

ifeq是一个很少有用的conditional make construct,代表“解析”时间(当make程序正在阅读您的Makefile时)。它在某种程度上类似于C代码中的#if,因为它要求make 跳过某些输入。您不应该在您的情况下使用ifeq,或者您希望在运行时(make)更改行为。

您可能需要条件shell命令。阅读bash中的conditional shell constructs(他们使用if,一个shell关键字)。另请阅读shell命令中test(1)的文档,通常缩写为[,并注意它也是bash builtin

作为triplee注释,在您的情况下甚至不需要任何条件shell命令。我认为错误消息应该由您的Python脚本输出,并且它们应该是相关的(因此您将更好地改进sol.py脚本)。

Makefile中,它应该是一个命令,因为Makefile中的不同shell命令不会通信,并且由make独立运行。阅读make文档的using one shell部分。

我猜你可能想要

disp:
        python sol.py; \
        EXIT_STAtus=$$? ; \
        if [ "$$EXIT_STAtus" -eq 1 ]; then \
                echo "GG"; \
                exit 1; \
        else \
                echo "ALL GOOD"; \
        endif

请注意,您执行单个 shell命令(从上面的pythonendif),因此除了最后一行之外,您需要在每行末尾添加反斜杠。

您可能希望使用make --trace运行make -n(和/或-x)甚至remake来了解正在发生的事情并调试Makefile

你绝对应该花更多的时间阅读文档。

顺便说一句,你为什么不改变你的sol.py Python脚本来输出GGALL GOOD?它可能是一个更简单的解决方案,我实际上建议这样做,并有一个bettersol.py Python脚本。那么您的Makefile规则应该更加简单:

disp:
        python bettersol.py

此外,在调试Makefile时,您应首先删除所有@以了解正在发生的事情。

根据经验,请避免在@中使用Makefile。一般情况下, make应该详细运行。作为初学者,您永远不应该使用@。稍后您可能有时少数规则中添加@(但我不建议这样做)。

注意:您make的第一个A:规则也非常糟糕(或者至少是丑陋且闻起来很糟糕)。您可能应该至少删除@,如果Asol.py的输出,那么您最好提高sol.py以使显式 ,或许你的第一个食谱中有python sol.py > $@