调用AC_PROG_CXX后禁用libtool的cxx支持

时间:2013-12-23 10:46:08

标签: c++ configure autotools automake libtool

对于我的项目(库),我使用configure with libtool和automake在linux主机下构建。该库包含一个C API,以及一个可选的C ++扩展。所以,从那以后 必须全局调用AC_PROG_CXX,我使用automake条件:

*configure.ac*:

AC_PROG_CC
AC_PROG_CXX
AM_PROG_AR

LT_INIT

... some tests to figure out 'build_cxx' ...

AC_CONDITIONAL([CXX], [ test x$build_cxx = xyes ])

在Makefile.am里面

sources = files.c
if CXX then
   cxx_sources = files.cpp
else
   cxx_sources =
endif

sources = $sources $cxx_sources

然而,当configure无法定位g ++(实际上会杀死c ++扩展的额外逻辑)时,整个事情都不起作用。经过一些研究,我得出的结论是AC_PROG_CXX以某种方式告诉libtool假设c ++支持。我也很惊讶地发现,如果AC_PROG_CXX失败,它会将CXX设置为'g ++'!!!

无论如何,有条件地调用AC_PROG_CXX会产生类似'am_fastdepCXX永远不会定义'的错误,这对我来说似乎是合乎逻辑的。最糟糕的是配置运行时没有显示错误,但它会在链接阶段的后期出现,形成'未知的libtool选项-o'(ouch)。

完整的源代码可以在这里找到 - > http://bitbucket.org/sdlu/sdlu/src

有人能帮助我吗?

提前致谢...

2 个答案:

答案 0 :(得分:1)

这是一个Automake限制,它不关心选择链接器时的条件。

根据this mailing list post的建议,一个解决方法是有条件地重写_LINK命令:

if USE_CXX
    cxx_sources = ...
else
    cxx_sources =
    libSDLU_la_LINK = $(LINK) $(libSDLU_la_CFLAGS) $(libSDLU_la_LDFLAGS)
endif

另一种方式(在同一讨论中提出)是将C ++源代码放入有条件构建和添加的实用程序库中,然后添加到主库中:

if CXX
    noinst_LTLIBRARIES = libSDLUxx.la
    libSDLUxx_la_SOURCES =  src/cxx/SDLU_CButton.cxx \
                            src/cxx/SDLU_CIniHandler.cxx \
                            src/cxx/SDLU_CRenderer.cxx \
                            src/cxx/SDLU_CSprite.cxx \
                            src/cxx/SDLU_CTexture.cxx \
                            src/cxx/SDLU_CWindow.cxx
    libSDLU_la_LIBADD = libSDLUxx.la
endif

一些不相关的笔记

  1. 请勿将生成的文件(Makefile.inconfigure等)放入源代码管理中。

  2. 添加一个bootstrap脚本,调用autotools来生成内容。

  3. 首选pkg-config(即PKG_CHECK_MODULES(SDL2, sdl2))通过手工制作的autoconf宏(即AM_PATH_SDL2);

  4. 不要安装自动阅读器(即SDLU_config.h.in)。当您重新定义PACKAGEVERSION和所有库检测宏时,它会使您的库与每个基于autoconf的软件不兼容。有关如何操作的示例,请参阅my answer in this question

  5. 我会将C ++ API构建并安装为独立的可选库;完全删除sdlu-config脚本,然后编写需要sdluxx.pc的{​​{1}}。不要费心检查C ++编译器是否有效,如果用户通过sdlu他知道他在做什么;我更喜欢让构建失败而不是默默拥有一个不完整的库。

答案 1 :(得分:0)

我认为干扰处理CXX变量不是一个好主意。

使用您自己的变量BUILD_CXX

AC_CONDITIONAL([BUILD_CXX], [ test x$build_cxx = xyes ])here

if BUILD_CXX
  # ....
endif