2014-09-28 7 views
0

У меня возникли проблемы с пониманием того, почему 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 $^ [email protected] 

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

я надеялся, что один из вас гуру знает ответ ;-)

Уважение, yogo1212

EDIT: может быть, я должен сказать, что я уже пытался сделать предварительные условия , из 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