2016-10-10 49 views
0

我有一个简单的生成文件,运行生成3个csv文件的R程序。我用这个回答:https://stackoverflow.com/a/3077254/4564432具有多个目标的makefiles

但我不觉得这是行得通的。

.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

答:

我意识到,我的输出,将CSV中,分别进入不同的文件夹,所以我需要做的one: myFolder/csv1.csv myFolder/csv2.csv etc.

+0

我无法复制此行为。第二轮没有为我重建任何东西。你使用的是什么版本的'make'?我使用'GNU Make 3.81'进行测试 – MrFlick

+0

我正在使用GNU Make 3.79.1 – Carl

+0

这是一个很长的画面,但是myProgram.R的修改日期或时间可能在将来吗? – rveerd

回答

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并验证是否创建了所有文件,并且它们是否具有预期的时间戳。

+0

谢谢,我现在意识到这是我的错,我很愚蠢 – Carl

相关问题