0

我正在使用 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

分析.do

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

我的实际代码有更多文件显示此问题,但我希望这个简单的示例至少可以帮助我缩小范围。

更新:文件修改时间是否以某种方式没有更新?make -d每次运行 makefile 时,我都会在最后看到这些消息:

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

这可能是问题吗?

4

2 回答 2

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 的其余部分之前单独测试它们

于 2013-02-18T18:08:36.550 回答
1

看来您的stata有问题。我从未使用过此工具,但查看他们的文档,您可能应该尝试analysis.log代替analysis.txt,以及以下脚本:

use normal.dta, clear
merge t using uniform.dta
log using analysis, replace text
regress norm unif
log close
于 2013-03-03T09:42:24.630 回答