如何在Makefile中使用exit控件分离不同的部分

如何在Makefile中使用exit控件分离不同的部分,makefile,Makefile,我正在编写一个复杂的Makefile,它包含多个部分,如: step1: if [[ ${input} == "delete" ]]; then \ echo "this is a test to delete files"; \ else \ echo "error stop";

我正在编写一个复杂的Makefile,它包含多个部分,如:

step1:
    if [[ ${input} == "delete" ]]; then          \
        echo "this is a test to delete files";   \
    else                                         \
        echo "error stop";                       \
    fi

step2:
    rm -f *.txt

test:
    make step1
    make step2
因此,如果我输入“maketestinput=delete”,它将删除所有的.txt文件。如果我输入“maketestinput=none”,它将不会做任何事情。我知道最简单的方法是将步骤1和步骤2组合为:

test:
    if [[ ${input} == "delete" ]]; then          \
        echo "this is a test to delete files";   \
        rm -f *.txt;                             \
    else                                         \
        echo "error stop";                       \
    fi

但是我的Makefile太复杂了,我不得不分成几个部分。Makefile是否支持类似的功能?如果是,我应该寻找什么?谢谢。

在调用子MAKE时,您应该始终使用
$(MAKE)
,而不要直接使用
MAKE

如果这样做,那么您提供的所有命令行重写都将正确地传递给子生成器


顺便说一句,您不应该使用bash语法
[[x==y]]
。如果您在默认shell仅限于POSIX标准语法的系统上运行此makefile,那么这将不起作用。您应该使用POSIX语法:
[x=y]

当您使用GNU Make时,您可以使用它的条件,例如。 :

测试:
ifeq($(输入),删除)
echo“这是删除文件的测试”
rm-f*.txt
其他的
回显“错误停止”
恩迪夫
或者,如果要控制目标的先决条件:

步骤1:
echo“这是删除文件的测试”
步骤2:
rm-f*.txt
#测试始终取决于步骤1
测试:步骤1
#如果输入=删除,测试也取决于步骤2
ifeq($(输入),删除)
测试:步骤2
恩迪夫

您正在使用GNU Make吗?如果是这样,您可以使用它的
ifeq
。是的。我正在使用GNU Make。你能提供一些关于如何使用
ifeq
实现它的更多信息吗?谢谢,我明白了。谢谢在这种情况下,这有什么帮助?如果我理解正确,如果我使用
make test input=delete
,则步骤1将打印出错误停止,但步骤2仍将执行。这是正确的吗?如果您不想运行步骤2,您可以将
echo“error stop”
更改为
exit 1
,以便
step1
给出错误,那么
test
中的其余行在
$(MAKE)step1
失败后将不会被调用。