您正试图以$(prefix)
一种意想不到的方式使用。在基于 Autotools 的构建系统中,代表您正在构建的软件的目标$(prefix)
安装位置的前缀。通过在您的 中设置它,您将覆盖将尝试分配的前缀。但是,由于无论如何您似乎没有任何安装目标,至少在那个级别上,这可能更多是形式不佳的问题,而不是故障的原因。Makefile.in
configure
如何将 PARI 的 datadir 的位置插入 Makefile?
我建议在您的配置脚本中计算或发现所需的目录,并通过其自己的输出变量将其导出到生成的 Makefile。让我们先看第二部分,因为它很简单。在configure.in
,以某种方式找到想要的数据目录并将其分配给一个变量
DATADIR=...
,您将通过AC_SUBST
宏创建一个输出变量:
AC_SUBST([DATADIR])
由于您仅使用 Autoconf,而不是 Automake,因此您可以通过更改以下分配手动将其接收到 Makefile 中Makefile.in
:
DATDIR = @DATADIR@
现在,至于首先定位数据目录,您必须先知道您要实现什么,然后才能实现它。根据您的问题和后续评论,在我看来您想要这个:
如果有,请使用用户明确指定的数据目录。除此以外,
查找相对于共享库位置的数据目录。如果那里没有找到,那么
(可选)在prefix
指定的 to下查看configure
,或者在指定的 datadir 下查看(两者都可能来自顶级configure
)。最后,如果还没有找到,那么
查看一些标准位置。
要创建configure
用户可以指定自定义数据目录的选项,您可能会使用AC_ARG_WITH
宏,可能像这样:
AC_ARG_WITH([pari-datadir], [AS_HELP_STRING([--with-pari-datadir],
[explicitly specifies the PARI data directory])],
[], [with_pari_datadir=''])
感谢@BrunoHaible,我们看到虽然 Gnulib 手册没有记录它,但宏的内部文档指定如果AC_LIB_LINKFLAGS
找到 libpari 则它将设置LIBPARI_PREFIX
为库目录前缀。您会发现,当--with-libpari
使用该选项为其提供替代搜索位置时,这确实有效,因此我建议使用该选项。您当然可以尝试调试AC_LIB_LINKFLAGS
以LIBPARI_PREFIX
在找到 lib 的所有情况下设置它,但如果您不想这样做,那么您可以解决它(见下文)。
尽管可以在configure
as中访问默认或指定的安装前缀$prefix
,但我建议改为使用指定的$datadir
. 然而,这有点棘手,因为默认情况下它间接引用前缀。因此,您可以这样做:
eval "datadir_expanded=${datadir}"
最后,您可以硬编码一组前缀,例如/usr
和/usr/local
。
那么,根据上述所有内容,您configure.in
可能会执行以下操作:
DATADIR=
for d in \
${with_pari_datadir} \
${LIBPARI_PREFIX:+${LIBPARI_PREFIX}/share/pari} \
${datadir_expanded}/pari \
/usr/local/share/pari \
/usr/share/pari
do
AS_IF([test -r "$[]d/pari.desc"], [DATADIR="$[]d"; break])
done
AS_IF([test x = "x$DATADIR"], [AC_MSG_ERROR(["Could not identify PARI data directory"])])
AC_SUBST([DATADIR])