【问题标题】:Makefile conditional errorMakefile 条件错误
【发布时间】:2013-07-12 17:42:18
【问题描述】:

我正在尝试做一个 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

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

【问题讨论】:

    标签: makefile conditional gnu-make


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 能清晰多少?我只是想检查架构并有条件地做语句。但是谢谢你的回答。接受。
    • 如果您真的只想在每个配方行中编写一个 if 语句,那么我同意这很清楚。然而,大多数时候,人们真的想要做更多的事情,比如使用不同的编译器标志或不同的编译器,添加不同的源文件等。有很多更优雅的方法可以做到这些比在所有 makefile 配方中添加大量 if 语句要多得多。
    • 顺便说一下===的同义词
    • 感谢endiffi 的修正:这是一个愚蠢的错误。但是,使用== 代替= 是不正确的。 shell 的测试工具使用 single-= 运算符来比较字符串。 Bash 有一个不可移植的扩展,它允许它也识别== 以进行字符串比较。由于 make always 运行/bin/sh,无论用户的shell如何,这将在/bin/sh实际上不是bash并且在这方面遵守标准的任何系统上失败。
    【解决方案2】:

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

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

    如果它不以TAB 开头,make 会将其解释为自己语言的一部分。

    因此,要修复您的文件,只需避免以 TAB 开头的 make 条件句:

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

    【讨论】:

    • 两个答案都很棒。感谢您解释为什么它不起作用。我一定会记住这一点!
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2011-04-24
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多