【发布时间】:2017-07-19 22:13:15
【问题描述】:
我第一次尝试使用make 来运行一系列脚本。我有一个像这样的树目录结构:
project
├── data
│ └── run1
│ └── pass
│ ├── 0
│ ├── 1
│ └── 2
├── include
│ └── variables.mk
├── Makefile
└── scripts
└── operations.sh
我有一个数据集run1,它在pass 中有多个目录,所有目录都包含txt 文件。 operations.sh 脚本使用递归搜索命名目录(此处为pass)的方法。我希望有更多数据(run2、run3 等),并且希望能够在数据可用时以相同的方式处理它们。为此,我在variables.mk 上使用include(不确定这是否合适,但它工作正常),定义$(INPUT_RUNS),我将在新运行到达时简单地更新它。
我写了一个测试 Makefile
include $(CURDIR)/include/variables.mk
DATA_DIRS := $(addprefix $(CURDIR)/data/, $(foreach r, $(INPUT_RUNS), $(r))/pass)
OUT_DIRS := $(addprefix $(CURDIR)/analysis/, $(foreach r, $(INPUT_RUNS), $(r)))
##targets
all: operations_run
##operations
operations_run: $(OUT_DIRS) $(DATA_DIRS)
mkdir -p $</operations
sh scripts/operations.sh $</operations $(DATA_DIRS)
这指定了一组目录(data、analysis 每次运行)。然后我可以创建一个运行operations.sh 的目标。这工作正常。但在我看来,它实际上并没有正确使用make。我想make 输出,然后如果重新运行make,如果数据或分析的任何部分都没有更改,则不重新生成输出。
因此,我的问题是:通常,目标是文件。 operations.sh 脚本运行的方法不是我开发的,并且对输入和输出有特定的规则(两者都是 dirs)。我想让目标成为operations.sh 生成的一组文件。我希望它能够像
%.output.txt: $(DATA_DIRS)
sh operations.sh $< > $@
我想我知道如何使用% 来命名依赖项,虽然还没有测试过。我可以将 $(DATA_DIRS) 作为依赖项,而 makeing 目标文件吗?从概念上讲,我不知道从哪里开始。
非常感谢任何帮助。
【问题讨论】:
-
如果您告诉我们一些关于“数据或分析”中可能发生的变化的事情会简单得多。你的意思是
txt文件可以添加、删除和修改,还是仅此而已? -
请注意 make 对于函数中的空格是特殊的。逗号后的空格将被视为额外的空输入。例如我认为
DATA_DIRS := $(addprefix $(CURDIR)/data/,$(foreach r,$(INPUT_RUNS),$(r))/pass)是您想要的。 -
@beta,在分析中,
txt文件由脚本重新格式化,该脚本检查“条形码”字符串并将txt中的行排序为多个之一(通常为 8,但最多为 12 ) 目录相应地。初始输入txt不变。虽然我目前有一次运行 (run1),但我期望更多,但这些数据将采用相同的格式并进行相同的分析。 -
@bdecaf 我已经包含了一个测试来回显目录,并且没有空格,但要记住这一点