autotools生成的tarball的用户收到错误消息:aclocal-1.13:找不到命令

Joa*_*m W 17 automake autoconf makefile m4 autoreconf

我正在使用autoconf版本2.69生成的安装脚本分发tarball.适用于许多不同的机器.现在,在新的Arch Linux系统上工作的用户报告configure正确执行,但会make立即终止,并显示以下错误消息:

/home/user/project/build-aux/missing: line 81: aclocal-1.13: command not found
WARNING: 'aclocal-1.13' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [aclocal.m4] Error 127
Run Code Online (Sandbox Code Playgroud)

acinclude.m4项目目录中没有.用户确保他没有修改aclocal.m4,configure.ac文件m4/或项目中的任何其他内容.

错误信息对我来说没有意义:据我所知,aclocal我跑的时候会被执行autoreconf -if; 它生成一个文件aclocal.m4,它是我分发的tarball的一部分; 用户的make命令没有理由要求aclocal.

用户进一步报告他可以通过跑步为自己解决问题aclocal.但是,这不是一个干净的解决方案:包装商不应该要求他们的用户安装自动工具,对吧?

为了完整起见,我附上了全文configure.ac:有什么不对吗?

################################################################################
##  FRIDA: fast reliable interactive data analysis                            ##
##  configure.ac: used by 'autoreconf -i' to prepare for 'configure'          ##
##  (C) Joachim Wuttke, Sebastian Busch 2008-                                 ##
##  http://apps.jcns.fz-juelich.de/frida                                      ##
################################################################################

################################################################################
##  Generic initialization                                                    ##
################################################################################

AC_INIT([frida],[post-2.1.8c],[j.wuttke@fz-juelich.de])
#                ^^^^^ delete "post-" for public releases
# project name must be "frida"; this determines the installation directories

AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])

AM_INIT_AUTOMAKE([foreign]) # don't insert GNU blala files

################################################################################
##  Select compiler and preprocessors                                         ##
################################################################################

AC_PROG_CXX
AC_LANG(C++)
AX_CXX_COMPILE_STDCXX_11 # provided in directory m4
AC_SUBST(AM_CXXFLAGS,"-g -pedantic -Wall -Wno-sign-compare -Wno-unused-result -Werror")
# for valgrind --leak-check=full frida, use -O0 -fno-inline

# source files that use -D settings must #include "../config.h"
AC_CONFIG_HEADERS([config.h]) # also needed to prevent endless -D option lists

AC_PROG_LEX   # LEX,LEXLIB = "flex","-lfl" or "lex","-ll"
if test "$LEX" = :; then
  AC_MSG_ERROR([Cannot find lex. Aborting.])
fi
AC_PROG_YACC  # YACC = "bison -y" or "byacc" or "yacc"
if test "$YACC" = "yacc"; then
  AC_MSG_ERROR([Cannot find yacc. Aborting.])
fi

## I put this one here only because qmake does: Make sure off_t is 64-bit in *nix, taken from http://www.google.com/search?q=cache:wlNJ8Qe4dBgJ:www.sfr-fresh.com/unix/privat/libfb-v0.18.4b-src.zip:a/src/rtlib/configure.ac+configure.ac+file+offset+bits&hl=de&ct=clnk&cd=5&gl=de&client=firefox-a
AC_DEFINE([_FILE_OFFSET_BITS],64,[File offset bits])

################################################################################
##  Check for headers, defs needed at compile time                            ##
################################################################################

# Consistency check: is source code present?
AC_CONFIG_SRCDIR([src/frida2.cpp])
AC_CONFIG_SRCDIR([man/frida.pod])

# Checks for typedefs, structures, and compiler characteristics
AC_C_CONST
AC_C_INLINE
AC_TYPE_SIZE_T
AC_STRUCT_TM
AC_HEADER_STDBOOL
AC_HEADER_STDC

# Checks for standard includes
AC_FUNC_ALLOCA
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_FUNC_MKTIME
AC_FUNC_STRFTIME

AC_CHECK_FUNCS([gettimeofday],,AC_MSG_ERROR([Cannot find gettimeofday.]))
AC_CHECK_FUNCS([memset],      ,AC_MSG_ERROR([Cannot find memset.]))
AC_CHECK_FUNCS([mkfifo],      ,AC_MSG_ERROR([Cannot find mkfifo.]))
AC_CHECK_FUNCS([strchr],      ,AC_MSG_ERROR([Cannot find strchr.]))

