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.hconfig.h.in

答え1

これconfigure.inrsync1.7.0(古代バージョン)の文書は、私が確認できなかった以前のバージョンのrsync23〜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この古代バージョンの使用には、将来のバージョンで修正される多くのバグやセキュリティの問題が含まれる可能性があるため、実際には使用されなくなります。

関連情報