GNU make的官方生成依赖例子理解

文章详细解析了GNUmake中使用%.d规则和sed命令生成依赖文件的过程,解释了$*、$@、$<等makefile变量以及$$的含义,并通过示例展示了如何将makefile、shell和sed语法结合来创建目标文件的依赖关系。
摘要由CSDN通过智能技术生成

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值