2015-03-25 188 views
3

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

我的问题是,你如何处理这个问题?有没有办法避免手动添加LDADD属性到每个目标?

到目前为止,我Makefile.am的样子:

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

回答

3

AM_LDADD变量的等效简直是LDADD。例如,

LDADD = -llibrary 

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

如果你需要重写LDADD特定程序:prog,然后prog_LDADD总是会优先。

我一直认为,因为没有LDADD标准的环境变量传递给configure - 因为你可以看到configure --help - 有一个AM_LDADD没有真正的理由。这种情况很有意义,因为configure脚本以及任何选项(例如--with-foo=<path>)都应该(理想情况下)计算出库依赖关系。

在另一方面,通过CFLAGS通过configure可能仍然需要一个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 ... 
+0

感谢您的最后一个技巧,不幸的是,测试需要测试类和原始类,如何处理任何想法? – 2015-03-25 12:40:35

+1

@ VicenteAdolfoBoleaSanchez - 是的,有一个简单的方法 - 我会添加到答案。你是否在你的软件包中使用'libtool'? – 2015-03-25 12:45:55

+0

不是真的只是一个静态库文件(.a),它是第三方库,所以我不想修改它。 – 2015-03-25 12:47:36

2

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

特别是,如果用户试图从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