The Man Who Fell From The Wrong Side Of The Sky:2013年11月24日分

[最新版] [一覧] [前月] [今月] [翌月]

2013/11/24(Sun)

[386BSD(の子孫)ソースコードシリーズ (334)][な阪関無] sys/cdefs.hとは何ですか? (その10)

@ バージョン管理いまむかし

突然ですが、ちょっと寄り道してソースコードのバージョン管理について。

このチラシの裏ネタをリアルタイマーではない *1ワイが書けるのも、NetBSD をはじめとしてプロジェクトの開始時よりソースコードをバージョン管理してくれてるからです。

ソフトウェアの世界でソースの履歴管理には SCM(Source Code Management) というツールを使用しますが、リポジトリをどこに置くかで大別して

の2種類に分類できます、それぞれメリット・デメリットがあるのでご自分のプロジェクトに合わせてお好きなものをどうぞ。

@ 中央集権型

いまどきの中央集権型は Subversionの一強ですが、過去には

とかいろいろなものが使われていました。

ヤバイなこれ、並べたらゲシュタルト崩壊してきた。これ平仮名だったら

じゃねーか、ラテン語圏狂ってるな。

@ 分散型

分散型は21世紀入った後くらいからオープンソースな実装が雨後の筍の如くでしたが、今や

の二強であらかた趨勢は決まりましたな、ドベカスこと

あたりはもう永遠に知らんでいいと思います、Subversion と互換性のある SVK には期待してたんだけどね(ゲッソリ)。

なお、BCリーグには Fossil以下どんだけお前ら車輪再発明するのかと。

@ *BSDにおけるソースコード管理

NetBSD や OpenBSD では前述の CVS がバージョン管理ツールとして使われています。

ソースコードの先頭には「$NetBSD$」あるいは「$OpenBSD$」ではじまるメタデータが埋め込まれています。

/*	$NetBSD: init_main.c,v 1.453 2013/08/28 12:50:18 riastradh Exp $	*/

これは別に手書きでやってるわけではなく、CVSの キーワード置換という機能で実現しています。

/*	$NetBSD$	*/

とキーワード(前後を$でクオート)をソース中埋め込んでおくと、CVSからソースを取り出す(checkout)時にリポジトリの情報を元に自動的にメタデータに置換されるわけです。

このように埋め込まれたメタデータはふつー「RCSID」と呼ばれます。なぜ CVS なのに "RCS"ID というかちゅーとそもそも CVS は元々 RCS の上位互換として作られらから。

このキーワード置換機能も RCS 時代から存在してるのですよな、 マニュアル

$ man co

で表示されます、さあ大きな声で復唱しましょう、まんこ *2

 KEYWORD SUBSTITUTION
       Strings of the form $keyword$ and $keyword:...$ embedded in the text
       are replaced with strings of the form $keyword:value$ where keyword and
       value are pairs listed below.  Keywords can be embedded in literal
       strings or comments to identify a revision.
...

へいへーい、CVS と同じキーワード置換がサポートされてますな。

ちなみに元の仕様には $NetBSD$ というキーワードはありません。同等のキーワードは「$Id$」になるのですが、*BSD ではソースコードの貸し借りとかforkによる派生が多いので

/*	$OpenBSD: cdefs.h,v 1.34 2012/08/14 20:11:37 matthew Exp $	*/
/*	$NetBSD: cdefs.h,v 1.16 1996/04/03 20:46:39 christos Exp $	*/

のように異なるリポジトリにおけるメタデータを保持したいケースがあるので、リポジトリの設定ファイルである CVSROOT/config に

tag=NetBSD

と指定してやると $Id$ の代わりに $NetBSD$ を置換するようわざわざ CVS 側を改造しとります *3

そして FreeBSD、かつては CVS *4を使っていましたが、今は Subversion に移行しています。

Subversion もデフォルトでは有効でないのですが、 キーワード置換の機能を持っています、ですので事情は NetBSD/OpenBSD と一緒ですちゅーことになります、 ソース

__FBSDID("$FreeBSD: head/sys/kern/init_main.c 255708 2013-09-19 18:53:42Z jhb $");

