【问题标题】:Automake: dependency on build resultAutomake:依赖于构建结果
【发布时间】:2011-01-29 16:14:14
【问题描述】:

我使用 automake 和 autoconf。

在子目录 src/ 中 Makefile.am 包含

bin_PROGRAMS = hello
hello_SOURCES = hello.c

在构建 hello 之后,我想在二进制文件上运行一个工具(系统上安装了一些分析器/优化器)来修改它(例如 strip)或生成统计信息(例如 dwarves、pahole ...)。为此,顶级目录中的 Makefile.am 包含

tool:
         tool src/hello

当使用 make 构建 hello 并执行 make 工具时,一切都很好。当用户运行 make 工具而不构建二进制文件时会出现问题。如何强制构建 bin_PROGRAMS(可能是列表)或仅构建 hello 二进制文件作为目标工具的依赖项?

都没有

tool: bin_PROGRAMS
         tool src/hello

也没有

tool: src/hello
         tool src/hello

工作。

【问题讨论】:

  • 你能发布完整的makefile吗?

标签: linux build autotools autoconf automake


【解决方案1】:

一个名为“工具”的 Makefile 目标应该创建一个名为“工具”的文件。由于“工具”已经存在,Make 假设它不需要再次运行命令(我正在简化,但只是一点点)。

这样的构造应该可以工作:

tool_output: tool src/hello
    tool src/hello > tool_output

另外,一般来说,我认为您不能使用 bin_PROGRAMS 或任何其他 Automake 变量(分配有 =)作为依赖项,但我可能是错的.

【讨论】:

  • 这可能只是个人风格,但我不认为.PHONY / FORCE 用于此目的。它们是对构建目录中奇怪垃圾的防御,而不是绕过 makefile 目标的正常语义的方法。
  • 我的问题是依赖关系,而不是 .PHONY 问题。我知道目标工具必须是 .PHONY 目标,因为它在任何情况下都不会创建输出文件,并且某些垃圾文件可能会与其名称冲突。但无论如何它需要子目录中的二进制文件。
【解决方案2】:

你想要:

工具:$(bin_PROGRAMS)

但是如果您明确指定 src/hello,您将遇到同样的问题。 (也就是说,顶级 Makefile 不知道如何在 src 中构建 hello。)您可能最好执行以下操作:

工具: cd src && $(MAKE) $(AM_MAKEFLAGS) 工具

在顶层并将实际规则放在 src/Makefile.am 中,您可以在其中列出依赖项。但这也是一个非常糟糕的主意。可能最好的办法是使用全本地规则并输入如下内容:

全本地: 工具你好

在 src/Makefile.am 中。这将确保在您运行不带参数的 make 时运行该工具,但在重建 hello 时它不会更新输出。如果这是可以接受的,那么这是一个合理的解决方案。另一种选择是:

工具输出:你好 工具你好

在 src/Makefile.am 中并在 src/Makefile.am 中的 noinst_DATA 中列出工具输出。

【讨论】:

  • 感谢您的建议。我想我会坚持第一个解决方案并递归到子目录中。我需要的工具是可选的,我只需要有意运行它们的可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2016-01-06
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多