autoconf:如何替换库前缀?

时间:2018-01-16 14:47:15

标签: makefile autotools autoconf gnulib

CLISPinterfacePARI配置了configure.in AC_LIB_LINKFLAGS([pari])来自lib-link.m4

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

prefix = @LIBPARI_PREFIX@
DATADIR = @datadir@

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

这似乎适用于PARI /usr/local {和LIBPARI_PREFIX=/usr/local PARI安装了/usr的Mac OS X,但{U}没有安装LIBPARI_PREFIX }位于PARIdatadir 为空

如何将Makefile的{​​{1}}的位置插入LIBPARI_PREFIX

PS。我也在homebrew上问了这个问题。

PPS。回应@ BrunoHaible的建议,这是在Linux上进行调试的微薄尝试(其中$ bash -x configure 2>&1 | grep found_dir + found_dir= + eval ac_val=$found_dir + eval ac_val=$found_dir 为空)。

List

2 个答案:

答案 0 :(得分:2)

您正试图以无意的方式使用$(prefix)。在基于Autotools的构建系统中,$(prefix)表示您正在构建的软件的目标安装位置的前缀。通过在Makefile.in中进行设置,您将覆盖configure尝试分配的前缀。但是,由于你似乎没有任何安装目标,至少在那个级别,这可能更多的是形式不好而不是故障的原因。

  

如何将PARI数据库的位置插入Makefile?

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

DATADIR=...

,你可以通过AC_SUBST宏创建一个输出变量:

AC_SUBST([DATADIR])

由于您只使用Autoconf,而不是Automake,因此您可以通过更改 Makefile.in 中的作业来手动将其收到Makefile:

DATDIR = @DATADIR@

现在,至于首先查找数据目录,您必须知道在尝试实现之前要实现的目标。从你的问题和后续评论中,我觉得你想要这个:

  1. 使用用户明确指定的数据目录(如果有)。否则,

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

  3. (可选)查看指定给prefix的{​​{1}},或特别是指定的datadir(两者都可能来自顶级configure)。最后,如果还没有找到,那么

  4. 查看一些标准位置。

  5. 要创建configure选项,用户可以通过该选项指定自定义数据目录,您可能会使用configure宏,可能是这样的:

    AC_ARG_WITH

    感谢@BrunoHaible,我们看到虽然Gnulib手册没有记录它,但宏的内部文档指定如果AC_ARG_WITH([pari-datadir], [AS_HELP_STRING([--with-pari-datadir], [explicitly specifies the PARI data directory])], [], [with_pari_datadir='']) 找到libpari,那么它会将AC_LIB_LINKFLAGS设置为库目录前缀。您发现当使用LIBPARI_PREFIX选项为其提供另一个搜索位置时,这确实有效,因此我建议您使用它。您当然可以尝试调试--with-libpari以使其在找到lib的所有情况下都设置为AC_LIB_LINKFLAGS,但如果您不想这样做,那么您可以解决它(请参阅下文)。

    虽然默认或指定的安装前缀可以LIBPARI_PREFIX作为configure访问,但我建议您转到指定的$prefix。然而,这有点棘手,因为默认情况下它间接引用前缀。因此,您可以这样做:

    $datadir

    最后,您可以硬编码一组前缀,例如eval "datadir_expanded=${datadir}" /usr

    继上述所有内容之后,您的/usr/local可能会执行以下操作:

    configure.in

答案 1 :(得分:0)

为什么不猜测datadir的位置,为什么不问PARI / GP datadir的位置呢?即

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

起到了作用。