当括号存在时,makefile中的变量会导致意外的文件结尾

时间:2016-12-01 10:15:54

标签: makefile cygwin ksh mks

当我运行make clean时,我得到syntax error: unexpected end of file

当我删除导致错误的变量的括号时,我成功地摆脱了这个错误。

我想知道为什么会这样。

我正在使用:

  • Windows XP SP2 64位
  • CYGWIN
  • KSH R48

我的变量名为TARGET,就像这样但更长:

./ShowEnumContentsPrefAPI.o ./ShowEnumsPrefAPI.o

发生错误的行是:

rm -f $(TARGET)

当我删除括号时,错误消失了并且有效:

rm -f $TARGET

另一条线也是:

if [ "$(TARGET)" != "" ]; then \

当我删除括号时,错误消失了并且有效:

if [ "$TARGET" != "" ]; then \

=============================================== ===============

  • 这里发生了什么事?
  • 如何在不更改导致错误的每一行的情况下防止这种情况发生(我在此makefile中有超过1000行)?
  • 这是如何在mks 5.2 sh.exe上运行的,而不是cygwin ksh

=============================================== ===============

更新

这是实际代码:

clean:
    if [ "$TARGET" != "" ]; then \
        rm -rf $(TARGET); \
    fi

这就产生了错误syntax error: unexpected end of file

clean:
    if [ "$(TARGET)" != "" ]; then \
        rm -rf $(TARGET); \
    fi

唯一的区别是目标周围的括号。

执行

echo "T:$T"; \
echo "TARGET:$TARGET"; \

生产

T:
TARGET:ARGET

echo "(TARGET):$(TARGET)";\再次产生syntax error: unexpected end of file

今天我尝试切断一些TARGET变量。故意用手简化,rm -f $(TARGET)工作正常。我怀疑这是cygwin的rm[前任的问题。我将尝试升级到cygwin的最新版本,看看问题是否仍然存在。

1 个答案:

答案 0 :(得分:1)

您似乎已将值分配给$T而非$(TARGET)

与bash不同,在make中,$仅适用于下一个字符或括号表达式。因此,“$TARGET”解析为“$T”加上文字“ARGET”的扩展......为了说明,请考虑以下内容:

X := _X_
XX := _YY_
$(info - $XX -)
$(info - $(XX) -)

你得到:

- _X_X -
- _YY_ -

希望有所帮助。