猿丸です。

この場合は、OpenSSH 側の定義は、OS側で定義されてないときのデフォルト
という役割だと思うので、どちらを尊重すべきかというと、OS側なんじゃない
かと思います。
で、FreeBSD の fsblkcnt_t は __uint64_t っぽいので、unsigned long だと
まずそうです。FreeBSD/amd64 なら long は 64bit なので、大丈夫ですけど。


それはさておき、ビルドが通ったり通らなかったりするのはおかしいと思うの
ですが、
|#ifndef HAVE_FSBLKCNT_T
|typedef unsigned long fsblkcnt_t;
|#endif
の部分は、crypto/openssh/includes.h 経由で crypto/openssh/config.h を読んでいれば、
|/* Define to 1 if the system has the type `fsblkcnt_t'. */
|#define HAVE_FSBLKCNT_T 1
という部分が評価されることにより通らなくなるはずなので、このファイルが
オリジナルのままであることと、もしオリジナルのままであれば、どのconfig.h
がコンパイル時に使われているのかを確認したらいいんじゃないかと思います。
# cd /usr/src/secure/libexec/ssh-keysign
# make clean
# ktrace -t n -i make
# kdump | grep config.h
とか、たぶんそんな感じで。コマンドラインオプションで crypto/openssh が
最初に読まれるようになっているようなので、読んでる config.h は正しそう
ですが…。

__bounded__ が warning になってるのも crypto/openssh/includes.h 経由で
crypto/openssh/defines.h を読んでいれば出ないはずなので、なんかその辺
変そうです。もうやってるかもしれませんが、/usr/src 以下を一度きれいに
削除してソースを取得しなおした方がいいかもしれないです。

6.4 で7.1がビルドできることを試したわけじゃないですが、時期からいって、
できなかったら問題になってるはずなので、たぶんできるはずです。


Toshio Uchiyama さんは書きました:
> ルーターに使用している 6.4
> 上で7.1 をmake buildworld すると下に引用するような
> エラーで途中でこけます。types.h と bsd-statvfs.h で
> 二重に fsbkcnt_t を定義してるからいけないということ
> で、最初は bsd-statvfs.h の該当部分をコメントアウト
> 
> //#ifndef HAVE_FSBLKCNT_T
> //typedef unsigned long fsblkcnt_t;
> //#endif
> //#ifndef HAVE_FSFILCNT_T
> //typedef unsigned long fsfilcnt_t;
> //#endif
> 
> して、buildworld を通しました。
> 本当だったらソースを読んで解析して正しい方法を考えるか、
> なぜ、ここでこけるのか考えるのが正しいのかと思いますが、
> 実力と時間がないため次のような方法で buildworld を
> 通しました。
> わざわざ、types.h でなく特殊なインクルードファイルを
> インクルードしてるのだから
> そっちの定義を尊重した方が良いだろうということで、
> 
> /usr/src/secure/libexec/ssh-keysig
> 
> の
> 
> Makefile
> 
> のCFLAGSを
> 
> CFLAGS+=-I${SSHDIR} -include ssh_namespace.h -D_FSBLKCNT_T_DECLARED
> 
> のように変更して buildworld を通しました。
> しかし、これでよいのか心配なので、メールした次第です。

メールによる返信