我使用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
的工作。
答案 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中列出工具输出。