FreeBSD 12.0-RELEASE は /etc/passwd と /etc/group に ntpd ユーザが必要なので installworld DESTDIR= は失敗する2018年12月13日 13時30分31秒

昨日公開された FreeBSD 12.0-RELEASE だが、コードからの更新は注意が必要。

要約すると installworld が /etc/passwd と /etc/group に ntpd を使ってディレクトリやファイルを作成するので installworld DESTDIR= は失敗する。

DESTDIR 無しの、installworld だと、mergemaster -p を行って ntpd ユーザを追加するように促される。その後の installworld は問題なく処理される。このバグ自体は今までずっとあったバグの様で、FreeBSD 12.0-RELEASE だから失敗するわけではない。

修正方法としては、DESTDIR/etc を見るようにすれば、いい。以下のものが修正の一案。

--- Makefile.inc1
+++ Makefile.inc1
@@ -837,7 +837,7 @@ 
 DB_FROM_SRC=	yes
 .endif
 
-.if defined(DB_FROM_SRC)
+.if defined(DB_FROM_SRC) || defined(DESTDIR)
 INSTALLFLAGS+=	-N ${.CURDIR}/etc
 MTREEFLAGS+=	-N ${.CURDIR}/etc
 .endif
@@ -853,7 +853,7 @@ 
 .if defined(BUILD_PKGS)
 INSTALLFLAGS+=	-h sha256
 .endif
-.if defined(DB_FROM_SRC) || defined(NO_ROOT)
+.if defined(DB_FROM_SRC) || defined(NO_ROOT) || defined(DESTDIR)
 IMAKE_INSTALL=	INSTALL="install ${INSTALLFLAGS}"
 IMAKE_MTREE=	MTREE_CMD="mtree ${MTREEFLAGS}"
 .endif
@@ -1187,13 +1187,13 @@ 
 _installcheck_world: __installcheck_UGID
 __installcheck_UGID: .PHONY
 .for uid in ${CHECK_UIDS}
-	@if ! `id -u ${uid} >/dev/null 2>&1`; then \
+	@if ! `grep "^${uid}:" ${DESTDIR}/etc/passwd > /dev/null 2>&1`; then \
 		echo "ERROR: Required ${uid} user is missing, see /usr/src/UPDATING."; \
 		false; \
 	fi
 .endfor
 .for gid in ${CHECK_GIDS}
-	@if ! `find / -prune -group ${gid} >/dev/null 2>&1`; then \
+	@if ! `grep "^${gid}:" ${DESTDIR}/etc/group > /dev/null 2>&1`; then \
 		echo "ERROR: Required ${gid} group is missing, see /usr/src/UPDATING."; \
 		false; \
 	fi