Make:即使先决条件存在,也会运行配方

时间:2014-09-28 16:00:27

标签: makefile gnu prerequisites

我无法理解为什么即使文件已经存在,Make也会运行" lib" -recipe。 不应该被忽略,因为#&;;;(LIBBIN)"不在.PHONY?

以下是有问题的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 $^ $@

$(LIBBIN).$(VERSION): $(LIBOBJECTS) | $(LIBOUTDIR)
  $(CC) $^ -o $@ $(LIBLDFLAGS)
  chmod 755 $@

我希望你们中的一位大师知道答案; - )

亲切的问候, yogo1212

编辑:也许我应该说,我已经尝试过这个先决条件。 lib和所有仅订单。没有明显的效果。

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

1 个答案:

答案 0 :(得分:1)

由于您的示例中缺少详细信息,我简化后,您给出的makefile部分是正确的并且对我有用。所以,你的例子并不能准确反映你的情况。请尝试提供SSCCE

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

lib: $(LIBBIN)

$(LIBBIN): % : %.$(VERSION)
        ln -s $^ $@

$(LIBBIN).$(VERSION): $(LIBOBJECTS) | $(LIBOUTDIR)
        touch $@

$ 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'.