我想选择在配置时或编译时重新定义automake使用的包含集。我知道以下工作:
make DEFAULT_INCLUDES= CPPFLAGS="-I. -I/home/development/trunk"
我的问题是,是否有更好的方法来覆盖DEFAULT_INCLUDES?
解决方案必须适用于整个项目,这个项目有点大。使用configure.ac的解决方案是可以接受的,但它必须是可选的。换句话说,我不认为使用带有AM_INIT_AUTOMAKE的nostdinc会起作用,因为似乎没有办法有条件地调用宏。
答案 0 :(得分:0)
Autoconf's manual建议使用config.site
文件。
答案 1 :(得分:0)
如果configure.ac
包含
AC_CONFIG_HEADERS([foo/config.h])
然后生成的Makefile.in
将包含
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/foo
因此,仅使用AC_CONFIG_HEADERS([config.h])
总是会导致-I$(top_builddir)
作为最后一个include搜索路径被附加。
这是为了容纳
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
在您的源代码中。
我认为top_builddir应该只包含config.h
;并且您的应用程序应该只有一个configure.ac
,因此只有一个config.h
,
因此,如果应用程序执行#include "config.h"
,它将无法编译或在top_builddir中找到config.h
。
然后,仍然有前导-I.
。我认为那有点可疑
我自己,因为似乎仅需要从对象目录(构建目录)中拾取生成的头文件,毕竟,在 build 目录中是否要包含其他内容?但是,由于在源树本身中编译应用程序时也必须能够对其进行编译(在这种情况下,builddir == srcdir),因此它会自动包含源目录。为了使这两种情况至少相等,当构建目录和源目录不同时,必须(然后)还包括源目录。
只有当构建目录和源目录不相同时,@am__isrc@
才会扩展为-I$(srcdir)
(这只是为了避免有两个-I. -I.
一个接一个)。
假设您在源目录中没有生成的头文件(可以将它们放置在其他位置),那么当您在源目录中包含ARE头但您没有将头文件包括在内时,此include只会“妨碍您”不想包括他们。如果您问我,那似乎很不对劲……即,如果您有
#include "foo.h"
位于源文件中,并且可以确定源文件应该位于srcdir中(这就是为什么您不应该不在子目录中使用“源文件”的原因-aka {{ 1}},但改用FOO_SOURCES = subdir/foo.c
并在SUBDIRS = subdir
中编译foo.c
),由于包含双引号,所以include将在srcdir 中查找(因为include是总是首先在包含文件的路径中寻找)。
不过,您可以通过添加来覆盖此定义
subdir
致您的DEFAULT_INCLUDES =
。即使将其添加到Makefile.am
的最顶部,它仍将最终位于第一个定义下方并覆盖它。
或者,您可以这样做:
Makefile.am
并将其设置为所需的任何内容(在configure.ac中使用DEFAULT_INCLUDES = @my_default_includes@
)。