Automake AM_LDADD 解决方法

Automake AM_LDADD workaround

我想为大量目标(单元测试 C++ 文件)设置相同的 LDADD 属性(单元测试库)。我首先虽然 automake 可能有 AM_LDADD 变量将该库添加到文件中的所有目标,但事实并非如此。 在一些邮件列表中,我发现一些简短的讨论要求添加它: http://gnu-automake.7480.n7.nabble.com/AM-LIBS-AM-LDADD-td3698.html

我的问题是,你是如何处理的?有什么办法可以避免手动为每个目标添加 LDADD 属性吗?

到目前为止我的 Makefile.am 看起来像:

 test1_SOURCES = ...
 test1_LDADD = -llibrary 
  ...
  ...
 test20_SOURCES = ...
 test20_LDADD = -llibrary 

AM_LDADD 变量的等价物就是 LDADD。例如,

LDADD = -llibrary

test1_SOURCES = ...
...
test20_SOURCES = ...

如果您需要为特定程序覆盖 LDADDprog,那么 prog_LDADD 将始终优先。

我一直认为,因为没有 LDADD 标准环境变量传递给 configure - 正如你在 configure --help 中看到的那样 - [=13 没有真正的原因=].这种是有道理的,因为 configure 脚本和任何选项,例如 --with-foo=<path> 应该(理想情况下)计算出库依赖性。

另一方面,通过 configure 传递 CFLAGS 可能仍然需要一个 AM_CFLAGS,它结合了 CFLAGS 和配置脚本确定的其他编译器标志;甚至 foo_CFLAGS 覆盖。由于 configure 必须通知您的自定义 CFLAGS


此外,我不知道 test<n> 程序是否只采用单个 C++ 源文件,但如果是这样,您可以通过以下方式简化 Makefile.am

LDADD = -llibrary

check_PROGRAMS = test1 test2 ... test20
AM_DEFAULT_SOURCE_EXT = .cc # or .cpp

如所述here


关于您的评论,您可以为此目的使用 convenience library - 这对于测试程序使用的通用代码特别有用:

noinst_LIBRARIES = libfoo.a  # or noinst_LTLIBRARIES = libfoo.la
libfoo_a_SOURCES = MyClass.hh MyClass.cc  # or libfoo_la_SOURCES

LDADD = ./libfoo.a -llibrary # or libfoo.la if using libtool.

... etc ...

在您的 Makefile.am 中修改 LDADD 是个坏主意,即使这看起来很方便。它会使您的构建系统非常脆弱。

特别是,如果用户试图从 make 命令行覆盖 LDADD,那么您在 Makefile.am 中定义的 LDADD 将会消失。期望用户可能会覆盖 LDADD 并非不合理,因此您绝对应该保护自己免受这种情况的影响。

您对 test1_LDADD, ...,test20_LDADD 的原始定义更加稳健,据我了解 automake 手册,推荐使用。

更多信息请看这里的备注: https://www.gnu.org/software/automake/manual/html_node/User-Variables.html https://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html