问题标签 [gnu-make]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
12402 浏览

makefile - 使用单个操作/规则生成多个目标

如何编写规则以使用单个操作生成一组文件。

示例:文件x, y,z是单次执行t.sh以文件a为输入的脚本的结果。

GNU make 尝试执行t.sh3 次。

0 投票
1 回答
219 浏览

qt4 - Qt4书上说“make release”,现实不同意

根据各种来源,对于 Qt4 应用程序,您使用“make release”或“make debug”构建发布或调试版本。在现实生活中,这些会产生错误。

只有赤裸裸的“制作”作品。我不确定它会产生什么。运行“strip”确实减少了可执行文件的大小,但 gdb 没有在未剥离的文件中找到符号。我在 Arch Linux 上使用 qt4.6.2。

那么确定是发布还是调试的正确方法是什么?

0 投票
2 回答
6670 浏览

makefile - 如何为 GNU Make 的不同文件名编写不同的隐式规则

我有一个目录,我在其中不断添加不同的 C++ 源文件和通用 Makefile 来编译它们。这是 Makefile 的内容:

注意:从上面很明显,我将 *.out 用于可执行文件扩展名(而不是用于目标文件)。

此外,还有一些文件是一起编译的:

为了编译这样的文件,到目前为止我一直在 Makefile 中添加明确的规则:

但是现在我的 Makefile 有很多显式规则,我想用更简单的隐式规则替换它们。

知道怎么做吗?

0 投票
2 回答
25097 浏览

makefile - GNU Makefile:单个规则的多个输出+防止中间文件被删除

这是从这里开始的问题的延续。问题是有一个规则会从单个输入生成多个输出,并且该命令很耗时,因此我们希望避免重新计算。现在还有一个额外的转折,我们希望防止文件作为中间文件被删除,并且规则涉及通配符以允许参数。


建议的解决方案是我们设置以下规则:

然后,调用make file-c.out创建了两者,我们避免了与switchmake并行运行的问题。-j到目前为止一切都很好。


问题如下。由于上述方案在DAG中建立了一个链,make考虑不同;这些文件被视为中间文件,默认情况下,一旦准备好,它们就会被删除,因为它们是不必要file-a.out的。file-b.outfile-c.out

此处某处提到了一种避免这种情况的方法,包括添加file-a.outfile-b.out作为目标的依赖项.SECONDARY,以防止它们被删除。不幸的是,这并不能解决我的问题,因为我的规则使用通配符模式;具体来说,我的规则看起来更像这样:

这样就可以传递包含在文件名中的参数,例如通过运行

文档建议的解决方案make是将这些作为隐式规则添加到 的依赖项列表中.PRECIOUS,从而防止这些文件被删除。


该解决方案.PRECIOUS有效,但它还可以防止在规则失败且文件不完整时删除这些文件。有没有其他方法可以使这项工作?

解决这个问题的一个技巧是定义一个.SECONDARY没有先决条件的目标,即

它通知make所有文件都应该被视为次要文件,因此不会被删除,除非make被中断或规则失败。不幸的是,这不允许选择带有通配符的规则子集以这种方式工作,所以我认为这只是一个 hack(尽管它很有用)。

0 投票
2 回答
777 浏览

bash - Makefile 和 rm -f 文件。{ext1,ext2,ext3} 问题

你能解释一下,为什么 Makefile 规则:

不会导致删除文件:foo.bar1 foo.bar2 和 foo.bar3?我相信我在各种 Makefile 中多次看到过这样的模式,但我目前正在编写自己的 Makefile 并且无法使该规则正常工作(没有文件被删除)。

我正在使用:

  • GNU 使 3.81
  • GNU 重击 4.1.5

正如我所怀疑的那样,Bash 评估了该模式:

谢谢!

更新

感谢大卫的提示,我找到了上述问题的解决方案。gnu make 默认使用 /bin/sh,这就是为什么 a.{1,2,3} 不被评估为 a.1 a.2 a.3。

要制作“make”,请使用 bash 而不是 sh 在 Makefile 中添加以下行:

从现在开始 a.{1,2,3} 将被视为 a.1 a.2 a.3

0 投票
1 回答
43 浏览

debugging - 如何捕获两个目录之间的 GNUMake 差异

我对 gmake 有一个棘手的问题,当我从父目录构建时,有些不同,并且 make 不会构建它需要的所有 .o(s) 并且失败,但是如果我 cd 到目录并执行 make 它构建他们很好。

我怎样才能让 GNUmake 告诉我这两次运行之间的区别?必须在父级中设置一些 make 变量会破坏子级,但我需要帮助弄清楚如何追踪它们。

0 投票
3 回答
204 浏览

recursion - 如何调用 shell 来创建一个新环境以在另一个 make 中运行一个 make?

我希望在我的 GNUmakefile 中有一个调用新 shell 的目标规则,然后使用新 shell 的干净石板调用新的 make。

这样做的语法是什么?

我试过了,但没有用:

它会无限重复以下错误:

0 投票
2 回答
37348 浏览

makefile - 如何将当前目录捕获为 make 变量中的绝对路径名?

我想在 GNUmake 文件运行期间将当前目录放入 make 变量中。

这样做的语法是什么?像这样的东西?

0 投票
16 回答
61287 浏览

makefile - 在 GNU make 中列出定义中包含变量的目标/目标

我有一个相当大的makefile,它通过从变量中计算名称来动态创建许多目标。(例如 foo$(VAR) : $(PREREQS))。有什么方法可以说服 gnu make 在扩展这些变量后吐出目标列表?

我希望能够获得任意生成文件的目标。我正在尝试为我的 shell 编写一个完成函数。

0 投票
1 回答
895 浏览

makefile - Makefile 通用模式规则——来自 xyzzy.ext0 的 xyzzy-en_US.ext2

我想不出一种方法来为以下使用 make 的生产定义通用模式规则:

xyzzy-en_US.ext2来自xyzzy.ext0via的要求xyzzy.ext1

这有效:

但是如何概括第二条规则的语言环境部分呢?还是我需要为所有不同的语言环境生成规则?

这些都不起作用: