Automake:依赖于构建结果

时间:2011-01-29 16:14:14

标签: linux build autotools autoconf automake

我使用automake和autoconf。

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

bin_PROGRAMS = hello
hello_SOURCES = hello.c

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

tool:
         tool src/hello

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

无论

tool: bin_PROGRAMS
         tool src/hello

也不是

tool: src/hello
         tool src/hello

的工作。

2 个答案:

答案 0 :(得分:1)

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

这样的结构应该有效:

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

另外,一般情况下,我认为您无法使用bin_PROGRAMS或任何其他Automake 变量(已分配=)作为依赖,但我错了。

答案 1 :(得分:1)

你想:

tool: $(bin_PROGRAMS)

但是你会遇到同样的问题,就像你明确指定src / hello一样。 (也就是说,顶级Makefile不知道如何在src中构建hello。)你可能最好做一些像:

tool:
        cd src && $(MAKE) $(AM_MAKEFLAGS) tool

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

all-local:
        tool hello

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

tool-output: hello
        tool hello

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