Makefile 中的复杂命令执行

Posted

技术标签:

【中文标题】Makefile 中的复杂命令执行【英文标题】:Complex command execution in Makefile 【发布时间】:2013-03-20 06:53:47 【问题描述】:

我有一个关于在当前系统的 makefile 中执行复杂命令的查询。

我目前在 makefile 中使用 shell 命令来执行命令。但是我的命令失败了,因为它是许多命令的组合,并且执行会收集大量数据。 makefile 内容是这样的:

variable=$(shell ls -lart | grep name | cut -d/ -f2- )

但是,make 执行失败并导致 execvp 失败,因为文件列表很大,我需要解析所有文件。

请建议我解决此问题的任何方法。基本上我想执行一个复杂的命令并将该输出分配给我想稍后在程序中使用的 makefile 变量。

【问题讨论】:

execvp 之后发布完整的错误消息,指出错误的原因/原因。 Make 通常不会在列出文件时遇到任何问题,无论文件多么庞大,因为您的命令只是将输出通过管道传输到grep,然后再传输到cut。我怀疑是某个命令的执行返回了错误。 感谢回复.. 错误如下.. make make: execvp: /bin/bash: Argument list too long make: *** [all] Error 127 bash >!v 1) 当你给它一个 small 列表(也许是 3 个文件)时,makefile 是否工作? 2) Make 是否在分配variable 时失败,或者在尝试使用variable 时失败? 3)你如何使用variable 嗨,make 文件在赋值后就退出了...为了避免递归执行,我做了修改以使用 := 而不是 =...。我打算使用程序各个后续行中的变量。 你能告诉我们你如何使用variable吗? 【参考方案1】:

(这可能需要几次迭代。)

这看起来像是架构的限制,而不是 Make 限制。有几种方法可以解决它,但你必须向我们展示你是如何使用variable的,否则即使你成功构建它,你也可能无法按照你的意愿使用它。请向我们展示您打算对variable 执行的确切操作。

现在我建议你做几个实验,然后告诉我们结果。首先,使用简短的文件列表(例如三个)尝试分配,以验证分配是否符合您的预期。二、在文件多的目录下,试试:

variable=$(shell ls -lart | grep name)

查看问题出在grep 还是cut

【讨论】:

【参考方案2】:

您可以轻松地使用 shell 功能来获得相同的结果,而不是将文件列表存储在变量中。有点奇怪的是,您将递归 ls 展平以仅获取叶子,然后运行 ​​mkdir -p,这仅在父目录不存在时才真正有用,但如果您知道您想要哪个深度(例如当前目录和所有子目录下一层)你可以这样做:

directories:
        for path in ./*name* ./*/*name*; do \
                mkdir "/some/path/$(basename "$path")" || exit 1; \
        done

或even

find . -name '*name*' -exec mkdir "/some/path/$(basename )" \;

【讨论】:

以上是关于Makefile 中的复杂命令执行的主要内容,如果未能解决你的问题,请参考以下文章

makefile命令基本运用

makefile中的.phony作用(防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高执行Makefile的性能)

makefile中的.phony作用(防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高执行Makefile的性能)

如何让makefile 执行的时候打印所有命令

初识Makefile

Makefile基础