выполните команду выполнить, даже если базовые файлы не изменились

#makefile

Вопрос:

Я хочу перекомпилировать Unix.zwc , если какой-либо из файлов в Unix/ каталоге изменился. Я создал это Makefile :

 all:    Unix.zwc
    zsh -c 'zcompile -Uz Unix.zwc Unix/*'

Unix.zwc:   Unix/*
 

но когда я запускаю make , он всегда перекомпилирует файл Unix.zwc , даже если ни один из файлов Unix/* не изменился.

Что я делаю не так?

Ответ №1:

Выполняйте работы, сравнивая временные метки файлов. Это правило:

 all:    Unix.zwc
 

говорит, что all файл будет обновлен, если либо (а) он не существует, либо (б) он существует, но время последнего изменения больше, чем у файла Unix.zwc .

Возможно, теперь вы понимаете, почему все всегда перестраивается: файл all никогда не существует, и поэтому он всегда считается устаревшим, поэтому рецепт всегда выполняется. Я не знаю, что на самом zcompile деле делает команда, но либо имя этой цели не должно быть all , это должен быть любой файл zcompile , который генерирует команда, либо вам придется создать all цель вручную touch $@ , например, используя.

Во-вторых, это правило не делает того, чего вы ожидаете:

 Unix.zwc:   Unix/*
 

У вас здесь нет рецепта, а это значит , что make никогда не будет обновляться Unix.zwc , а это значит, что all он не устареет при Unix изменении файла. Если all цель зависит как от Unix.zwc файла, так и от файлов в Unix каталоге (что, похоже, так и есть), вам следует удалить приведенное выше предварительное условие и записать all как:

 all:    Unix.zwc Unix/*
        zsh -c 'zcompile -Uz Unix.zwc Unix/*'
        touch $@
 

Ответ №2:

Что я делаю не так?

Вы вводите команду для компиляции Unix.zwc в рецепт для (фальшивой) цели all вместо рецепта для ее собственной цели.

Поскольку all не существует, его рецепт всегда выполняется. С GNU make желательно пойти еще дальше , явно объявив его фальшивым, чтобы гарантировать, что рецепт будет запущен, даже если файл с именем all действительно создан.

Чего ты хочешь, так это:

 all:    Unix.zwc

Unix.zwc:   Unix/*
    zsh -c 'zcompile -Uz Unix.zwc Unix/*'

.PHONY: all