Вы указали filelist.d в качестве цели .PHONY, поэтому убедитесь, что создание этой цели на самом деле не обновляет указанный файл. Однако это так, и новое содержимое используется при следующем запуске. При первом запуске отсутствующий файл не является ошибкой, потому что в качестве префикса include используется тире.
Удалить filelist.d из .PHONY. Однако помните, что он не будет восстановлен снова, пока вы не удалите его (так как это ни от чего не зависит).
К тому же токену, вы должны включить «default» в .PHONY.
Я написал сценарий оболочки вместо того, чтобы объединить все это в make-файле:
#!/bin/bash
# Check whether file $1 is less than $2 days old.
[ $# -eq 2 ] || {
echo "Usage: $0 FILE DAYS" >&2
exit 2
}
FILE="$1"
DAYS="$2"
[ -f "$FILE" ] || exit 1 # doesn't exist or not a file
TODAY=$(date +%s)
TARGET=$(($TODAY - ($DAYS * 24 * 60 * 60)))
MODIFIED=$(date -r "$FILE" +%s)
(($TARGET < $MODIFIED))
Замените X на максимальное количество дней, которое может пройти до повторной загрузки filelist.d:
filelist.d: force-make
./less-than-days $@ X || command-to-update
.PHONY: force-make
force-make:
Теперь filelist.d зависит от цели .PHONY, но не является фальшивкой. Это означает, что filelist.d всегда устарел (фальшивые цели всегда «новые»), но его рецепт только периодически обновляет файл.
К сожалению, для этого необходимо написать команду обновления как одну команду, и пробел может стать проблемой, если он длинный. В этом случае я бы поставил его и в отдельный скрипт.