【问题标题】:How to let the user provide an installation prefix for a dependency in AutoConf?如何让用户为 AutoConf 中的依赖项提供安装前缀?
【发布时间】:2021-09-25 22:29:33
【问题描述】:

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

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

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

编辑:我在the docs中找到以下段落

--with-package

package 包将被安装,因此请配置此包以使用 package

[...]

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

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

【问题讨论】:

    标签: dependencies command-line-arguments configure autotools autoconf


    【解决方案1】:

    尽管手册反对这种做法,但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),它将使变量“珍贵”,这样configure 将纪念它构建系统自动reconfigures时重用的值。

    【讨论】:

    • @&lt;:@directory@:&gt;@ - 你能解释一下这是什么意思吗?这对我来说是胡言乱语……
    • @Programmer,@&lt;:@@:&gt;@是Autoconf quadrigraphs,分别代表字符[]。因此,整个构造表示文本 [directory],但确保 Autoconf 不会将 [] 解释为引号字符。
    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2017-12-08
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多