gpt4 book ai didi

autotools - 如何在 autotools 项目中进行条件编译?

转载 作者:行者123 更新时间:2023-12-01 23:00:52 27 4
gpt4 key购买 nike

我有一个自动工具项目。如果用户在构建过程中进行了配置,我希望从项目中排除一些文件。例如,如果构建配置了 --no-gui ,则与 GUI 相关的文件不会包含在构建中。

  1. autoconf 中此类标志的标准宏是什么?可以用 --disable-gui 之类的配置吗?

  2. 如何建立此配置选项和 automake 输入文件之间的链接?

我这里有 Calcote 的介绍性书籍 Autotools。如果你能指点一下所涉及的宏,我可以在书上或网上查找。

谢谢,

伊兰。

最佳答案

根据the autoconf manual ,正确的方法是使用 --enable-FEATURE configure 的参数。这是使用宏 AC_ARG_ENABLE 完成的。 AC_ARG_ENABLE 的四个参数按顺序是 FEATURE , HELP-STRING , ACTION-IF-GIVEN , ACTION-IF-NOT-GIVEN 。所以在 configure.ac :

AC_ARG_ENABLE([gui],
[AS_HELP_STRING([--disable-gui], [Enable GUI support @<:@check@:>@])],
[:],
[enable_gui=check])

AS_HELP_STRING很好地包装了帮助字符串,并且 @<:@@:>@quadrigraphs扩展到 []./configure --help 的输出中。即使我指定了一个空 ACTION-IF-GIVEN , configure仍将设置 enable_guiyesno ,取决于是否 --enable-gui--disable-gui (这是 --enable-gui=no 的别名)已通过。

所以 shell 变量 $enable_gui将是 yes , nocheck 。这是为了制作分发包的可怜的打包者的利益,因为仅基于检查构建可选支持被认为是糟糕的形式。请参阅 automagic dependencies 上的 gentoo 文章,但打包者宁愿构建失败,也不愿默默地不包含所需的功能。

现在,如果$enable_guiyescheck ,我们想要检查依赖关系,如果我们手动启用该功能,则会失败。因为我不知道你的 gui 依赖哪个库,所以我将使用 pkg-config检查gtk+-2.0PKG_CHECK_MODULES 的四个参数(由 pkg-config 包提供)依次为 VARIABLE , MODULES , ACTION-IF-FOUNDACTION-IF-NOT-FOUND :

AS_IF([test "$enable_gui" != "no"],
[PKG_CHECK_MODULES([GTK],
[gtk+-2.0],
[enable_gui=yes],
[AS_IF([test "$enable_gui" = "yes"],
[AC_MSG_ERROR([gtk+-2.0 required, but not found.])],
[enable_gui=no])])])

我们使用AS_IF的原因而不是仅仅编写一个普通的 shell if -表达式为 autoconf扩展封闭宏可能需要的任何内容(此处 PKG_CHECK_MODULES 内部取决于像 PKG_PROG_PKG_CONFIG 这样的宏)。您可以通过执行类似 ./configure --enable-gui PKG_CONFIG=/bin/false 的操作来测试这是否在所有情况下都能正确执行操作。 .

无论如何,我们现在已经解决了enable_gui=check进入 enable_gui=yesenable_gui=no 。现在我们必须将其传递给 automake 。使用的宏是 AM_CONDITIONAL 。它的参数按顺序为 CONDITIONAL ( Makefile.am 中使用的名称)和 CONDITION (shell测试设置CONDITIONAL):

AM_CONDITIONAL([ENABLE_GUI], [test "$enable_gui" = "yes"])

现在,我们转到Makefile.am ,我将假设一个带有几个可选源的简单程序:

# You probably have something real for these.
AM_CFLAGS =
LDADD =

bin_PROGRAMS = elanprog
elanprog_SOURCES = elanprog.c elanfile.c

if ENABLE_GUI
AM_CFLAGS += $(GTK_CFLAGS)
LDADD += $(GTK_LIBS)
elanprog_SOURCES += elangui.c
endif

关于autotools - 如何在 autotools 项目中进行条件编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11898782/

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