GNU make的官方生成依赖例子理解
- 直接贴代码
直接贴代码
%.d : %.c@set -e; \gcc -MM $< > $@.$$$$; \sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \rm -f $@.$$$$
对于sed ‘s,($).o[ :],\1.o $@ : ,g’ < @ . @. @.$$$ > $@;不是很理解,通过查找资料终于理解啦,写点东西记录一下。
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;
这个命令包含将makefile、shell、sed这三个语法的特殊字符交叉在一起,优先级应该是makefile、shell、sed,首先是makefile:
$* # makefile的变量,这个变量表示目标模式中“%”及其之前的部分。
$@ # makefile的变量,表示目标文件。
$< # makefile的变量,表示第一个依赖文件。
$$$$ # $是makefile的特殊字符,如过想让makefile不去解释'$',就可以使用'$$',和转义符'\'意思差不多,告诉makefile我就是'$'没别的意思。'$$$$'也就是两个'$$',这里makefile将'$$$$'认为是'$$'
假设有一个目标为main.d带入上面的规则:
main.d : main.c@set -e; \gcc -MM main.c > main.d.$$; \sed 's,\(main\)\.o[ :]*,\1.o main.d : ,g' < main.d.$$ > main.d; \rm -f main.d.$$
接下开交给shell:
$$: 表示当前的线程id;
\(: '\'在shell中用于转义,得到(';
\): '\'在shell中用于转义,得到')';
\.和\1: 这里有个问题,'\.'和'\1'会不会转义呢?应该是没有转义为'\.'和'1',应为sed需要使用'\.'和'\1'。
假设当前线程id为1234,带入上面的规则:
main.d : main.c@set -e; \gcc -MM main.c > main.d.1234; \sed 's,(main).o[ :]*,\1.o main.d : ,g' < main.d.1234 > main.d; \rm -f main.d.1234
sed网上有很多资料,理解下面的命令不难
sed 's,(main).o[ :]*,\1.o main.d : ,g' < main.d.1234 > main.d;