AC_CHECK_HEADERS([fcntl.h],        ,AC_MSG_ERROR([Cannot find fcntl.h.]))
AC_CHECK_HEADERS([math.h],         ,AC_MSG_ERROR([Cannot find math.h.]))

# The following headers are needed for code produced by lexx and yacc
AC_CHECK_HEADERS([inttypes.h],     ,AC_MSG_ERROR([Cannot find inttypes.h.]))
AC_CHECK_HEADERS([libintl.h],      ,AC_MSG_ERROR([Cannot find libintl.h.]))
AC_CHECK_HEADERS([malloc.h],       ,AC_MSG_ERROR([Cannot find malloc.h.]))
AC_CHECK_HEADERS([unistd.h],       ,AC_MSG_ERROR([Cannot find unistd.h.]))
AC_CHECK_HEADERS([stddef.h],       ,AC_MSG_ERROR([Cannot find stddef.h.]))

# Non-standard includes
AC_CHECK_HEADERS([gsl/gsl_rng.h gsl/gsl_randist.h gsl/gsl_math.h \
                  gsl/gsl_errno.h gsl/gsl_integration.h gsl/gsl_roots.h \
                  gsl/gsl_sf.h gsl/gsl_sf_debye.h],,
                 AC_MSG_ERROR([Cannot find required gsl headers.]))

# C includes of our own
AC_CHECK_HEADERS([kww.h],,  AC_MSG_ERROR([Cannot find kww.h.]))
AC_CHECK_HEADERS([cerf.h],, AC_MSG_ERROR([Cannot find cerf.h.]))

