Git 소스에서 rsync 빌드

Git 소스에서 rsync 빌드

Git 소스에서 rsync 1.7.0을 빌드하려고 합니다.

$ autoreconf
$ ./configure
:
config.status: error: cannot find input file: `config.h.in'

config.h.inrsync-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

rsync-1.7.0.tar.gz에서 복사 하면 proto.h작동합니다.

tar 파일에서 누락된 콘텐츠를 어떻게 만들 수 있나요 proto.h?config.h.in

답변1

이것configure.inrsync1.7.0(고대 버전)에 대한 문서는 제가 확인할 수 없는 rsync일부 이전 버전에 대해 23~25년 전에 작성되었습니다 . 최신 버전의 GNU AutoTools를 사용하려고 하면 이를 올바르게 생성 하고 설치하는 데 autoconf문제가 발생합니다 .configureconfig.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사용합니다 . 더미 인수를 추가하면 이 파일이 수정되며 2.69(및 1.16)는 런타임에 올바른 스크립트와 헤더를 생성할 수 있습니다 (질문에 표시된 대로). 이것은 분명히AC_DEFINEAC_DEFINE_UNQUOTEDautoconfautomakeconfigureconfig.hautoreconf2001년에 복원됨.

헤더는 를 proto.h실행하여 생성됩니다 make proto.

그런 다음 Clang 10.0.1 컴파일러를 사용하여 OpenBSD 6.8 시스템에서 코드를 컴파일했습니다.

$ ./rsync --version
rsync version 1.7.0  protocol version 17

rsync이 고대 버전을 사용하는 것은 후속 버전에서 수정될 많은 버그와 보안 문제를 포함할 수 있으므로 실제로 더 이상 사용되지 않습니다.

관련 정보