Я переработал большинство файлов Makefile
для моего проекта диссертации, чтобы правильно отразить рабочий процесс (Создание правил make для зависимостей между целевыми объектами в подкаталогах проекта). Однако в конкретном подкаталоге (prepare
) make
всегда восстанавливает все цели даже при отсутствии изменений в зависимостях. Что может быть причиной такого неожиданного поведения?
ПРИМЕЧАНИЕ. sf.done
- это реальный файл (типа, который я называю "файлы флагов" ), расположенный в другом подкаталоге и созданный/обновленный после завершения сбора данных (import
) - зависимый шаг для цель transform
.
подготовить /Makefile:
IMPORT_DIR=../import
prepare: import \
transform \
cleanup \
merge \
sample
import: $(IMPORT_DIR)/sf.done
transform: transform.done
cleanup: cleanup.done
merge: merge.done
sample: sample.done
transform.done: transform.R import
@$(RSCRIPT) $(R_OPTS) $<
@touch [email protected]
cleanup.done: cleanup.R transform
@$(RSCRIPT) $(R_OPTS) $<
@touch [email protected]
merge.done: merge.R cleanup
@$(RSCRIPT) $(R_OPTS) $<
@touch [email protected]
sample.done: sample.R merge
@$(RSCRIPT) $(R_OPTS) $<
@touch [email protected]
.PHONY: import transform cleanup merge sample clean
# remove intermediate files
clean:
rm -f tmp*.bz2 *.Rdata .Rout
UPDATE:
IMPORT_DIR = ../import
IMPORT_DONE = $(IMPORT_DIR)/sf.done
prepare: import \
transform \
cleanup \
merge \
sample
import: import.done
transform: transform.done
cleanup: cleanup.done
merge: merge.done
sample: sample.done
import.done: $(IMPORT_DONE)
@cd $(IMPORT_DIR) && $(MAKE)
transform.done: transform.R import.done
@$(RSCRIPT) $(R_OPTS) $<
@touch [email protected]
cleanup.done: cleanup.R transform.done
@$(RSCRIPT) $(R_OPTS) $<
@touch [email protected]
merge.done: merge.R cleanup.done
@$(RSCRIPT) $(R_OPTS) $<
@touch [email protected]
sample.done: sample.R merge.done
@$(RSCRIPT) $(R_OPTS) $<
@touch [email protected]
.PHONY: import transform cleanup merge sample clean