在autotools项目中包含(仅限标题)库

时间:2010-11-30 17:17:50

标签: c++ build-process autotools autoconf automake

我想在我的Autotools项目中集成一个只有头文件的C ++库。由于该库使用Autoconf和Automake,我在configure.ac中使用AC_CONFIG_SUBDIRS并将库目录添加到SUBDIRS =中的Makefile.am行。

我的问题是:如何阻止make install安装标头库?我正在构建一个二进制文件,因此我的用户不需要这些标头。

我不想篡改库,所以我可以通过解开新版本来获取升级。

3 个答案:

答案 0 :(得分:2)

这是一个想法。

将您不希望看到的所有第三方库移动到名为noinst/的子目录中。因此,例如,如果您希望使用Boost之类的东西发布项目,请将其解压缩到目录noinst/boost/中。使用AC_CONFIG_SUBDIRS([noinst/boost])。在noinst/Makefile.am内,执行以下操作:

SUBDIRS = boost
# Override Automake's installation targets with the command ":" that does nothing.
install:; @:
install-exec:; @:
install-data:; @:
uninstall:; @:

效果是,无论何时从顶级目录运行某些递归“make install *”或“make uninstall”命令,递归都将在noinst/中停止,而不会访问其子目录。其他递归命令(如“make”,“make clean”或“make dist”)仍将递归到子目录中。

您当然可以直接将install:和朋友覆盖到第三方软件包中,并避免使用额外的noinst/目录。但如果你像我一样,你不想篡改第三方软件包来简化他们的更新。 上述设置的一个很好的属性是,如果有人进入noinst/boost/并决定运行make install,它将起作用。安装软件包时默认情况下不会发生这种情况。

答案 1 :(得分:1)

刚遇到类似的问题,并在automake manual中找到了解决方案:

  

noinst_HEADERS将是在仅包含标题且没有关联的库或程序的目录中使用的正确变量

安德烈亚斯

答案 2 :(得分:0)

然后不要使用SUBDIRS。以下黑客可能有效:

all-local:
        ${MAKE} -C thatlib all

当然,如果库保留在项目之外的自己的目录中,那么最好通过CFLAGS / LIBS标志指向它。