首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:版本错配。这是Automake 1.15.1但是定义..。来自Automake 1.14.1

错误:版本错配。这是Automake 1.15.1但是定义..。来自Automake 1.14.1
EN

Stack Overflow用户
提问于 2018-02-01 00:14:06
回答 2查看 11K关注 0票数 2

还有一个汽车工具问题..。我正在开发Fedora 27,我正在尝试构建力比丁libidn2。我需要configure; make; make install来实际工作。我需要它工作的机器只有Autoconf,Automake,Autopoint,Libtool和编译器工具。他们没有其他任何东西,比如<something>2html<something>2pdf,所以我无法构建文档。我也不能运行autoreconf 根据手册,因为它也坏了。

我不知道为什么这些工具会试图构建文档,因为我用--disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf禁用了它们。我已经尝试过使用HELP2MAN=trueMAKEINFO=true来解决这个问题,但是Autotools找到了另一种突破的方法:

代码语言:javascript
复制
gmake[2]: Entering directory '/home/Build-Scripts/libidn-1.33/doc'
echo '# This file is automatically generated.  DO NOT EDIT!          -*- makefile -*-' > Makefile.gdoc
echo >> Makefile.gdoc
echo 'gdoc_TEXINFOS =' >> Makefile.gdoc
echo 'gdoc_MANS =' >> Makefile.gdoc
echo >> Makefile.gdoc
for file in ../lib/idna.c ../lib/nfkc.c ../lib/pr29.c ../lib/punycode.c ../lib/stringprep.c ../lib/tld.c ../lib/toutf8.c ../lib/version.c ../lib/idn-free.c ../lib/strerror-idna.c ../lib/strerror-pr29.c ../lib/strerror-punycode.c ../lib/strerror-stringprep.c ../lib/strerror-tld.c; do \
  shortfile=`basename $file`; \
  echo "#" >> Makefile.gdoc; \
  echo "### $shortfile" >> Makefile.gdoc; \
  echo "#" >> Makefile.gdoc; \
  echo "gdoc_TEXINFOS += texi/$shortfile.texi" >> Makefile.gdoc; \
  echo "texi/$shortfile.texi: $file" >> Makefile.gdoc; \
  echo 'TABmkdir -p `dirname $@`' | sed "s/TAB/ /" >> Makefile.gdoc; \
  echo 'TAB$(PERL) ./gdoc -texinfo $(GDOC_TEXI_EXTRA_ARGS) $< > $@' | sed "s/TAB/       /" >> Makefile.gdoc; \
  echo >> Makefile.gdoc; \
  functions=`perl ./gdoc -listfunc $file`; \
  for function in $functions; do \
    echo "# $shortfile: $function" >> Makefile.gdoc; \
    echo "gdoc_TEXINFOS += texi/$function.texi" >> Makefile.gdoc; \
    echo "texi/$function.texi: $file" >> Makefile.gdoc; \
    echo 'TABmkdir -p `dirname $@`' | sed "s/TAB/       /" >> Makefile.gdoc; \
    echo 'TAB$(PERL) ./gdoc -texinfo $(GDOC_TEXI_EXTRA_ARGS) -function'" $function"' $< > $@' | sed "s/TAB/     /" >> Makefile.gdoc; \
    echo >> Makefile.gdoc; \
    echo "gdoc_MANS += man/$function.3" >> Makefile.gdoc; \
    echo "man/$function.3: $file" >> Makefile.gdoc; \
    echo 'TABmkdir -p `dirname $@`' | sed "s/TAB/       /" >> Makefile.gdoc; \
    echo 'TAB$(PERL) ./gdoc -man $(GDOC_MAN_EXTRA_ARGS) -function'" $function"' $< > $@' | sed "s/TAB/  /" >> Makefile.gdoc; \
    echo >> Makefile.gdoc; \
  done; \
  echo >> Makefile.gdoc; \
done
gmake Makefile
gmake[3]: Entering directory '/home/Build-Scripts/libidn-1.33/doc'
 cd .. && automake --gnu doc/Makefile
