【发布时间】: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标志。