压缩Makefile中间文件(创建相同目标的两种方法)

压缩Makefile中间文件(创建相同目标的两种方法),makefile,compression,gzip,Makefile,Compression,Gzip,我有一个Makefile,我目前用于编译以外的目的。我不想删除中间文件,我想保留它们,但是gzip它们,然后让Makefile检测到一个中间文件存在,而不是重新计算它,只需解压缩它 假设我有targettarget.txt,它依赖于一个名为intermediate.txt的中间文件,它本身依赖于prereq.txt。比如: target.txt: intermediate.txt intermediate.txt: prereq.txt 现在默认情况下Make删除中间文件,但是我们可以禁用它。

我有一个Makefile,我目前用于编译以外的目的。我不想删除中间文件,我想保留它们,但是gzip它们,然后让Makefile检测到一个中间文件存在,而不是重新计算它,只需解压缩它

假设我有targettarget.txt,它依赖于一个名为intermediate.txt的中间文件,它本身依赖于prereq.txt。比如:

target.txt: intermediate.txt
intermediate.txt: prereq.txt
现在默认情况下Make删除中间文件,但是我们可以禁用它。但是假设两个计算intermediate.txt都需要很长时间,所以我将禁用自动删除它。但是,如果intermediate.txt文件也非常大,那么我想将它(gzip)压缩到intermediate.txt.gz。我不想重新计算该文件,而是要解压现有的压缩文件,即gunzip intermediate.txt.gz


我想问的更大的问题是,基于两种不同的依赖关系,我有两种创建目标的方法。我希望执行具有存在的先决条件的规则,并忽略其他规则,但可能会删除压缩版本,并且仅当中间的先决条件具有较新的时间戳时才重新计算它。有人有什么建议吗?

如果您正在使用GNU Make,您可以使用模式规则(tac用于表示您正在进行的任何处理):

%.txt:%.i.txt
tac$^>$@#以正常方式生成.txt文件
gzip$^#gzip中间文件
%.txt:%.i.txt.gz
gunzip<$^ tac>$@#make.txt,通过在gzip中间文件中进行流式处理
%.i.txt:%.p.txt
tac$^>$@#从prereq生成中间文件

这适用于模式规则,因为如果未找到
.i.txt
文件,Make将进入下一个模式并查找
.i.txt.gz
版本。这不适用于显式规则,因为后面的规则只是替换前面的规则。

如果您使用GNU Make,则可以使用模式规则(tac用于表示您正在执行的任何处理):

%.txt:%.i.txt
tac$^>$@#以正常方式生成.txt文件
gzip$^#gzip中间文件
%.txt:%.i.txt.gz
gunzip<$^ tac>$@#make.txt,通过在gzip中间文件中进行流式处理
%.i.txt:%.p.txt
tac$^>$@#从prereq生成中间文件

这适用于模式规则,因为如果未找到
.i.txt
文件,Make将进入下一个模式并查找
.i.txt.gz
版本。这不适用于显式规则,因为后面的规则只是替换前面的规则。

如果prereq.txt比gzip文件新,我想您不想只解压缩.gz版本。在这种情况下,我倾向于只使用shell测试来存储和恢复gzip文件,而不直接涉及make:

target.txt: intermediate.txt
        ...same as it ever was ....

intermediate.txt: prereq.txt
        if [ $@.gz -nt $< ]; then      \
            gunzip <$@.gz >$@;         \
        else                           \
            whatever >$@ <$<;          \
            gzip <$@ >$@.gz;           \
        fi
target.txt:intermediate.txt
……和以前一样。。。。
intermediate.txt:prereq.txt
如果[$@.gz-nt$<];然后\
gunzip$@\
否则\

不管怎样>$@如果prereq.txt比gzip文件更新,我猜您不想只解压缩.gz版本。在这种情况下,我倾向于只使用shell测试来存储和恢复gzip文件,而不直接涉及make:

target.txt: intermediate.txt
        ...same as it ever was ....

intermediate.txt: prereq.txt
        if [ $@.gz -nt $< ]; then      \
            gunzip <$@.gz >$@;         \
        else                           \
            whatever >$@ <$<;          \
            gzip <$@ >$@.gz;           \
        fi
target.txt:intermediate.txt
……和以前一样。。。。
intermediate.txt:prereq.txt
如果[$@.gz-nt$<];然后\
gunzip$@\
否则\

不管怎样>$@啊,谢谢!这在一定程度上有效。但是,当我有两个压缩中间层时,我需要使其中一个的压缩版本依赖于另一个的压缩版本,以便强制它重新运行所有的压缩版本。啊,谢谢!这在一定程度上有效。但是,当我有两个压缩中间层时,我需要使其中一个的压缩版本依赖于另一个的压缩版本,以便强制它重新运行所有的压缩版本。