# C++ includes of our own
AC_TRY_CPP([#include<boost/format.hpp>],,
    AC_MSG_ERROR([Cannot find boost/format.hpp.]))
AC_TRY_CPP([#include<boost/shared_ptr.hpp>],,
    AC_MSG_ERROR([Cannot find boost/shared_ptr.hpp.]))

AC_TRY_CPP([#include<trivia/file_ops.hpp>],,
    AC_MSG_ERROR([Cannot find trivia/file_ops.hpp.]))
AC_TRY_CPP([#include<readplus/readln.hpp>],,
    AC_MSG_ERROR([Cannot find readplus/readln.hpp.]))
AC_TRY_CPP([#include<yamlfreeze/yaml.hpp>],,
        AC_MSG_ERROR([Cannot find yamlfreeze/yaml.hpp.]))

################################################################################
##  Check for libraries, needed at link time                                  ##
################################################################################

# From standard packages
AC_SEARCH_LIBS([cos], [m],, [AC_MSG_ERROR(libm not found or corrupted)])
AC_SEARCH_LIBS([cblas_dgemm], [gslcblas],,
             [AC_MSG_ERROR(libgslcblas not found or out of sync)])
AC_SEARCH_LIBS([gsl_blas_dgemm], [gsl],,
            [AC_MSG_ERROR(libgsl not found or out of sync)])
AC_SEARCH_LIBS([fftw_plan_r2r_1d], [fftw3],,
              [AC_MSG_ERROR(libfftw not found or out of sync)])
AC_SEARCH_LIBS([rl_completion_matches], [readline],,
             [AC_MSG_ERROR(libreadline not found or corrupted)])

# From our own C packages
AC_CHECK_LIB([lmfit], [lmmin], ,
              [AC_MSG_ERROR(liblmfit not found or out of sync)])
AC_CHECK_LIB([kww], [kwwp], ,
            [AC_MSG_ERROR(libkww not found or out of sync)])
AC_CHECK_LIB([cerf], [voigt], ,
            [AC_MSG_ERROR(libcerf not found or out of sync)])

# From our own C++ packages (why checking for main? how else?)
AC_CHECK_LIB([trivia], [main], ,
                       [AC_MSG_ERROR(libtrivia not found or out of sync)])
AC_CHECK_LIB([readplus], [main],,
                 [AC_MSG_ERROR(library readplus not found)])
AC_CHECK_LIB([yamlfreeze], [main],,
                 [AC_MSG_ERROR(library yamlfreeze not found)])

################################################################################
##  Check for facilities needed at run time                                   ##
################################################################################

AC_CHECK_PROGS([GNUPLOT], [gnuplot], [:])
if test "$GNUPLOT" = :; then
  AC_MSG_ERROR([Cannot find gnuplot. Aborting.])
fi

################################################################################
##  make Makefiles                                                            ##
################################################################################

AC_CONFIG_FILES([Makefile src/Makefile man/Makefile share/Makefile])
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)

问题可能是由于存在不属于tarball的文件?这里是tgz存档的内容,除了源文件本身:

frida2.1.8c/aclocal.m4
frida2.1.8c/build-aux/
frida2.1.8c/build-aux/depcomp
frida2.1.8c/build-aux/ylwrap
frida2.1.8c/build-aux/ltmain.sh
frida2.1.8c/build-aux/missing
frida2.1.8c/build-aux/install-sh
frida2.1.8c/build-aux/config.guess
frida2.1.8c/build-aux/config.sub
frida2.1.8c/CHANGELOG
frida2.1.8c/config.h.in
frida2.1.8c/configure
frida2.1.8c/configure.ac
frida2.1.8c/COPYING
frida2.1.8c/INSTALL
frida2.1.8c/m4/
frida2.1.8c/m4/libtool.m4
frida2.1.8c/m4/m4_ax_boost_regex.m4
frida2.1.8c/m4/ltversion.m4
frida2.1.8c/m4/ltoptions.m4
frida2.1.8c/m4/lt~obsolete.m4
frida2.1.8c/m4/m4_ax_boost_base.m4
frida2.1.8c/m4/ax_cxx_compile_stdcxx_11.m4
frida2.1.8c/m4/ltsugar.m4
frida2.1.8c/Makefile.am
frida2.1.8c/Makefile.in
frida2.1.8c/man/
...
frida2.1.8c/share/
...
frida2.1.8c/src/
...
frida2.1.8c/test/
...
Run Code Online (Sandbox Code Playgroud)

Owl*_*Owl 25

好的,所以我也遇到了这个问题,这让我疯了.问题似乎是我正在进行源代码的svn导出以使我的src tarball.

现在这很好,但如果我错了,请纠正我,但我认为svn只提交已修改但未触及的文件.这意味着当您使用svn导出检出文件时,文件可能按时间顺序排列错误,即使文件如下:

configure.ac aclocal.m4配置Makefile.am Makefile.in

最近都被感动了,svn的日期标记不会更新; 因此,当您发布源包时,日期顺序错误,配置阶段将失败(不太明显).

执行svn导出后,请记住在使用以下命令将src捆绑到tar.gz之前始终触摸这些文件:

svn export <repo address>
cd <repo name>    
touch configure.ac aclocal.m4 configure Makefile.am Makefile.in
Run Code Online (Sandbox Code Playgroud)

否则,用户将被迫自己触摸文件:

touch configure.ac aclocal.m4 configure Makefile.am Makefile.in
./configure
make
Run Code Online (Sandbox Code Playgroud)

或运行:

autoreconf
./configure
automake
make
Run Code Online (Sandbox Code Playgroud)

这将修饰这些文件,而不仅仅是:

./configure
make
Run Code Online (Sandbox Code Playgroud)

这对最终用户来说更容易.


Joa*_*m W 13

make -d给出了一个线索:

 Considering target file `aclocal.m4'.
   Pruning file `m4/ax_cxx_compile_stdcxx_11.m4'.
   Pruning file `configure.ac'.
  Finished prerequisites of target file `aclocal.m4'.
  Prerequisite `m4/ax_cxx_compile_stdcxx_11.m4' is older than target `aclocal.m4'.
  Prerequisite `configure.ac' is newer than target `aclocal.m4'.
 Must remake target `aclocal.m4'.
Run Code Online (Sandbox Code Playgroud)

不知何故,时间戳混淆了,这激活了"重建规则".由于这种情况一次又一次地发生,我终于选择了

 AM_MAINTAINER_MODE([disable])
Run Code Online (Sandbox Code Playgroud)

configure.ac.我读到这个宏的作者确信这是一个坏主意,但对我来说似乎工作得很好.明确分离任务:维护者必须在autoreconf任何时候configure.ac或者Makefile.am已经改变时运行.最终用户既不需要也不应该被诱导再生configure.

  • `configure.ac`比`aclocal.m4`更新?在你拥有的tarball中,它绝对是_older_.你_should_正在分发`configure.ac`,BTW. (2认同)

Cas*_*ray 10

运行 autoreconf -vfi 在配置文件所在的目录(在我的情况:/source/evtest/evtest-1.31/)工作了我丢失的aclocal会1.13由于太新版本(aclocal会-1.14).