我的团队在Makefile的末尾有一个目标,如下所示:
# Fix permissions and ownership problems (only run this in development!)
fixperms:
@if [ $(OS_NAME) == "Linux" ]; then \
@sudo chown --recursive php:php .
@sudo chmod --recursive 0777 var/
fi
@if [ $(OS_NAME) == "Darwin" ]; then \
@sudo chown --recursive php:php .
@sudo chmod -R 0777 var/
fi
...,并且末尾包含换行符。当我在MacOS机器上运行make fixperms
(在Linux上没有尝试过)时,收到以下消息:
/ bin / sh:-c:第1行:语法错误:文件意外结束
make:*** [fixperms]错误2
我该如何解决?
===
编辑1:我也尝试了没有换行符的结果-结果是相同的。
===
编辑2:我还尝试过重新排列Makefile,以便最后使用另一个目标。运行make fixperms
仍然会导致相同的错误。很奇怪。
答案 0 :(得分:1)
我假设您有TAB在这里缩进您不显示的食谱。
问题是您仅在第一行的末尾加上一个反斜杠,因此这是唯一的“续”行。 Make在单独的外壳中调用配方中的每个逻辑行,因此:
fixperms:
@if [ $(OS_NAME) == "Linux" ]; then \
@sudo chown --recursive php:php .
@sudo chmod --recursive 0777 var/
fi
运行以下shell命令:
/bin/sh -c 'if [ $(OS_NAME) == "Linux" ]; then @sudo chown --recursive php:php .'
/bin/sh -c 'sudo chmod --recursive 0777 var/'
/bin/sh -c 'fi'
您会看到这些是非法的Shell脚本;您会在第一个错误中遇到错误,因为您错过了fi
。
您应该将此脚本编写为一个shell命令脚本,并带有反斜杠,以确保逻辑行中包含下一行:
fixperms:
@if [ $(OS_NAME) == "Linux" ]; then \
sudo chown --recursive php:php . \
sudo chmod --recursive 0777 var/ \
fi
@if [ $(OS_NAME) == "Darwin" ]; then \
sudo chown --recursive php:php . \
sudo chmod -R 0777 var/ \
fi
(请注意,在脚本中间删除@
以及那些是makefile配方的元字符,并且仅在配方开始时才能识别它们。)
我实际上认为您应该删除所有@
。至少在使makefile能够100%工作之前,添加它们始终是致命的错误,因为您会丢弃重要的信息,否则这些信息会帮助您进行调试。例如,如果您在这里没有它们,则会看到将要调用的行打印出来,这可能有助于您了解问题所在。
您可能会考虑:http://make.mad-scientist.net/managing-recipe-echoing/
答案 1 :(得分:0)
我从没能使shell条件语句正常工作。我切换到使用Makefile条件语句,这似乎已经完成了工作。所以我现在有这个:
# Fix permissions and ownership problems (only run this in development!)
fixperms:
ifeq ("$(OS_NAME)", "Linux")
sudo chown --recursive php:php . ; sudo chmod --recursive 0777 var/
endif
ifeq ("$(OS_NAME)", "Darwin")
sudo chown -R php:php . ; sudo chmod -R 0777 var/
endif
...看起来效果很好。