自动包含头目录 Automake

Posted

技术标签:

【中文标题】自动包含头目录 Automake【英文标题】:Include header directory automatically Automake 【发布时间】:2018-09-13 14:07:03 【问题描述】:

我有一个 Automake 项目,其目录结构如下:

Makefile.am
src/
src/common
src/common/common.c
src/common/common.h
src/common/Makefile.am
src/mylib
src/mylib/mylib.c
src/mylib/mylib.h
src/mylib/Makefile.am

src/common/Makefile.am 上有一个 Libtool 便利库目标:

noinst_LTLIBRARIES = libcommon.la
libcommon_la_SOURCES = common.c common.h

src/mylib/Makefile.am上有一个Libtool公共共享库目标:

lib_LTLIBRARIES = libmylib.la
libmylib_la_SOURCES = mylib.c mylib.h
libmylib_la_LIBADD = ../common/libcommon.la

现在我希望 Automake 足够聪明,可以自动将指向common.h 所在目录的-I 添加到libmylib_la_CFLAGS,因为它依赖于libcommon.la

实际上是否有一种机制可以启用此功能(类似于 CMake 的 INTERFACE_INCLUDE_DIRECTORIES)或可能已经包含属于 libcommon 便利库的所有标头的变量(例如 libcommon_la_HEADERS)?

我到处研究,找不到解决方法,而是直接将-I ../common/ 添加到 mylib CFLAGS。

【问题讨论】:

你可以认为 Automake 是 make 的一个扩展,它只做你告诉它去做的事情。例如,如果您碰巧列出了 C++ 源文件,是否应该将 -I../common/ 添加到 libmylib_la_CXXFLAGSlibmylib_la_CFLAGS 中? CPPFLAGSCXXCPPFLAGS 呢? Automake 不会做你没有告诉它去做的事情。此外,src/mylib/Makefile 可能不知道如何创建作为依赖项的 ../common/libcommon.la,因为它的构建规则位于不同的 Makefile 中,因此希望您控制构建始终在 libmylib.la 之前构建 libcommon.la(假设可以)。 另外,libXXX_la_CFLAGSlibXXX_la_CPPFLAGS 等是与 CMake 的 INTERFACE_INCLUDE_DIRECTORIES 目标属性最接近的 Automake 类似物。还存在 AM_CFLAGS 等允许您将列出的包含指令添加到 每个 编译行,而不是将它们添加到每个目标,类似于 CMake 的 include_directories 命令。 事实上,我最初将 Makefiles 构造为包含在主 ./Makefile.am 中的非递归文件,因此确实会对依赖问题进行排序(为简单起见,此处省略)。我看不到AM_CFLAGS 对非递归自动生成系统的实用性,因为您无法控制它的范围。它要么将标志添加到所有编译中,要么逐个添加。 libXXX_la_CFLAGS 确实是一个选项,但你会得到所有其他不受欢迎的非 -I 标志。 【参考方案1】:

现在我希望 Automake 足够聪明,可以自动添加到 libmylib_la_CFLAGS -I 指向 common.h 所在的目录, 因为它依赖于 libcommon.la。

如您所见,Automake 不会自动执行此操作。

实际上是否有一种机制可以启用此功能(类似于 CMake 的 INTERFACE_INCLUDE_DIRECTORIES)或变量(例如 libcommon_la_HEADERS) 已经包含了所有来自 libcommon 便利库?

只写出变量是唯一的机制。如果您必须多次这样做,您可以使用包含文件或在您的configure.ac 中使用AC_SUBST

请注意,在 Automake 中,通常将 -I 选项放入 _CPPFLAGS 变量之一。而且,根据您的库的作用——特别是如果它生成任何头文件——您可能还希望它同时引用源代码树和构建树。所以结果可能如下所示:

libmylib_la_CPPFLAGS = -I$(srcdir)/../common -I../common

【讨论】:

以上是关于自动包含头目录 Automake的主要内容,如果未能解决你的问题,请参考以下文章

头目说“我不参与研发和测试的工作”,包含哪几个意思

从 CMake 中使用的库继承包含目录

将 cppcheck 集成到构建系统中

Visual Studio 2017 C ++ linux应用程序,标头未复制到目标

六石管理学: 头目们是如何忽略产品质量的

六石管理学: 头目们是如何忽略产品质量的