fetchindex でバージョンを指定2007年07月06日 10時27分44秒

最近の ports システムは INDEX ファイルに依存するようになっている。そして、portupgrade を使うと、必須になる。もし、このファイルが最新でないと、これを更新するのに時間を使うようになる。

そこで、fetchindex のターゲットがあり、cvsup/csup なり portsnap なりで、ソースを最新の状態にしたら、INDEX ファイルもダウンロードすることにより、自分で作り直す手間を省くことが出来る。特に、最新の機材でない場合は、ありがたい。

しかし、6-STABLE と 7-CURRENT 等と、複数のシステムを使っていると、問題が生じる。6-STABLE で make fetchindex をやると、INDEX-6 しか更新しない。そのため、時間が経ってから 7-CURRENT を起動し、同じ ports を使っていると INDEX-7 が最新では無くなる。そして、fetchindex で取ってくると他の更新まで含むことになる。

fetchindex は Mk の中ではなく、Makefile に直接記載されていた。


% vi /usr/ports/Makefile

fetchindex: ${INDEXDIR}/${INDEXFILE}.bz2
        @bunzip2 < ${INDEXDIR}/${INDEXFILE}.bz2 > ${INDEXDIR}/${INDEXFILE} && \
        chmod a+r ${INDEXDIR}/${INDEXFILE}

${INDEXDIR}/${INDEXFILE}.bz2: .PHONY
        @${FETCHINDEX} ${INDEXDIR}/${INDEXFILE}.bz2 ${MASTER_SITE_INDEX}${INDEXFILE}.bz2

次は、INDEXFILE の設定のされ方。

% grep INDEXFILE *
bsd.port.mk:INDEXFILE?=         INDEX-${OSVERSION:C/([0-9]).*/\1/}


% vi Mk/bsd.ports.mk

# Get __FreeBSD_version
.if !defined(OSVERSION)
.if exists(${DESTDIR}/usr/include/sys/param.h)
OSVERSION!=     ${AWK} '/^\#define __FreeBSD_version/ {print $$3}' < ${DESTDIR}/
usr/include/sys/param.h
.elif exists(${DESTDIR}/usr/src/sys/sys/param.h)
OSVERSION!=     ${AWK} '/^\#define __FreeBSD_version/ {print $$3}' < ${DESTDIR}/
usr/src/sys/sys/param.h
.else
OSVERSION!=     ${SYSCTL} -n kern.osreldate
.endif
.endif

OSVERSION が設定されていなかったら、色々なところから値を取ってこようとする。OSVERSION を自ら指定すれば、使っているシステムのバージョンに関係ないことになる。

% make -n fetchindex OSVERSION=602000
/usr/bin/env  fetch -am -o /usr/ports/INDEX-6.bz2 http://www.FreeBSD.org/ports/INDEX-6.bz2
bunzip2 < /usr/ports/INDEX-6.bz2 > /usr/ports/INDEX-6 &&  chmod a+r /usr/ports/INDEX-6
% make -n fetchindex OSVERSION=702000
/usr/bin/env  fetch -am -o /usr/ports/INDEX-7.bz2 http://www.FreeBSD.org/ports/INDEX-7.bz2
bunzip2 < /usr/ports/INDEX-7.bz2 > /usr/ports/INDEX-7 &&  chmod a+r /usr/ports/INDEX-7

ports ファイルを共有しているのであれば、fetchindex で OSVERSION を指定すれば、必要な INDEX ファイルを取ってこられる。さらに PORTSDIR を指定すると、/usr/ports 以外の場所に INDEX ファイルを展開できる。