makefile里的超长变量的拆分

bluejays 2012-11-12 11:41:55
问题貌似很简单,可我折腾了一个周末也搞不定,惭愧啊。

公司有一个makefile已经用了很多年,里面有这么一行:
something: $(OBJS)
echo $(OBJS) >> tmpfile

本来一直很正常的能写进文件,但是几年下来这个变量OBJS越来越长,现在有几万个字符,终于写不进文件了,估计是命令的缓冲区不够用了。

于是我打算把这个变量拆开。最先尝试的是:
echo -e $(foreach x, $(OBJS), $(x)\\\n) >> tmpfile
还有
$(foreach x, $(OBJS), echo $(x) >> tmpfile;)

运行的结果和修改之前类似,但是如果我把$(OBJS)换成一个短的变量就可以,看来即使循环也同样存在缓冲区的问题。

接下来我又想到了awk
echo $(OBJS) | awk -F " " '{ ORS=" "; for (i=1;i<=300;i++) print $i }' >> tmpfile
echo $(OBJS) | awk -F " " '{ ORS=" "; for (i=301;i<=NF;i++) print $i }' >> tmpfile
我在bash里面试了可以成功,没想到在makefile里面就不灵了。后来我发现awk接收到的$0、$1、$NF全都是空的。这次就不是变量大小的问题了,因为我试了一个小的变量也是同样的结果。难道makefile里面的管道不是这么用的?

用cut应该比awk还简单,
echo $(OBJS) | cut -d " " -f 1-300
echo $(OBJS) | cut -d " " -f 301-
但是我的环境里面没有cut,而且即使有也可能遇到同样的管道问题。

当然还有一个思路就是把$(OBJS)的各个部分各自写入文件,但是那样不但涉及到目录结构太复杂,而且以后每次修改这个变量的时候还得记得修改这个写文件的操作,不好维护。

高手们有什么好办法吗?多谢了!
...全文
263 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluejays 2012-11-13
  • 打赏
  • 举报
回复
谢谢。问题解决了。 难者不会,会者不难。 我又研究了一下,据说make会很霸道的把$1、$NF这样的变量当作他自己的变量,所以awk要想在makefile里面用变量就只好多给一个美元了
louyong0571 2012-11-12
  • 打赏
  • 举报
回复
貌似awk写到makefile里的是时候,$i 得是 $$i
FancyMouse 2012-11-12
  • 打赏
  • 举报
回复
你这问题是得重构代码结构啊。这代码结构九成componentize得不好。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