Makefile 生成文件条件错误

Makefile 生成文件条件错误,makefile,conditional,gnu-make,Makefile,Conditional,Gnu Make,我试图做一个声明来检查架构。我很快就能让它发挥作用: test: ifeq ("$(shell arch)", "armv7l") echo "This is an arm system" else echo "This is not an arm system." endif 我有一个问题:虽然这似乎解决了ifeq(“i386”、“armv7l”)的错误,但我得到了以下错误: $

我试图做一个声明来检查架构。我很快就能让它发挥作用:

test:
        ifeq ("$(shell arch)", "armv7l")
                echo "This is an arm system"
        else
                echo "This is not an arm system."
        endif
我有一个问题:虽然这似乎解决了ifeq(“i386”、“armv7l”)的错误,但我得到了以下错误:

$ make
ifeq ("i386", "armv7l")
/bin/sh: -c: line 0: syntax error near unexpected token `"i386",'
/bin/sh: -c: line 0: `ifeq ("i386", "armv7l")'
make: *** [test] Error 2

因此,它解析为两个相互比较的字符串,但存在语法错误。这里出了什么问题?

你不能在食谱中使用像
ifeq
这样的make语句。配方(以TAB开头的行)被传递到shell。shell不理解ifeq
;这是一个制造构造

在配方中必须使用shell if语句。而且,你不必在食谱中使用
$(shell…
,因为你已经在shell中了

test:
        if [ `arch` = armv7l ]; then \
            echo "This is an arm system"; \
        else \
            echo "This is not an arm system."; \
        fi

这可能不是处理此问题的最佳方法,但由于您没有提供任何关于您真正想做什么的信息,我们只能说。

正如MadScientist所说,
make
ifeq
行传递到shell,但是如果您编写正确,您完全可以将make构造(如
ifeq
)与配方中的命令混合使用。您只需要了解
make
如何解析
Makefile

如果一行以
选项卡开始,则无论该行在文件中的什么位置,它都被视为shell的命令

如果它不是以
选项卡
开头,则
make
将其解释为自己语言的一部分

因此,要修复您的文件,请避免使用
选项卡启动
make
条件:

test:
ifeq ("$(shell arch)", "armv7l")
        echo "This is an arm system"
else
        echo "This is not an arm system."
endif

这能清楚多少?我只是想检查体系结构和有条件的do语句。但是谢谢你的回答。接受。如果你真的只想在每一行食谱中写一个If语句,那么我同意这是很清楚的。但是,大多数时候,人们确实想做更多的事情,比如使用不同的编译器标志或不同的编译器,添加不同的源文件,诸如此类。有比在所有makefile配方中添加大量if语句更优雅的方法来完成这些事情。顺便说一句,
==
=
同义,感谢您对
endif
fi
的修正:这是一个愚蠢的错误。但是,使用
=
而不是
=
是不正确的。shell的测试工具使用single-=操作符来比较字符串。Bash有一个扩展,它是不可移植的,它还允许识别字符串比较的
=
。由于make总是运行
/bin/sh
,无论用户的shell是什么,这在任何系统上都会失败,因为
/bin/sh
实际上并不是bash,并且遵守这方面的标准。这两个答案都很好。谢谢你解释为什么它不起作用。我一定会记住这一点!