较短的问题:
使目标具有文件作为依赖项;假设一个示例依赖项是文件“D”。我希望 Make 遍历它的依赖关系图,并且对于每个“D”,还取决于成功记录在“D's”配方的退出状态(“D.status.log”)的日志文件中;为简单起见,仅包括进程退出状态或字符串“Started”)。如果不自己深入研究 Make 的源代码并修改图形逻辑,这是否可行?(即有人已经将其编写为补丁或其他类似 Make 的实用程序?)
细节:
我热衷于使用 Makefile 来运行数据处理工作流。我并不孤单,因为搜索“makefile 数据”会产生一些志同道合的人:
- http://www.bioinformaticszen.com/post/decomplected-workflows-makefiles/
- http://bost.ocks.org/mike/make/
然而,在实践中,我发现这是一种光荣的颈部疼痛。多步骤流程从不一定完成的程序中生成输出。在数千个输入文件上运行多步骤工作流意味着将一些find ... rm
命令拼凑在一起,这感觉像是一种脆弱的数据管理策略。
基本上,我想要一个记录良好的 Make for data 具有这种界面风格:我将在fantasymake
下面调用它。
生成文件:
all: results1 results2
results1: script input1
script input1 >results1
results2: script input2
script input2 >results2
results2beyond: script results2
script results2 >results2beyond
之前的示例目录树:
Makefile
input1
input2
运行后的目录fantasymake
:
Makefile
input1
input2
results1
results1.err.log
results1.out.log
results1.status.log
results2
results2.err.log
results2.out.log
results2.status.log
results2beyond
results2beyond.err.log
results2beyond.out.log
results2beyond.status.log
目前,我可以使用这一点 Bash 获取日志,但我还没有找到一种优雅的方式将这些包装器命令集成到 Makefile 规则中:
echo Started. >results.status.log
some_program >results.out.log 2>results.err.log
echo $? >results.status.log
(回顾 Makefile 定义中的每个未连接的行是一个单独的 shell:一个 in-Makefile 包装器将在 和 之间有一个续行(反斜杠)some_program ...
,echo $$?
以确保它们都在同一个 shell 中执行。)
回到fantasymake
行为,这将是运行后的目录fantasymake clean
:
Makefile
input1
input2
假设 running fantasymake
、results2
failed 或被终止。(假设我们没有fantasymake clean
。) Thenresults2beyond
不会生成;在这里,我认为我不能只依赖未修改的 Make:失败的results2.status.log
日志,因此不会继续进行下一次调用。results2
fantasymake
results2beyond
为了完成构建,clean-failed
规则可以清除错误的结果。如果你有一个更容易从 Make 中排除的数据库依赖项(或实时连接),你可能需要这个。这是目录在运行后的样子,fantasymake clean-failed
而不是fantasymake clean
:
Makefile
input1
input2
results1
results1.err.log
results1.out.log
results1.status.log
假设运行后fantasymake clean-failed
,script
更新。然后运行fantasymake
将重新生成results1
,并且它的日志并排在results2
.
从 Wikipedia(构建自动化软件列表)一目了然,它看起来不像makepp
, omake
, 或cmake
做的伎俩。该页面上的列表(我不再享有链接的声誉)有点长,所以我转向这个已经帮助我多次潜伏的可爱人群。
这是我必须一起破解的扩展,还是已经存在?