我正在尝试从 git 源构建 rsync 1.7.0。
$ autoreconf
$ ./configure
:
config.status: error: cannot find input file: `config.h.in'
如果我config.h.in
从 rsync-1.7.0.tar.gz 复制,则./configure
完成。但make
失败了:
$ make
gcc -I. -I. -g -O2 -c rsync.c -o rsync.o
In file included from rsync.c:20:
rsync.h:274:10: fatal error: proto.h: No such file or directory
274 | #include "proto.h"
| ^~~~~~~~~
compilation terminated.
make: *** [Makefile:29: rsync.o] Error 1
如果我proto.h
从 rsync-1.7.0.tar.gz 复制,它就可以工作。
如何创建tar 文件中缺少的proto.h
内容?config.h.in
答案1
这configure.in
rsync
1.7.0(一个古老版本)的文件rsync
是 23-25 年前为一些autoconf
我无法确定的旧版本编写的。如果您尝试使用更新版本的 GNU 自动工具,您将在创建configure
和config.h
正确安装时遇到问题。
要使用更现代的 GNU 自动工具正确构建configure
脚本和config.h
标头,您需要configure.in
手动修补文件。幸运的是,这非常简单,我将在下面提供一个简短的差异,准确显示需要做什么:
diff --git a/configure.in b/configure.in
index 2d48d001..3905ec5f 100644
--- a/configure.in
+++ b/configure.in
@@ -8,7 +8,7 @@ AC_PROG_INSTALL
AC_SUBST(SHELL)
AC_CHECK_PROG(HAVE_REMSH, remsh, 1, 0)
-AC_DEFINE_UNQUOTED(HAVE_REMSH, $HAVE_REMSH)
+AC_DEFINE_UNQUOTED(HAVE_REMSH, $HAVE_REMSH,[dummy])
AC_HEADER_DIRENT
AC_HEADER_TIME
@@ -34,7 +34,7 @@ AC_CHECK_TYPE(ino_t,unsigned)
echo $ac_n "checking for errno in errno.h... $ac_c"
AC_TRY_COMPILE([#include <errno.h>],[int i = errno],
-echo yes; AC_DEFINE(HAVE_ERRNO_DECL),
+echo yes; AC_DEFINE(HAVE_ERRNO_DECL,[1],[dummy]),
echo no)
AC_FUNC_MEMCMP
@@ -49,20 +49,20 @@ AC_CHECK_FUNCS(memmove getopt_long lchown setlinebuf)
echo $ac_n "checking for working fnmatch... $ac_c"
AC_TRY_RUN([#include <fnmatch.h>
main() { exit(fnmatch("*.o", "x.o", 0) == 0? 0: 1); }],
-echo yes;AC_DEFINE(HAVE_FNMATCH),
+echo yes;AC_DEFINE(HAVE_FNMATCH,[1],[dummy]),
echo no)
echo $ac_n "checking for long long... $ac_c"
AC_TRY_RUN([#include <stdio.h>
main() { long long x = 1000000000000; char b[20]; sprintf(b,"%lld", x); exit(strcmp("1000000000000", b) == 0? 0: 1); }],
-echo yes;AC_DEFINE(HAVE_LONGLONG),
+echo yes;AC_DEFINE(HAVE_LONGLONG,[1],[dummy]),
echo no)
echo $ac_n "checking for utimbuf ... $ac_c"
AC_TRY_COMPILE([#include <sys/types.h>
#include <utime.h>],
[struct utimbuf tbuf; tbuf.actime = 0; tbuf.modtime = 1; return utime("foo.c",&tbuf);],
-echo yes;AC_DEFINE(HAVE_UTIMBUF),
+echo yes;AC_DEFINE(HAVE_UTIMBUF,[1],[dummy]),
echo no)
AC_OUTPUT(Makefile lib/dummy)
简而言之,该configure.in
文件使用了AC_DEFINE
和 以及AC_DEFINE_UNQUOTED
错误数量的参数。添加虚拟参数可以修复此文件,并且autoconf
2.69(和automake
1.16)将能够在运行时为您生成正确的configure
脚本和头文件(如问题中所示)。这显然是config.h
autoreconf
2001年修复。
标proto.h
头是通过运行生成的make proto
。
然后,该代码使用 Clang 10.0.1 编译器在我的 OpenBSD 6.8 系统上进行编译。
$ ./rsync --version
rsync version 1.7.0 protocol version 17
rsync
请注意,实际上不建议使用这个古老版本,因为它可能包含在后续版本中修复的许多错误和安全问题。