细节点总结
每行命令之前必须有一个tab键;
makefile的命令,与当前目录的文件名重复时,执行make命令会报错。
解决办法,利用.PHONY(中文意思,假冒伪造)
.PHONY: clean
clean:
rm *.o temp
每一行命令,隶属不同的进程。
例如下面代码,foo变量的赋值,不会传递给echo那一行。
var-lost:
export foo=bar
echo "foo=[$$foo]"
解决办法
var-kept:
export foo=bar; echo "foo=[$$foo]"
为了方便阅读,建议写法:
var-kept:
export foo=bar; \
echo "foo=[$$foo]"
命令默认会输出显示在终端里
加@,表示屏蔽输出。跟dos批处理一样。
test:
@# 这是测试
@echo TODO
调用Shell变量,需要在美元符号前,再加一个美元符号,这是因为Make命令会对美元符号转义。
例如:
test:
@echo $$HOME
注意,上面的例子是指的shell变量。至于makefile自定义的变量,就不需要了$$
了。
txt = Hello World
test:
@echo $(txt)
特殊的地方,暂时不知道原因。先记下来
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
# 等同于
all:
for i in one two three; do \
echo $i; \
done
条件判断举例
makefile的条件判断和循环命令,与bash一致。
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
循环举例
makefile的条件判断和循环命令,与bash一致。
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
# 等同于
all:
for i in one two three; do \
echo $i; \
done
参考文档
Make 命令教程 - 阮一峰的网络日志
http://www.ruanyifeng.com/blog/2015/02/make.html