Automake:覆盖DEFAULT_INCLUDES

时间:2011-04-12 20:50:53

标签: autotools autoconf automake

我想选择在配置时或编译时重新定义automake使用的包含集。我知道以下工作:

make DEFAULT_INCLUDES= CPPFLAGS="-I. -I/home/development/trunk"

我的问题是,是否有更好的方法来覆盖DEFAULT_INCLUDES?

解决方案必须适用于整个项目,这个项目有点大。使用configure.ac的解决方案是可以接受的,但它必须是可选的。换句话说,我不认为使用带有AM_INIT_AUTOMAKE的nostdinc会起作用,因为似乎没有办法有条件地调用宏。

2 个答案:

答案 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@ )。