我使用automake和autoconf。
在子目录src / Makefile.am中包含
bin_PROGRAMS = hello hello_SOURCES = hello.c
在构build好你好之后,我想在二进制文件上运行一个工具(一些安装在系统上的分析器/优化器)来修改它(例如strip)或生成统计数据(例如矮人,pahole等)。 为此目的,顶层目录中的Makefile.am包含
tool: tool src/hello
当build立你好与执行制造工具一切都很好。 当用户运行制作工具而不构build二进制文件时会出现问题。 我怎样才能强制build立bin_PROGRAMS(可能是一个列表)或只是作为目标工具的依赖关系的问候二进制文件?
也不
tool: bin_PROGRAMS tool src/hello
也不
tool: src/hello tool src/hello
工作。
名为“tool”的Makefile目标应该创建一个名为“tool”的文件。 由于“工具”已经存在,Make假定它不需要再次运行命令(我简化了,但只是一点点)。
像这样的构造应该工作:
tool_output: tool src/hello tool src/hello > tool_output
此外,一般来说,我相信你不能使用bin_PROGRAMS
或任何其他Automake 变量 (分配=
)作为依赖 ,但我可能是错的。
你要:
工具:$(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中的工具输出。