我有一个简单的makefile,它运行一个生成3个csv文件的R程序。我使用了这个答案:https://stackoverflow.com/a/3077254/4564432
但我觉得这样做不对。
.PHONY: all one clean
all: one
clean:
-rm *.csv
one: csv1.csv csv2.csv csv3.csv
csv1%csv csv2%csv csv3%csv: myProgram.R
R CMD BATCH $<
当我最初运行make
时,它运行正常,运行我的程序,并生成我的输出。我的理解是,如果我重新运行make,而不更改myProgram.R
它应该知道不运行任何东西,但是我发现使用上面的makefile它会在我运行make
的任何时候重新运行所有内容,而不管时间戳如何
任何帮助都将不胜感激。
编辑: 使用GNU MAKE 3.79.1
我意识到我的输出csvs进入了一个不同的文件夹,所以我需要做one: myFolder/csv1.csv myFolder/csv2.csv etc.
答案 0 :(得分:1)
我已经将你的makefile更改为不需要R但只是执行我假设R正在执行的操作,并且我已经尝试使用GNU make 3.79.1和最新版本,并且它按预期工作:
.PHONY: all one clean
all: one
clean: ; -rm *.csv
one: csv1.csv csv2.csv csv3.csv
csv1%csv csv2%csv csv3%csv: myProgram.R ; touch csv1$*csv csv2$*csv csv3$*csv
当我运行它时它工作正常:
$ make-3.79.1
touch csv1.csv csv2.csv csv3.csv
$ make-3.79.1
make: Nothing to be done for `all'.
$ touch myProgram.R
$ make-3.79.1
touch csv1.csv csv2.csv csv3.csv
$ make-3.79.1
make: Nothing to be done for `all'.
这意味着你的环境不正确(因为rveerd建议你的myProgram.R有未来的时间戳)或者“R”命令没有创建所有这些输出文件,或者它没有更新这些输出文件的时间戳正确。
运行make
后,您应该使用ls -al *.R *.csv
并验证是否已创建所有文件以及它们是否具有预期的时间戳。