1

尽管先决条件是最新的,但我有一个总是重新运行规则的 make 文件:

data.tar.bz2: data.tar
    bzip2 --keep data.tar

# The following rule always runs the rule for its prerequisite
# even if it is up-to-date. Note that it doesn't matter whether
# the bunzip2 directory exists or not. I suppose is has something
# to do with the dir/file naming of the rule but I haven't been
# able to decipher why.
bunzip2/data2.tar: data.tar.bz2
    mkdir bunzip2 && cd bunzip2 && bzip2 -ckd ../data.tar.bz2 > data2.tar && cd ..

.PHONY: clean
clean:
    rm -f data.tar.bz2
    rm -Rf bunzip2

任何想法表示赞赏。

4

3 回答 3

1

示例中缺少某些内容 - 但分析过程是相同的,无论如何:您可以使用 make 的调试功能来查看它使用的规则,例如,

make -d
于 2015-03-12T09:16:41.227 回答
1

我想我知道这里发生了什么。

使用@Thomas Dickey 的建议尝试make -d,它说该文件data.tar.bz2data.tar它本身更新。这似乎很愚蠢,因为前者是从后者创建的。但是使用ls --full-time显示 bzip2 存档似乎使用了源文件的时间戳,但它也会在第二位之后截断它。就我而言,时间戳2015-03-12 09:32:02.452091888被截断2015-03-12 09:32:02.000000000,使其看起来比源更新。(截断我的意思是……即使在那种情况下它也不会四舍五入)似乎 bzip 需要提高其时间戳的准确性2015-03-12 13:10:29.6817931522015-03-12 13:10:29.000000000

似乎在使用当前时间时lunzip也会截断时间戳并unxz保留原始时间戳。gzip换句话说,在使用压缩工具时要小心你的makefile,因为它们处理事情的方式不同。

于 2015-03-12T12:05:57.287 回答
1

在文件上设置时间戳的标准 POSIX 系统调用不支持亚秒级精度。为了让这些工具在文件上设置特定时间(他们试图这样做以使压缩文件与原始文件具有相同的时间戳)并保持原始准确性,他们需要使用不同的系统调用;显然他们不这样做。

你可以做些什么来解决这个问题是改变你的规则是这样的:

data.tar.bz2: data.tar
        bzip2 --keep data.tar && touch $@

以便将目标的时间戳设置为“现在”。

ETA用于设置文件修改时间的传统系统调用是utime(),它仅接受以一秒为增量的时间戳。较新版本的 POSIX 规范引入了允许纳秒时间戳设置的utimensat() 。还有utimes()一个允许微秒精度,但长期以来一直被认为是“遗产”。

如果当前最新版本中存在此行为bzip2,我会认为这是一个值得向他们报告错误的错误。

于 2015-03-12T12:56:02.420 回答