免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2161 | 回复: 6
打印 上一主题 下一主题

跟我一起写makefile里的小片段 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-07 15:27 |只看该作者 |倒序浏览
在《跟我一起写makefile》----自动生成依赖性
章里有这样的一个片段


    %.d: %.c
            @set -e; rm -f $@; \
             $(CC) -M $(CPPFLAGS) $< >; $@.$$$$; \
             sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ >; $@; \
             rm -f [email=$@.$$$$]$@.$$$$[/email]


(1)其中有好多分号,特别是 $(CC) -M $(CPPFLAGS) $< >; $@.$$$$; \  在这里 >应该是重定向输出,那为什么后面还加分号呢?
(2)sed语句中 's,\($*\)\.o[ :]*,\1.o $@ : ,g'  , ($*\) 代表什么? 或者帮忙分析一下这句可以麽?

论坛徽章:
0
2 [报告]
发表于 2008-10-07 15:39 |只看该作者
论坛升级留下的病根,没办法了,似乎

有些分号是应该没有的

论坛徽章:
0
3 [报告]
发表于 2008-10-07 23:00 |只看该作者
\( \)是正则表达式的语法
$* 表示匹配的pattern

make会把$*先替换成匹配的pattern,然后调用shell执行 \(PATTERN\)

论坛徽章:
0
4 [报告]
发表于 2008-10-08 12:13 |只看该作者

回复 #2 net_robber 的帖子

应该是如你所说,当然了有些必要的;还是需要保留的。

论坛徽章:
0
5 [报告]
发表于 2008-10-08 12:15 |只看该作者

回复 #3 prc 的帖子

's,\($*\)\.o[ :]*,\1.o $@ : ,g'

按理说 ()里的东西是要执行的,在这里我就不太明白了$*怎么执行啊?
另外第二个, 后面\1.o代表了什么啊?

[ 本帖最后由 luckydog1984 于 2008-10-8 12:16 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-10-08 14:17 |只看该作者
shell执行的时候$*已经被make替换成匹配的pattern了
假设这个pattern为foo

那么shell执行的是下面这句
sed 's,\(foo\)\.o[ :]*,\1.o foo.d : ,g'

\( \) \1都是sed语法,与makefile无关

论坛徽章:
0
7 [报告]
发表于 2008-10-08 16:47 |只看该作者

回复 #6 prc 的帖子

恩,我没有看完全

$*  
   这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有用。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo"。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用"$*",除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么"$*"就是空值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP