2014-09-28 55 views
0

我无法理解为什么Make会运行“lib”-recipe,即使文件已经存在。 只要“$(LIBBIN)”不在.PHONY中,它不应该被忽略吗?Make:运行配方,即使前提条件存在

这是来自相关Makefile的摘录(ts = 2,参见“TODO”)。

.PHONY: all clean default apps lib examples 

default: lib 

all: apps lib examples 

apps: $(APPBINS) 

lib: $(LIBBIN) 

examples: $(EXBINS) 

$(LIBBIN): % : %.$(VERSION) 
# TODO -f should really not be necessary. why is the recipe run, when the file exists? 
    ln -sf $^ [email protected] 

$(LIBBIN).$(VERSION): $(LIBOBJECTS) | $(LIBOUTDIR) 
    $(CC) $^ -o [email protected] $(LIBLDFLAGS) 
    chmod 755 [email protected] 

我希望你大师的人知道答案;-)

亲切的问候, yogo1212

编辑:也许我应该说,我已经试着让prereqs 。的lib和所有订单。没有可见的效果。

EDIT2:事实证明,这确实有效。该链接文件似乎有一个时间戳了一分钟,令人困惑。 重新创建文件夹结构并重新启动后,现象消失。

回答

1

您给出的makefile部分是正确的,适用于我,因为您的示例中缺少详细信息,所以我对其进行了简化。所以,你的榜样并不能准确反映你的情况。请尽量提供SSCCE

$ cat Makefile 
LIBBIN = /tmp/foo 
VERSION = 1.0 

lib: $(LIBBIN) 

$(LIBBIN): % : %.$(VERSION) 
     ln -s $^ [email protected] 

$(LIBBIN).$(VERSION): $(LIBOBJECTS) | $(LIBOUTDIR) 
     touch [email protected] 

$ make 
touch /tmp/foo.1.0 
ln -s /tmp/foo.1.0 /tmp/foo 

$ make -f /tmp/x3.mk 
make: Nothing to be done for `lib'. 
+0

你是对的。我将整个项目复制到另一个分区,并按预期工作。 直到重新启动计算机才能使用原始副本,尽管 – Banyoghurt 2014-09-29 13:22:10

相关问题