制作和最后修改目录的时间在Linux上(Make and last modification tim

2019-09-01 19:30发布

考虑下面的Makefile:

foo :
    mkdir foo

foo/a.out : foo a.in
    cp a.in foo/a.out

foo/b.out : foo b.in
    cp b.in foo/b.out

与它下面的互动,从包含文件的目录开始a.inb.in ,没有别的:

$ make foo/a.out
mkdir foo
cp a.in foo/a.out

到现在为止还挺好。

$ make foo/b.out
cp b.in foo/b.out

还是不错的,但现在:

$ make foo/a.out   # a.out should be up to date now!
cp a.in foo/a.out

它重建a.out目标,即使没有任何先决条件,已经改变了。

这似乎是发生了什么事是,当foo/b.out创建,目录的最后修改时间foo被更新,所以挑选一个了具有“改变”。

是否有办法避免这种情况? 例如,有没有声明的方式foo/a.out取决于foo仅在foo已经存在了,里面的文件的创建foo不会导致foo被认为已经过时?

Answer 1:

作为上做出权威最近指出 :

但我认为这会做你想要什么:

foo :
    mkdir foo

foo/a.out : a.in | foo
    cp a.in foo/a.out

foo/b.out : b.in | foo
    cp b.in foo/b.out


Answer 2:

我喜欢@贝塔的答案,但它是不可移植。 对于一个简单的解决办法便携,当您创建的目录,并且依赖于定点文件,而不是创建一个前哨文件。

foo/.dir:
        mkdir -p foo
        touch $@
foo/a.out: a.in foo/.dir
        cp $< $@
foo/b.out: b.in foo/.dir
        cp $< $@

这可以用一个模式规则被进一步简化:

foo/%.out: %.in foo/.dir
        cp $< $@


Answer 3:

而不是使目标依赖于目录,你可以简单地无条件地在自己构建的规则创建的目录:

foo/a.out: a.in
        mkdir -p foo
        cp a.in foo/a.out

foo/b.out: b.in
        mkdir -p foo
        cp b.in foo/b.out

这避免了使用目录的先决条件问题。



文章来源: Make and last modification times of directories on Linux