【发布时间】:2013-03-03 17:42:24
【问题描述】:
我正在使用一个 makefile 来运行几个与文本文件、其他数据集等一起使用的 Stata 文件。每次我运行 make 时,它都会运行 analysis.do,即使我没有对任何依赖关系。
这是生成文件:
.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
分析.做
use normal.dta, clear
merge t using uniform.dta
log using analysis.txt, text
regress norm unif
log close
正常的.do
clear
insheet using "noise.txt", clear
gen t = _n
gen norm = rnormal()
sort t
save normal.dta, replace
制服.do
clear
set obs 10
gen t = _n
gen unif = runiform()
sort t
save uniform.dta, replace
噪音.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
这可能是问题吗?
【问题讨论】:
-
你说它通过
raw12.do构建raw4.do,但我认为没有规则可以重建这些目标中的任何(可能除了raw9.do,但这看起来像错字)。而且其中一些规则几乎肯定不会像你认为的那样做。当你make raw4.do时会发生什么? -
如何创建
dta/raw10b.dta所需的dta/finaldata.dta? -
@Beta 抱歉,我最初的陈述是错误的。它不构建 do 文件,而是运行它们。它重建与这些关联的 dta 文件。如果我运行
make raw4.do,它会告诉我无事可做。 -
@AlexCohn @AlexCohn 我的理解是,当 make 寻找构建
dta/finaldata时,它会将dta/raw10b.dta视为依赖项,因此它会跳转到该规则。它将dta/raw10a.dta视为依赖项,因此查看其规则。看到这条规则,它运行raw10.do,它同时构建dta/raw10a.dta和dta/raw10b.dta。让规则与我编辑中的版本一样更有意义吗? -
为什么需要
dta/raw10a.dta作为目标?无论如何,编辑确实有意义:如果$(STATA) raw10.do构建(以及其他输出)dta/raw10a.dtb,它应该是dta/raw10a.dtb的规则。