如何让用户为 AutoConf 中的依赖项提供安装前缀?

How to let the user provide an installation prefix for a dependency in AutoConf?

前段时间在某处看到一个配置脚本,可以指定依赖的安装前缀,但我不知道那是哪里,所以我请你告诉我如何实现这个。示例:

我有一个依赖库 bar 的程序 foo。但是bar的安装前缀是/home/user/.local而不是/usr。因此,configure 将无法找到 bar,尽管它已安装。如何让用户向 configure 提供包含依赖项安装前缀的参数?命令行可能如下所示:

~/foo$ ./configure --bar-dir=/home/user/.local

编辑:我在the docs

中找到了以下段落

--with-package

The package package will be installed, so configure this package to work with package.

[...]

Do not use a ‘--with’ option to specify the file name to use to find certain files. That is outside the scope of what ‘--with’ options are for.

好的,但是我应该使用什么选项"to specify the file name to use to find certain files"

尽管手册反对这种做法,但 configure 脚本通过 --with 选项支持这一点相对普遍,因此适当的命令行采用以下形式:

    ~/foo$ ./configure --with-bar-dir=/home/user/.local

这种差异在很大程度上是因为只有两种内置机制可以使 configure 识别额外的命令行参数:AC_ARG_ENABLE and AC_ARG_WITH,并且这些机制提供了相应的参数特殊的形式。后者提供的 --with-xyzzy=... 形式比前者提供的 --enable-xyzzy=... 形式更适合指定库目录。

例如,您可以在 configure.ac:

中使用它
AC_ARG_WITH(
  [bar-dir],
  [AS_HELP_STRING(
    [--with-bar-dir=@<:@directory@:>@],
    [Specify directory as the location of libbar]
   )],
  [bar_ldflags="-L${withval}"]
)

请务必阅读文档(link 上面的内容),因为我只介绍了 AC_ARG_WITH 的功能。

如何使用以这种方式接收到的数据取决于您还想做什么。您可以将它直接放入输出变量中,让 configure 否则忽略它,但是如果您使用 AC_CHECK_LIBAC_SEARCH_LIBS 来检查库,那么您需要将它放入LDFLAGS 用于那些测试。但是,LDFLAGS 是一个用户变量,因此您不应对其进行永久更改:

LDFLAGS_save=$LDFLAGS
LDFLAGS="${LDFLAGS} ${bar_ldflags}"
AC_CHECK_LIB([bar], [bar_init])
LDFLAGS=$LDFLAGS_save

这将与将 bar_ldflags 中的标志放入输出变量并写入 Makefile.inMakefile.am 相结合,以便它包含在 link 标志中。


你还写:

Okay, but when what option should I use "to specify the file name to use to find certain files" [if I don't use a --with argument] ?

假设我们也拒绝 --enable 个参数,Autoconf 提供的唯一其他选项是环境变量。如果你打算依赖一个环境变量,那么你可能想使用 AC_ARG_VAR() 来告诉 Autoconf。这将使您能够将它记录在 configure 的帮助文本中,将自动使其成为一个输出变量(没有明确的 AC_SUBST)并且它将使变量“珍贵”,这样 configure 将在构建系统自动重新 configures.

时记住其重用价值