Makefile - 如何区分变量赋值和命令

时间:2012-11-04 20:46:05

标签: bash makefile

我的Makefile中有以下代码,但是我收到的错误提到O?=2不是sh -c可以运行的命令。我在这里做错了什么?

gcc:
    O?=2
    @if test -z "$(DEBUG)" ; then \
      g++ -O${O} *.c -o palindrome ; \
    fi

我试图将O设置为2,如果用户没有提供它,然后构建我的回文可执行文件。


确切错误:

$ make gcc
O?=2
/bin/sh: O?=2: command not found
make: *** [gcc] Error 127
$

2 个答案:

答案 0 :(得分:2)

将它移到命令之外,以便它由“make”而不是shell处理:

O?=2
gcc:
    @if test -z "$(DEBUG)" ; then \
      g++ -O${O} *.c -o palindrome ; \
    fi

答案 1 :(得分:2)

O?=2不是赋值,而是执行重建目标gcc的命令。这意味着它被送到$(SHELL),它不知道它的事情。如果你想要一个变量assingment,把它自己放在行上而不是作为命令的一部分:

O?=2

gcc:
    @if test -z "$(DEBUG)" ; then \
        g++ -O${O} *.c -o palindrome ; \
    fi

您可以使用O = 2。当用户在命令行上提供值时,它将覆盖它:

make O=1

将使用-O1进行优化。