configure.ac:25: error: version mismatch.  This is Automake 1.15.1,
configure.ac:25: but the definition used by this AM_INIT_AUTOMAKE
configure.ac:25: comes from Automake 1.14.1.  You should recreate
configure.ac:25: aclocal.m4 with aclocal and run automake again.
gmake[3]: *** [Makefile:1494: Makefile.in] Error 63
gmake[3]: Leaving directory '/home/Build-Scripts/libidn-1.33/doc'
gmake[2]: *** [Makefile:2205: Makefile.gdoc] Error 2
gmake[2]: Leaving directory '/home/Build-Scripts/libidn-1.33/doc'
gmake[1]: *** [Makefile:1333: all-recursive] Error 1
gmake[1]: Leaving directory '/home/Build-Scripts/libidn-1.33'
gmake: *** [Makefile:1235: all] Error 2

我发现难以置信的很难相信Automake-1.14是必需的,而且Automake1.15不能使用。我不关心包的版本检查,所以我想尝试跳过它们下一步。

我该如何解决这个问题?

回到10,000英尺的高度,Autotools是否有任何具有用户界面经验的人为他们的一些决策提供输入?或者,由于我的Automake版本比配置的包更新,他们觉得有必要破坏我的版本的Autotools是什么?谁是做出这一明智决定的白痴?

以下是如何配置它:

代码语言:javascript
复制
    PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig" \
    CPPFLAGS="-I/usr/local/include -DNDEBUG" \
    CFLAGS= -m64 -march=native -fPIC" \
    CXXFLAGS= -m64 -march=native -fPIC" \
    LDFLAGS="-L/usr/local/lib64 -m64 -Wl,-R,/usr/local/lib64 -Wl,--enable-new-dtags" \
    LIBS="-ldl -lpthread" \
./configure --prefix="/usr/local" --libdir="/usr/local/lib64" \
    --enable-shared
    # --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf

下面是如何调用make

代码语言:javascript
复制
MAKE_FLAGS=("-j" "$MAKE_JOBS")
MAKE_FLAGS+=("ACLOCAL=aclocal")
MAKE_FLAGS+=("AUTOCONF=autoconf")
MAKE_FLAGS+=("AUTOHEADER=autoheader")
MAKE_FLAGS+=("AUTOMAKE=automake")
MAKE_FLAGS+=("PERL=perl")
MAKE_FLAGS+=("HELP2MAN=true")
MAKE_FLAGS+=("MAKEINFO=true")

if ! "$MAKE" "${MAKE_FLAGS[@]}"
then
    echo "Failed to build IDN"
    [[ "$0" = "${BASH_SOURCE[0]}" ]] && exit 1 || return 1
fi
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-02 02:15:52

我就是这样修好的。它适用于libidnlibidn2

首先,下载并解压缩libidn{2}。然后将cd放到适当的目录中。

其次,修复顶级configure.ac文件。这是被称为gdoc的东西引用的,尽管配置时没有文档:

代码语言:javascript
复制
# Fix AM_INIT_AUTOMAKE
sed -e 's/^AM_INIT_AUTOMAKE.*/AM_INIT_AUTOMAKE/g' configure.ac > configure.ac.fixed
mv configure.ac.fixed configure.ac
# Remove useless directive
sed -e '/AM_SILENT_RULES/d' configure.ac > configure.ac.fixed
mv configure.ac.fixed configure.ac
# Get rid of all docs Makefiles
sed -e '/^  doc\//d' configure.ac > configure.ac.fixed
mv configure.ac.fixed configure.ac
# Set time in the past to avoid re-configuration
touch -t 197001010000 configure.ac

第三,按要求执行configure libidn{2}

第四,修复单个Makefiles。此步骤在递归生成期间删除for/each调用中的for/each目录:

代码语言:javascript
复制
for mfile in $(find "$PWD" -name Makefile);
do
    # Get rid of all docs directories
    sed -e 's| doc | |g' "$mfile" > "$mfile.fixed"
    mv "$mfile.fixed" "$mfile"
done

第五,运行make

