当前位置:  开发笔记 > 编程语言 > 正文

获取make以在出错时删除其他文件

如何解决《获取make以在出错时删除其他文件》经验,为你挑选了1个好方法。

我们最近讨论了在基于make的构建过程中处理依赖项的.d文件的方式.已经提出了一个问题,即当构建中断时,.d文件有时会被破坏.

我们使用.DELETE_ON_ERROR目标来确保如果构建中断或失败,则删除它正在生成的目标文件.但是我们也在编译时使用GCC生成.d文件,这些文件也需要删除.似乎没有一种直截了当的方式来说明这一点.

所以问题是,在出现错误的情况下,有没有一种方法可以同步删除我们的对象和我们的依赖文件?我们是否可以通过某种方式设置规则,以便它知道同时生成.d和.o文件,如果出现错误则需要删除?

或者,我们还能做些什么来解决损坏的.d文件的问题吗?沿着这些方向的一个建议是生成具有临时名称的.d文件,并且每个文件都有一个单独的后编译步骤,将其复制到正确的名称.



1> Eric Melski..:

一般来说,GNU make不支持具有多个输出的目标.但是,该规则有一个例外:模式规则.如果您可以构建makefile以使其使用模式规则来生成目标文件,那么您可以实现目标.例如:

.DELETE_ON_ERROR:

all: foo.o

%.o %.d: %.c
    @touch $*.d
    @touch $*.o
    @exit 1

当在规则中检测到"错误"时,您会看到使用此makefile,将删除.d和.o文件.这种方法的优点是通过描述如何生成.d文件以及将生成它的规则来更准确地表达依赖图.

或者,在这种情况下,通常的范例正如您所建议的那样:让GCC将.d文件生成为临时文件名,并仅在GCC命令成功完成后将其移动到位.通常这是通过shell的技巧完成的:

all: foo.o

%.o: %.c
    gcc -o $@ -MMD -MF $(basename $@).d.tmp -c $< \
        && mv $(basename $@).d.tmp $(basename $@).d

这里的"神奇"技巧是使用GCC标志-MMD,它生成依赖文件作为编译的副作用,并-MF允许您指定依赖文件的输出名称; 和使用的shell的cmd1 && cmd2语法,这使得shell只执行cmd2如果cmd1成功退出.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有