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

时间:2018-02-01 00:14:06

标签: autotools automake

另一个Autotools问题......我正在使用Fedora 27,我正在尝试构建libidnlibidn2。我需要configure; make; make install来实际工作。我需要它的机器只有Autoconf,Automake,Autopoint,Libtool和编译器工具。他们没有其他任何东西,例如<something>2html<something>2pdf,因此我无法构建文档。我也无法运行autoreconf per the manual,因为它也被破坏了。

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

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是必需的;和Automake-1.15不能使用。我不关心软件包版本检查,所以我想尝试跳过它们。

如何解决此问题?

回到10,000英尺,Autotools是否有任何具有用户界面经验的人为他们的一些决定提供输入?或者,Autotools如此破碎,他们认为需要打破我的构建,因为我的Automake版本比配置的软件包更新?做出那个出色决定的白痴是谁?

以下是它的配置方式:

    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的调用方式:

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

2 个答案:

答案 0 :(得分:6)

此消息:

  

这是Automake 1.15.1,但定义......来自Automake 1.14.1

...说Automake 正在运行,这不是configure; make; make install的普通部分。正如我之前所说的,如果可能的话,你应该更喜欢避免重建构建系统,而且通常它确实是可能的。 Autotools主要用于软件包维护者,而不是用于软件包构建器。原则上,构建器只使用维护者通过Autotools创建的工件。

  

我正在研究Fedora 27,我正在尝试构建libidn和libidn2。我需要配置;使; make install实际工作。我需要它的机器只有Autoconf,Automake,Autopoint和Libtool。他们没有其他任何东西,所以我无法运行autoreconf,因为它也被破坏了。

例如,我刚刚为libidn(v 1.33)抓取Fedora 27源RPM,用它在我的CentOS 7机器上解压缩源代码的副本,更改为生成的目录,并成功执行{{1 (但没有尝试./configure; make)。 Autoconf和Automake安装在我的机器上,但没有按照我的预期运行。

但是,如果Autotools实际上已安装在构建计算机上,并且其输入(make installconfigure.ac等)似乎比其输出更新(Makefile.amconfigure等,然后一个Autotools派生的构建系统可能确实尝试重建那些输出(重建自身)。如果构建机器上存在不同版本的Autotools,那么这可能需要一些帮助,而不是首先用于准备构建系统。

如果这不起作用 - 通常是因为Autotools版本不匹配 - 通常的办法就是运行Makefile.in。我不清楚你autoreconf --install --force是如何或为什么被打破以防止这种情况发生的。在Fedora 27上,autoreconfautoreconf打包在一起,所以如果你有后者,那么你也应该拥有前者。尽管如此,autoconf只是围绕其他几个工具的便利包装器。你真的不需要它。例如,您应该能够通过命令

更新构建系统的Automake相关部分
autoreconf

。您可以通过运行Autoconf来跟进:

automake -f -c

作为一种可能的替代方案,如果事实上Autotools输入没有被修改,那么也许你只是有一个时间戳问题。在这种情况下,您可以尝试解决问题,可能是这样的:

autoconf -f
  

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

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

Autotools可能比您提供的多平台支持更有帮助,但它们无法自动确保通用支持。也没有像CMake或Scons这样的替代品。

  

回到10,000英尺,Autotools是否有任何具有用户界面经验的人为他们的一些决定提供输入?或者,Autotools如此破碎,他们认为需要打破我的构建,因为我的Automake版本比配置的软件包更新?做出那个出色决定的白痴是谁?

我再次感到抱歉,你有困难。但是,Autotools无法破坏您的构建,因为它们在您的构建中不是涉及。 Autotools由一个以软件包维护者角色运行的人员来构建软件包的构建系统。如果生成的构建系统没有充分地为您尝试构建程序包的计算机和配置提供服务,那么这不是Autotools的错误。

因为您似乎将大量基于Autotools的软件包移植到他们的构建系统不支持的环境中,是的,您接触到Autotools,那些刚刚为受支持的环境构建软件包的人没有。我倾向于认为你以某种方式得到了更多的曝光而不是必要,但这是一个单独的问题。无论如何,您正在以包维护模式运行,您需要从这个角度来看待这种情况。你只是构建软件包。

答案 1 :(得分:0)

以下是我修复它的方法。它适用于libidnlibidn2

首先,下载并解压缩libidn{2}。然后cd进入相应的目录。

其次,修复顶级configure.ac文件。这被称为gdoc的东西引用,即使事情是在没有文档的情况下配置的:

# 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}根据需要。

第四,修复个人Makefile。此步骤在递归make:

期间删除doc/次调用中的for/each目录
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