票数 0
EN

Stack Overflow用户

发布于 2018-02-01 15:52:54

这条信息:

这是Automake1.15.1,但是定义为…来自Automake 1.14.1

..。表示Automake正在运行,这并不是configure; make; make install的一个普通部分。正如我之前说过的,如果可能的话,您应该避免重建构建系统,而且这通常是可能的。Autotools主要用于包维护人员,而不是用于包构建器。原则上,构建者只使用维护人员通过Autotools创建的工件。

我正在研究Fedora 27,我正在尝试建立性欲和libidn2。我需要配置;制作;使安装实际工作。我需要它工作的机器只有Autoconf,Automake,Autopoint和Libtool。他们没有别的东西,所以我不能运行autoreconf,因为这也是坏的。

例如,我刚刚抓取了libidn的Fedora 27源RPM (v1.33),使用它在我的CentOS 7机器上解压缩源代码发行版的副本,更改为结果目录,并执行了一个成功的./configure; make (但没有尝试make install)。Autoconf和Automake安装在我的计算机上,但没有运行,正如我所期望的那样。

但是,如果自动工具实际上安装在构建机器上,以及它们的输入(configure.acMakefile.am等)看起来比它们的输出(configureMakefile.in等)更新,那么Autotools派生的构建系统可能确实会尝试重新构建这些输出(即重建自身)。如果生成机器上存在比最初用于准备生成系统的不同版本的Autotools,这可能需要一些帮助。

当这不只是起作用时--通常是因为Autotools版本错配--通常的方法是运行autoreconf --install --force。我不清楚您的autoreconf是如何或为什么被破坏的,以防止这种情况发生。在Fedora 27上,autoreconfautoconf一起打包,所以如果您有后者,那么您也应该使用前者。不过,autoreconf只是其他几个工具的方便包装器。你并不真的需要它。例如,您应该能够通过命令更新构建系统的与Automake相关的部分

代码语言:javascript
复制
automake -f -c

。您可能希望通过运行Autoconf来跟踪这一点:

代码语言:javascript
复制
autoconf -f

作为一种可能的选择,如果Autotools输入实际上还没有被修改,那么您可能只是有一个时间戳问题。在这种情况下,您可以尝试解决那里的问题,也许可以这样做:

代码语言:javascript
复制
find . -name configure -o name config.status -o name Makefile.in \
  | xargs touch

我发现难以置信的很难相信Automake-1.14是必需的,而且Automake-1.15.1不能使用。我不关心包的版本检查,所以我想尝试跳过它们下一步。

这很好,因为不需要版本的Automake作为任何受支持平台的包的正常构建的一部分。哪些平台是“受支持的”主要是构建系统的功能,而不是Autotools本身的功能,因此结果取决于构建该系统的人的技能和远见。而且您确实关心您所描述的特定包版本检查,因为忽略或抑制它会带来导致Automake和/或Autoconf输出不能正常工作的高风险。

在提供多平台支持方面,Autotools的帮助可能比您意识到的要大,但它们无法自动确保通用支持。替代方案(如CMake或Scon)也不能。

回到10,000英尺的高度,Autotools是否有任何具有用户界面经验的人为他们的一些决策提供输入?或者,由于我的Automake版本比配置的包更新,他们觉得有必要破坏我的版本的Autotools是什么?谁是做出这一明智决定的白痴?

我再次为你遇到困难感到抱歉。但是Autotools不能破坏您的生成,因为它们不包含在您的生成中。在包维护人员角色中操作的人使用Autotools来构建包的构建系统。如果生成的生成系统不能充分服务于您试图在其上构建包的机器和配置,那么这不是Autotools的错误。

由于您似乎要将大量基于Autotools的包移植到他们的构建系统不支持的环境中,是的,您已经接触到了专门为支持的环境构建包的人所没有的Autotools。我倾向于认为你在某种程度上获得了比必要的更多的曝光率,但这是另外一个问题。在任何情况下,您都是在包维护模式下操作,您需要从这个角度来看待情况。你不只是在建造包裹。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48553511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档