Make 及 Makefile 相关zz
时间:2010-11-16 来源:decaijiang
- 在线文档:
- GNU "make"
http://www.gnu.org/software/make/manual/make.html
- 跟我一起写Makefile
http://www.chinaunix.net/jh/23/408225.html
- make
- 强制重新编译: make -B
- xxx
- Makefile
- 指定SHELL 变量
指明解析Makefile的shell, 在Linux下一般为/bin/sh(默认设置), Windows下为cmd.exe. 如果不指定, Makefile可能不会正常工作。 比如在Windows下, 如果不指定SHELL=cmd.exe, 会出现错误:
'CreateProcess( "" .. blah, blah) failed'
- Shell Command
Makefile中可以使用SHELL语法,但有一些限制
- SHELL语句只能以单行方式存在
- SHELL 只能用在命令中(即依赖关系中以TAB开始的代码行中)
- SHELL中定义的变量需要用$$引用,但SHELL语句中引用 Makefile的变量,只需要用$
- SHELL指令之间用用分号(';')分隔
- SHELL语句中不能用 Makefile的函数(如dir, notdir, basename 等),这些函数不能返回正确的结果,需要用相应的Shell命令代替。比如下面的的函数是错误的
define GET_NAME
for i in dir1/file1 /path/to/dir2/file2; do R=$(dir "$$i") && echo $$R; done
for i in dir1/file1 /path/to/dir2/file2; do R=$(basename "$$i") && echo $$R; done
endef
应该替换成
define GET_NAME
define GET_NAME
for i in dir1/file1 /path/to/dir2/file2; do R=`dirname "$$i"` && echo $$R; done
for i in dir1/file1 /path/to/dir2/file2; do R=`basename "$$i"` && echo $$R; done
endef
define BUILD
for i in ${1}; do \
echo $${i}; \
$(GCC) -c ${{i}}; \
done
endef
define CREATE_PATH
for d in `echo $1 | sed 's/\//\n/g'`; do \
if [ -n $d ]; then \
if [ -z $${tmpPath} ]; then\
tmpPath=$$d; \
else \
tmpPath=$$tmpPath/$$d; \
fi; \
if [ ! -d $$tmpPath ]; then \
mkdir $$tmpPath fi \
fi \
done
endef
target:
$(call CREATE_PATH, /tmp/local/user)
$(call BUILD, $(FILES))
- Makefile 中自动产生依赖关系文件
depeng:
@for f in $(SRCS); do\
str=`gcc $(INCS) $(DEFS) -MM $${f}` ;\
echo "$(OUTDIR)/$${str}" >> .depend; \
done;
-include .depend
注意,在代码行
echo "$(OUTDIR)/$${str}" >> .depend;
中,一定要加双引号,否则会产生不正确的依赖文件.depend - 错误信息重定向
SHELL的错误信息重定向用 2&>, 而Makefile中只需用2>
eg:
FILES = $(shell ls $(MY_PATH) 2>/dev/null) - 命令中不能有Makefile语法,但可以用SHELL语法
eg:
- 正确用法
target1:
ifeq ($(VAR), "y")
gcc xxxxxxxxxxxxxx
endif
target2:
if [ "$(VAR)" = "y" ]; \
then \
gcc xxxxxxxxxxxxx;
fi - 错误用法
target3:
ifeq ("$(VAR)", "y")
gcc xxxxxxxxxxx
endif
- 正确用法
- xxx
- xxx
相关阅读 更多 +