こっちはキーワード任意に指定できるので改造は不要ですが。

そしてRCSには ident(1)というコマンドが含まれています、これは引数に与えられたファイルから「$keyword$:〜」というパターンを全て検出し、標準出力に表示するものです。

$ ident /usr/src/sys/kern/init_main.c
/usr/src/sys/kern/init_main.c:
     $NetBSD: init_main.c,v 1.441.2.3 2013/03/14 16:33:10 riz Exp $
     $NetBSD: init_main.c,v 1.441.2.3 2013/03/14 16:33:10 riz Exp $

FreeBSDはこの事忘れて一度はRCSを 削除しますが、案の定 炎上して 復活させとりますな *5

@ UCB/CSRG(University of California, Berkeley/Computer Systems Research Group)におけるソースコード管理

386BSDより以前、バークレー時代についてのバージョン情報はライセンス文の下くらいにあります、 こ↑こ↓

 *	@(#)init_main.c	8.16 (Berkeley) 5/14/95

この「@(#)」ではじまる部分は SCCS での キーワード置換によって埋め込まれたメタデータです。

 *	%A%

とソースに入れておくとRCS同様、リポジトリの情報を元に自動的にメタデータに置換されるわけです。これをSCCSIDと一般的には呼びます。

またRCSのident(1)と同様のコマンド what(1)というものがありまして、こいつも引数に与えられたファイルから「@(#)〜」というパターンを全て検出し、標準出力に表示するものです。

$ what /usr/src/sys/kern/init_main.c
/usr/src/sys/kern/init_main.c
        init_main.c     8.16 (Berkeley) 5/14/95
        init_main.c     8.16 (Berkeley) 5/14/95

what(1)は元々SCCSが不自由なソフト(本虫感)であった為、BSDLで書き直されています。今ではオリジナルの実装もSCCSがOpenSolarisの一部として公開されたことにより The Heirloom Development Toolsの一つとして入手可能です。勿論SCCS互換のCSSCにも含まれます。

@ Linux kernelにおけるソースコード管理

オマケ。

最近の若者には中央集権型はえらい嫌われとります、その元凶はとってもお若い精神年齢をお持ちである Linus Torvalds氏ですな、彼いわく( 映像)( テキスト)

うーんこのぐう畜生発言、ぜひソースをzipで固めて管理してるデスマ量産SIerの現場 *6で同じセリフが言えるか訊いてみたいものです 。

アッハイ、本当にLinusって最初の10年間tarballとpatchで管理してたの(絶望)。

For the first 10 years of kernel maintenance, we literally used tarballs and patches, which is a much superior source control management system than CVS is.

この人の話は長くなるだけなのでもうおしまい、グッバイ BitKeeperフォーエバー BitKeeper

@ 次回予告

10回も書いてまだNetBSD 1.3すら終わらないのか(白目)

次回はこのバージョン管理のお話の知識を前提に

マクロを説明します。


*1:若者なので Linux なんて Linux Japanで初めて知ったわー、FreeBSD なんて 徹底入門で初めて知ったわー、NetBSD なんてUNIXUSERの付録から入れたわー、にわかだわー
*2:酒の席でくっそえげつない下ネタ披露する人妻SEでも「ちょっとさすがに抵抗があります」だそうです。
*3:ちなRCSの方は改造されてないので、これらのキーワードは認識しません。
*4:周辺プロジェクトでは Perforce という商用のSCMを使ってました
*5:ちなみにNetBSD では security.conf(5)のバックエンドに使われてたりもしてて、うちも削除しようか?の 提案即NAKされてたり、/etcの下とか/root/.* 飛ばしたときは/var/backupの下見ると幸せになれるかもよ。
*6:他にもVisualSourceSafeにチェックインする前にタイムスタンプをtouch(1)的なもので変更して 年=major 月=minor 日時分=revision のようにバージョン番号として扱う謎ルールで、ふつーの感覚でファイルいじってチェックインするとリブ管が血相変えて飛んでくるとかあったな(白目)


[ホームへ] [ページトップへ]