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,并且遵守这方面的标准。这两个答案都很好。谢谢你解释为什么它不起作用。我一定会记住这一点!