2013-08-14 5 views
0

Я использую make для копирования файлов в каталог DEST. У меня есть следующее правило:Зависимость от застройщика

$(THUMBS): $(DEST)/% : % 
    mkdir -p $(dir [email protected]) 
    cp $^ [email protected] 

Проблема в том, что иногда исходный файл может не существовать. Вместо того, чтобы генерировать ошибку, я скорее скопировал бы файл-заполнитель.

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

Есть ли элегантный способ достичь этого?

+0

Являются ли файлы в '$ (DEST) /%' встроенными make-файлами или связаны с каким-либо внешним процессом? – bta

+0

'DEST' имеет ту же структуру каталогов, что и каталог make-файла. Исходные файлы создаются в каталоге makefile с внешним процессом. Вот почему правило просто удаляет часть «DEST» цели. – Max

ответ

0

Если файлы в $(DEST) возводятся извне (то есть, не с помощью рецепта макияжа), то вы можете сделать это путем встраивания маленького скрипта в рецепте:

$(THUMBS): 
    mkdir -p $(@D) 
    for file in $(DEST_FILES); do\ 
     if [[ -f $file ]]; then\ 
      cp -f $file [email protected];\ 
     else\ 
      cp -f $(PLACEHOLDER_FILE) [email protected];\ 
     fi;\ 
    done 

Вы не перечисляя файлы в $(DEST) как предпосылки, так что никогда не должны пытаться восстановить их. Вам нужно будет установить PLACEHOLDER_FILE на имя файла-заполнителя, который вы хотите использовать для отсутствия файлов, и установите DEST_FILES в список файлов, которые вы ожидаете увидеть в DEST. Недостатком является то, что без предварительных условий make не будет знать, когда на самом деле не нужно повторно запускать это правило. Вы будете запускать его безоговорочно каждый раз.

+0

Я принял этот ответ, так как он работает, но в конечном итоге это было похоже на слишком много взлома с make. Я закончил полностью переделывать вещи в грабли, что было намного проще! – Max

+0

@Max: Я согласен, я тоже не поклонник этой техники. Другой вариант - изменить внешний процесс, который создает ваши файлы '$ (DEST)/*', и при необходимости создавать файлы-заполнители. В зависимости от того, как именно этот процесс реализуется, этот подход может иметь больше смысла. – bta

Смежные вопросы