2012-06-19 2 views
0

Я хочу, чтобы правила цели выполнялись, но все зависимые объекты должны считать эту цель удовлетворенной.GNU make: выполнить задачу, но принять зависимость от файла

Как я могу это достичь?

Пример:

$(NETWORK_SHARE)/foo.log: 
    @echo Warning: server offline, still continue ... 
    @exit 0 

foo.csv: $(NETWORK_SHARE)/foo.log 
    @echo Long export from a (different) server 
    @echo sleep 20 
    @echo foo > [email protected] 

Если $ (NETWORK_SHARE) /foo.log существует: foo.csv должна быть восстановлена, если $ (NETWORK_SHARE) /foo.log более новый, чем foo.csv; в противном случае ничего не должно произойти (по умолчанию)

Если $ (NETWORK_SHARE) /foo.log не существует (например, сервер форума, отказ, ...) только сообщение, указывающее на проблемы должны быть напечатаны, но foo.csv должен строиться только в том случае, если foo.csv не существует.

Я играл с .PHONY и возвращаются различные возвращаемые значения, но для случая 2, дорогой «экспорт» происходит, как только я исполняю что-то на $ (NETWORK_SHARE) /foo.log ...

С уважением DIVB

+1

Я не знаю чистого способа сделать это, но вы можете клудж его с условными жгутами команды ... – Beta

+0

Привета, Спасибо, это то, что Однако у меня все еще есть проблема. Я думаю, что нашел хороший способ повторного формулирования: _I хочу вывести сообщение (выполнить команды) на цель, которая соответствует дате_. – divB

ответ

0

Великий, благодаря Thiton's ответ на мой соответствующий вопрос (Force make to find out-of-date condition from file) теперь я могу предоставить хак для решения этой проблемы:

.PHONY: always-remake 

NETWORK_SHARE = //server/dfs/common/logs 

.PHONY: all 
all: foo.csv 

# file does not exist ... 
ifeq "$(wildcard $(NETWORK_SHARE)/foo.log)" "" 

old_file: always-remake 
    @echo Warning: network is not available .... 

foo.csv: old_file 
    @echo Expensive export 
    @sleep 10 
    @echo [email protected] > [email protected] 
else 
foo.csv: $(NETWORK_SHARE)/foo.log 
    @echo Doing expensive export since log file changed ... 
    @sleep 10 
    @echo [email protected] > [email protected] 
endif 

«old_file» является фиктивный файл, который должен быть и никогда не должен быть более новым, чем любой другой файл (например, 1/1/1971, 00:00)

С уважением DIVB

1

Похоже, вместо того, чтобы использовать старый файл (что кто-то может случайно коснуться), вы можете использовать заказ только предпосылку. Вот цитата из Makefile руководства GNU (глава 4,3)

Иногда, однако, у вас есть ситуации, в которой вы хотите наложить конкретный порядок по правилам, которые будут вызываться не заставляя цель обновить, если выполняется одно из этих правил. В этом случае вы хотите определить предварительные условия для заказа. Предварительные требования только для заказа можно указать, разместив символ трубы (|) в предварительных требованиях. список: любые предпосылки слева от символа трубы являются нормальными; любые предпосылок прав являются порядка только:

targets : normal-prerequisites | order-only-prerequisites 
Смежные вопросы