9

我正在尝试做一个 make 语句来检查架构。我非常接近让它工作:

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

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

4

2 回答 2

19

您不能像ifeq在食谱中那样使用 make 语句。配方(以 TAB 开头的行)被传递到 shell。外壳不明白ifeq;这是一个 make 构造。

您必须在配方中使用 shell if 语句。而且,您不必$(shell ...)在配方中使用,因为您已经在外壳中。

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

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

于 2013-07-12T17:46:19.210 回答
17

正如 MadScientist 所说,make正在将这些ifeq行传递给 shell,但如果你编写得当,你绝对可以将 make 结构ifeq与配方中的命令混合在一起。您只需要了解如何make解析 a Makefile

如果一行以 a 开头,则无论该行在文件中的什么位置TAB,它都被视为 shell 命令。

如果它不以 a 开头TABmake则将其解释为自己语言的一部分。

因此,要修复您的文件,只需避免使用以下条件启动make条件TAB

test:
ifeq ("$(shell arch)", "armv7l")
        echo "This is an arm system"
else
        echo "This is not an arm system."
endif
于 2013-07-13T06:26:57.693 回答