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



我很难理解为什么即使文件已经存在,Make也会运行"lib"-配方。只要"$(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和所有订单。没有明显的效果。

第二版:事实证明这确实有效。链接文件似乎有一个关闭了一分钟的时间戳,make对此感到困惑。在重新创建文件夹结构并重新启动后,这种现象消失了。

由于您的示例中缺少细节,我简化了makefile部分,因此您给出的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'.

最新更新