Makefile易错点整理
写Makefile的时候,经常遇到 缺少空格导致的错误,不易察觉却难以一一记住,所以把一些遇到的相关错误整理一下。
调用ifeq函数缺少空格出错
- ifeq之后要接一个空格才能接括号,若没有空格可能会出现报错“syntax error near unexpected token `then’” ;
- 函数的主体语句要顶格写,不要加tab ;
一个正确的示例如下
ifeq ($(MAKECMDGOALS),default)
include $(base_dir)/common.mk
endif
ifeq ($(MAKECMDGOALS),debug)
include $(base_dir)/common.mk
endif
使用shell命令判断文件夹是否存在时缺少空格出错
shell命令判度文件夹是否存在可以使用if条件判断,其格式如下:
if [ -d "filename" ]; then \
echo "exist"; \
fi
:'-d根据需要可以改为:
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
'
但是使用中要尤其注意以下几点,不然很容易出错。
- 符号[前后一定要都是空格 ;
- 符号]之前一定要是空格 ;
- 可以单行写也可以多行写,多行写在行尾要加上斜杠\;
- ]之后要加分号;,每条shell命令之后也要加分号;。
Makefile单行和多行写shell命令的正确示例为:
#rm -rf csrc && $(VCS) $(VCS_OPTS) -o $@ -debug_pp 为其它相关的编译语句
#单行格式
$(obj): $(sim_vsrcs)
@if [ -d "$(gen_dir)" ]; then echo "exist";fi
rm -rf csrc && $(VCS) $(VCS_OPTS) -o $@ \
-debug_pp;
#多行格式
$(obj): $(sim_vsrcs)
@if [ -d "$(gen_dir)" ]; then \
echo "exist"; \
fi
rm -rf csrc && $(VCS) $(VCS_OPTS) -o $@ \
-debug_pp\