当前位置: 技术问答>linux和unix
有关跟我学写MAKEFILE里的自动生成依赖性
来源: 互联网 发布时间:2016-10-18
本文导语: 啃了跟我学写MAKEFILE半天发现实在啃不动了,里面1.5.8那节里的自动生成依赖性里的这段代码谁能解释下吗?最好一句一句的慢慢说下明白好吗?或者谁给我点相关的资料能让我读懂下面这段话的,并且理解这个东西到底怎...
啃了跟我学写MAKEFILE半天发现实在啃不动了,里面1.5.8那节里的自动生成依赖性里的这段代码谁能解释下吗?最好一句一句的慢慢说下明白好吗?或者谁给我点相关的资料能让我读懂下面这段话的,并且理解这个东西到底怎么用,谢谢哈
%.d: %.c
@set -e; rm -f $@;
$(CC) -M $(CPPFLAGS) $ $@.$$$$;
sed 's,($*).o[ :]*,1.o $@ : ,g' $@;
rm -f $@.$$$$
%.d: %.c
@set -e; rm -f $@;
$(CC) -M $(CPPFLAGS) $ $@.$$$$;
sed 's,($*).o[ :]*,1.o $@ : ,g' $@;
rm -f $@.$$$$
|
首先你需要学习一个什么叫nakefile内部自动变量,之后就能看懂了。
|
$$$$:
整个脚本(从@set -e 到 rm -f $@.$$$$)会在一个shell里执行,
$$$$在Makefile转义后是传给shell的是$$也就是shell的进程号,
作为临时文件的唯一标识。
sed 's,($*).o[ :]*,1.o $@ : ,g'
将:
整个脚本(从@set -e 到 rm -f $@.$$$$)会在一个shell里执行,
$$$$在Makefile转义后是传给shell的是$$也就是shell的进程号,
作为临时文件的唯一标识。
sed 's,($*).o[ :]*,1.o $@ : ,g'
将:
hello.o hello.d : hello.c /usr/include/stdio.h /usr/include/sys/stdsyms.h
/usr/include/sys/types.h /usr/include/sys/stdsyms.h
/usr/include/sys/_inttypes.h /usr/include/sys/stdsyms.h
/usr/include/machine/vmtypes.h /usr/include/sys/_fd_macros.h
/usr/include/sys/_null.h /usr/include/sys/_size_t.h
/usr/include/sys/stdsyms.h /usr/include/string.h
/usr/include/sys/_inttypes.h /usr/include/sys/_null.h
hello.o : hello.c /usr/include/stdio.h /usr/include/sys/stdsyms.h
/usr/include/sys/types.h /usr/include/sys/stdsyms.h
/usr/include/sys/_inttypes.h /usr/include/sys/stdsyms.h
/usr/include/machine/vmtypes.h /usr/include/sys/_fd_macros.h
/usr/include/sys/_null.h /usr/include/sys/_size_t.h
/usr/include/sys/stdsyms.h /usr/include/string.h
/usr/include/sys/_inttypes.h /usr/include/sys/_null.h
|
同求,感觉只能看懂一部分
|
%.d: %.c
@set -e; rm -f $@;
$(CC) -M $(CPPFLAGS) $ $@.$$$$;
sed 's,($*).o[ :]*,1.o $@ : ,g' $@;
rm -f $@.$$$$
第一句:
set -e设置成这种情况,如果某个命令的返回参数非0,那么整个程序立刻退出. rm -f是删除之前编译的.d文件。
第二句:
编译依赖文件,并把它的名字根据进程号命名成一个临时文件,用进程号命名是一个技巧,这样重名的可能性很小。
第三句:
sed后面''里面是一个sed命令。整个命令的结构是s,match,replace,g, 其中s后面的,号就是常见的/,一般写成s/pattern/pattern/的形式,但也可以把/替换成其他符号,比如这里是逗号。g是全局的意思,具体你查查sed。match和replace都是正则表达式。match部分,要先解析makefile的元字符,$*和$@,这个你查查makefile。()是为了后面的引用,后面的1就是引用这里(和)之间括起的部分模式。[ :]也很好理解,你查查正则表达式的文档。其他的应该很好理解了。整句话的意思是把临时文件做一个修改然后写入目标文件。这个修改是这样的,临时文件的第一行是
my-c-file.o: my-c-file.c ...
修改后是
my-c-file.o my-c-file.d : my-c-file.c ...
第四句:
不用说了吧
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。