1

CLISPPARI接口配置有包含from 。configure.inAC_LIB_LINKFLAGS([pari])lib-link.m4

构建过程还需要Makefile知道datadirofPARI的位置。为此,Makefile.in

prefix = @LIBPARI_PREFIX@
DATADIR = @datadir@

并期望找到$(DATADIR)/pari/pari.desc(通常 /usr/share/pari/pari.desc/usr/local/share/pari/pari.desc)。

这似乎适用于PARIhomebrew安装在/usr/local(and LIBPARI_PREFIX=/usr/local) 中的 Mac OS X,但不适用于 Ubuntu 上,其中PARI是 in /usr,并且LIBPARI_PREFIXempty

如何将PARI's的位置datadir插入Makefile?

PS。我还在autoconf 邮件列表上问过这个问题。

聚苯乙烯。响应@BrunoHaible 的建议,这是在Linux 上调试的微不足道的尝试(其中LIBPARI_PREFIX)。

$ bash -x configure 2>&1 | grep found_dir
+ found_dir=
+ eval ac_val=$found_dir
+ eval ac_val=$found_dir
4

2 回答 2

2

您正试图以$(prefix)一种意想不到的方式使用。在基于 Autotools 的构建系统中,代表您正在构建的软件的目标$(prefix)安装位置的前缀。通过在您的 中设置它,您将覆盖将尝试分配的前缀。但是,由于无论如何您似乎没有任何安装目标,至少在那个级别上,这可能更多是形式不佳的问题,而不是故障的原因。Makefile.inconfigure

如何将 PARI 的 datadir 的位置插入 Makefile?

我建议在您的配置脚本中计算或发现所需的目录,并通过其自己的输出变量将其导出到生成的 Makefile。让我们先看第二部分,因为它很简单。在configure.in,以某种方式找到想要的数据目录并将其分配给一个变量

DATADIR=...

,您将通过AC_SUBST宏创建一个输出变量:

AC_SUBST([DATADIR])

由于您仅使用 Autoconf,而不是 Automake,因此您可以通过更改以下分配手动将其接收到 Makefile 中Makefile.in

DATDIR = @DATADIR@

现在,至于首先定位数据目录,您必须先知道您要实现什么,然后才能实现它。根据您的问题和后续评论,在我看来您想要这个:

  1. 如果有,请使用用户明确指定的数据目录。除此以外,

  2. 查找相对于共享库位置的数据目录。如果那里没有找到,那么

  3. (可选)在prefix指定的 to下查看configure,或者在指定的 datadir 下查看(两者都可能来自顶级configure)。最后,如果还没有找到,那么

  4. 查看一些标准位置。

要创建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_LINKFLAGSLIBPARI_PREFIX在找到 lib 的所有情况下设置它,但如果您不想这样做,那么您可以解决它(见下文)。

尽管可以在configureas中访问默认或指定的安装前缀$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])
于 2018-01-16T20:34:32.810 回答
0

与其猜测 的位置datadir,不如问问 PARI/GP 它在哪里datadir?即,

$ echo "default(datadir)" | gp -qf
"/usr/share/pari"

成功了。

于 2019-08-03T22:23:01.773 回答