我第一次尝试使用它make
来运行一系列脚本。我有一个这样的树目录结构:
project
├── data
│ └── run1
│ └── pass
│ ├── 0
│ ├── 1
│ └── 2
├── include
│ └── variables.mk
├── Makefile
└── scripts
└── operations.sh
我有一个数据集,run1
其中包含多个dirs pass
,所有这些都包含txt
文件。该operations.sh
脚本使用一种方法来递归搜索命名目录(此处为pass
)。我希望有更多的数据(run2
,run3
等),并且希望能够在数据可用时以相同的方式处理它们。为此我使用include
的variables.mk
(不知道这是适当的,但它工作正常),定义$(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)
这将指定一组dirs(data
,analysis
每次运行)。然后,我可以确定要运行的目标operations.sh
。这很好。但这make
在我看来并没有真正使用。我要make
输出,然后重新运行make
,如果没有数据或分析的任何部分更改,则不重新生成输出。
因此,我的问题是:通常,目标是文件。该operations.sh
脚本运行的不是我开发的方法,并且具有关于输入和输出的特定规则(如所见,都是dirs)。我想将目标设置为产生的一组文件operations.sh
。我希望它能像
%.output.txt: $(DATA_DIRS)
sh operations.sh $< > $@
我想我知道如何使用%
命名依赖项,尽管还没有测试过。在访问目标文件$(DATA_DIRS)
时可以给予依赖make
吗?从概念上讲,我不知道从哪方面开始。
很感谢任何形式的帮助。
我认为规则应为:
$(CURDIR)/analysis/%: $(CURDIR)/data/%/pass
sh operations.sh $< $@
基本上有一个针对个人支出的规则。假设操作采用输入和输出目录。
尽管这可能会“考虑”输出目录,但无论出于何种原因(请考虑查看器中的临时文件)。我个人喜欢手动“标记”完成。
$(CURDIR)/analysis/%/.done: $(CURDIR)/data/%/pass
sh operations.sh $< $(@:/.done=)
touch $@
这会将.done
带有上一次成功创建时间戳记的空文件放在outdir中。
和
operations_run: $(addsuffix /.done,$(OUT_DIRS))
运行整套设备。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句