微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何让用户为 AutoConf 中的依赖项提供安装前缀? --with-package

前段时间在某处看到一个configure脚本,可以指定依赖项的安装前缀,但是不知道是哪里,所以请教各位如何实现。示例:

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

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

EDIT:我在 the docs

中发现了以下段落

--with-package

将安装包 package,因此请配置此包以与 package 一起使用。

[...]

不要使用“--with”选项来指定用于查找某些文件文件名。这超出了“--with”选项的范围

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

解决方法

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

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

这种差异在很大程度上是因为只有两种内置机制可以让 configure 识别额外的命令行参数:AC_ARG_ENABLEAC_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}"]
)

请阅读文档(上面的链接),因为我只介绍了 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 以使其包含在链接标志中相结合。


你还写道:

好的,但是我应该什么时候使用 "to specify the file name to use to find certain files" [如果我不使用 --with 参数]?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。