包含多个目标的makefile

时间:2016-10-10 21:11:01

标签: r makefile

我有一个简单的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.

1 个答案:

答案 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并验证是否已创建所有文件以及它们是否具有预期的时间戳。