我正在使用makefile来运行多个Stata文件,这些文件可以处理文本文件,其他数据集等。每次运行make时,它都会运行analysis.do
,即使我没有对其进行任何更改依赖性。
这是makefile:
.PHONY: clean spotless
STATACOMMAND=/opt/stata/stata-mp -b
analysis.txt: analysis.do uniform.dta normal.dta
$(STATACOMMAND) analysis.do
uniform.dta: uniform.do
$(STATACOMMAND) uniform.do
normal.dta: normal.do noise.txt
$(STATACOMMAND) normal.do
clean:
-rm *.log
spotless: clean
-rm analysis.txt
-rm *.dta
analysis.do
use normal.dta, clear
merge t using uniform.dta
log using analysis.txt, text
regress norm unif
log close
normal.do
clear
insheet using "noise.txt", clear
gen t = _n
gen norm = rnormal()
sort t
save normal.dta, replace
uniform.do
clear
set obs 10
gen t = _n
gen unif = runiform()
sort t
save uniform.dta, replace
noise.txt
noise
14
49
59
63
55
13
60
54
26
39
我的实际代码有更多的文件显示出这个问题,但我希望这个简单的例子至少可以帮助我缩小范围。
更新:文件修改时间是否以某种方式未更新?每次运行makefile时,我都会在make -d
的末尾看到这些消息:
Finished prerequisites of target file `analysis.txt'.
Prerequisite `analysis.do' is older than target `analysis.txt'.
Prerequisite `uniform.dta' is newer than target `analysis.txt'.
Prerequisite `normal.dta' is newer than target `analysis.txt'.
Must remake target `analysis.txt'.
这是另一个例子。假设我已经运行make
几次。以下是文件修改时间:
-rw-r--r-- 1 ricardo ricardo 105 Mar 1 19:25 analysis.do
-rw-r--r-- 1 ricardo ricardo 1.1K Mar 2 13:26 analysis.log
-rw-r--r-- 1 ricardo ricardo 1.5K Mar 1 19:25 analysis.txt
-rw-r--r-- 1 ricardo ricardo 317 Mar 1 19:41 makefile
-rw-r--r-- 1 ricardo ricardo 36 Mar 1 19:34 noise.txt
-rw-r--r-- 1 ricardo ricardo 103 Mar 1 19:33 normal.do
-rw-r--r-- 1 ricardo ricardo 803 Mar 1 19:38 normal.dta
-rw-r--r-- 1 ricardo ricardo 1007 Mar 1 19:38 normal.log
-rw-r--r-- 1 ricardo ricardo 83 Mar 1 19:28 uniform.do
-rw-r--r-- 1 ricardo ricardo 594 Mar 1 19:38 uniform.dta
-rw-r--r-- 1 ricardo ricardo 991 Mar 1 19:38 uniform.log
再次运行make
之后,这里有时间。除了由Stata自动生成的.log
文件外,没有时间更改。
-rw-r--r-- 1 ricardo ricardo 105 Mar 1 19:25 analysis.do
-rw-r--r-- 1 ricardo ricardo 1.1K Mar 2 13:29 analysis.log
-rw-r--r-- 1 ricardo ricardo 1.5K Mar 1 19:25 analysis.txt
-rw-r--r-- 1 ricardo ricardo 317 Mar 1 19:41 makefile
-rw-r--r-- 1 ricardo ricardo 36 Mar 1 19:34 noise.txt
-rw-r--r-- 1 ricardo ricardo 103 Mar 1 19:33 normal.do
-rw-r--r-- 1 ricardo ricardo 803 Mar 1 19:38 normal.dta
-rw-r--r-- 1 ricardo ricardo 1007 Mar 1 19:38 normal.log
-rw-r--r-- 1 ricardo ricardo 83 Mar 1 19:28 uniform.do
-rw-r--r-- 1 ricardo ricardo 594 Mar 1 19:38 uniform.dta
-rw-r--r-- 1 ricardo ricardo 991 Mar 1 19:38 uniform.log
这可能是问题吗?
答案 0 :(得分:4)
这是你的问题:
dta/raw4a.dta dta/raw4b.dta: raw4.do raw4datasource/ftp/%.csv
$(STATA) raw4.do
raw4datasource/ftp/%.csv: ;
第一条规则不符合您的想法。先决条件列表中有一个'%',但目标中没有。 这不是模式规则。这些目标不依赖于raw4datasource/ftp/{something}.csv
形式的所有现有文件(或可构建文件),它们取决于目标 raw4datasource/ftp/%.csv
的。这是正确的,名称中包含%
的文件。该文件不存在。并且它不会被构建,因为第二条规则什么都不做。
我看到这样的四条规则,其他依赖于它们。
你必须重新考虑这些规则的设计;决定你想让他们做什么,弄清楚如何让他们工作,并在你尝试将它们挂钩到makefile的其余部分之前单独测试它们。
答案 1 :(得分:1)
您似乎遇到了 stata 的问题。我从未使用过这个工具,但是查看他们的documentation,您应该尝试使用analysis.log
而不是analysis.txt
,并使用以下脚本:
use normal.dta, clear
merge t using uniform.dta
log using analysis, replace text
regress norm unif
log close