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 = ...
如果您需要为特定程序覆盖 LDADD
:prog
,那么 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
我想为大量目标(单元测试 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 = ...
如果您需要为特定程序覆盖 LDADD
:prog
,那么 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