gpt4 book ai didi

autotools - Automake:覆盖 DEFAULT_INCLUDES

转载 作者:行者123 更新时间:2023-12-02 05:11:07 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

如果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) 被附加为最后一个包含搜索路径。

这是为了容纳

#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. 接一个)。

假设您的源目录中没有任何生成的头文件(您可以将它们放在其他地方)那么当您包含源目录中的头文件但您不这样做时,此包含只会“妨碍” '想包括他们。如果你问我,这似乎很糟糕......也就是说,如果你有

#include "foo.h"

在你的源文件中,当然那个源文件应该在srcdir中(这就是为什么你应该在子目录中使用'源文件' - 也就是FOO_SOURCES = subdir/foo.c 但使用 SUBDIRS = subdir 并在 subdir 中编译 foo.c),其中包括将在 srcdir anyway 中查找,因为双引号(此类包含总是首先在包含文件的路径中查找)。

不过,您可以通过添加来覆盖此定义

DEFAULT_INCLUDES =

到你的Makefile.am。即使您将其添加到 Makefile.am 的最顶部,它仍然会在第一个定义下方结束并覆盖它。

或者,就此而言,您可以:

DEFAULT_INCLUDES = @my_default_includes@

并将其设置为您想要的任何值(在您的 configure.ac 中使用 AC_SUBST(my_default_includes))。

关于autotools - Automake:覆盖 DEFAULT_INCLUDES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com