#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