2016-10-10 37 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