如何让用户为 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_LIB
或 AC_SEARCH_LIBS
来检查库,那么您需要将它放入LDFLAGS
用于那些测试。但是,LDFLAGS
是一个用户变量,因此您不应对其进行永久更改:
LDFLAGS_save=$LDFLAGS
LDFLAGS="${LDFLAGS} ${bar_ldflags}"
AC_CHECK_LIB([bar], [bar_init])
LDFLAGS=$LDFLAGS_save
这将与将 bar_ldflags
中的标志放入输出变量并写入 Makefile.in
或 Makefile.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
将在构建系统自动重新 configure
s.
时记住其重用价值
前段时间在某处看到一个配置脚本,可以指定依赖的安装前缀,但我不知道那是哪里,所以我请你告诉我如何实现这个。示例:
我有一个依赖库 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_LIB
或 AC_SEARCH_LIBS
来检查库,那么您需要将它放入LDFLAGS
用于那些测试。但是,LDFLAGS
是一个用户变量,因此您不应对其进行永久更改:
LDFLAGS_save=$LDFLAGS
LDFLAGS="${LDFLAGS} ${bar_ldflags}"
AC_CHECK_LIB([bar], [bar_init])
LDFLAGS=$LDFLAGS_save
这将与将 bar_ldflags
中的标志放入输出变量并写入 Makefile.in
或 Makefile.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
将在构建系统自动重新 configure
s.