自动包含头目录 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_CXXFLAGS
和 libmylib_la_CFLAGS
中? CPPFLAGS
和 CXXCPPFLAGS
呢? Automake 不会做你没有告诉它去做的事情。此外,src/mylib/Makefile
可能不知道如何创建作为依赖项的 ../common/libcommon.la
,因为它的构建规则位于不同的 Makefile 中,因此希望您控制构建始终在 libmylib.la
之前构建 libcommon.la
(假设可以)。
另外,libXXX_la_CFLAGS
、libXXX_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的主要内容,如果未能解决你的问题,请参考以下文章