Makefile の第二の部分では、 その port をビルドするためにダウンロードしなければならないファイルと、 それをどこからダウンロードできるか説明しています。
DISTNAME は製作者が決めたソフトウェアの名前です。 デフォルトでは DISTNAME は ${PORTNAME}-${PORTVERSION} になりますので、 必要にな場合だけ書き換えるようにしてください。 DISTNAME は二つの場所でしか使われません。 一つ目は配布ファイルリスト (DISTFILES) のデフォルト ${DISTNAME}${EXTRACT_SUFX} で、二つ目は配布ファイルが展開されるサブディレクトリ WRKSRC のデフォルト work/${DISTNAME} です。
注意: PKGNAMEPREFIX や PKGNAMESUFFIX は DISTNAME に影響を与えません。 また、元のソースアーカイブが ${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX} という 名前ではないのに、WRKSRC を work/${PORTNAME}-${PORTVERSION} と設定しているなら、おそらく DISTNAME はそのままにしておく必要があることに注意してください — DISTNAME と WRKSRC の両方を (そして おそらく EXTRACT_SUFX も) セットするよりは、DISTFILES を定義する方が楽でしょう。
元になる配布ファイルを指し示す、FTP/HTTP の URL のファイル名を除いた部分を MASTER_SITES に設定します。 最後にスラッシュ (/) をつけることをお忘れなく!
このシステム上に配布ファイルが見つからなかった場合、 make マクロは FETCH を使ってこの変数に指定されたサイトから配布ファイルを取得しようとします。
このリストには、 できれば異なる大陸に存在する複数のサイトを入れておくことが推奨されています。 これにより、広域ネットワークのトラブルに対する耐性を高めることができます。 さらに私たちは、自動的に最も近いマスタサイトを判断して、 そこから取ってくるメカニズムの導入を計画しています。 複数のサイトがあれば、この取組を大きく助けることになります。
元になる tar ファイルが X-contrib や GNU, Perl CPAN 等の有名なアーカイブサイトに置かれている場合には、 MASTER_SITE_* を使ってこれらのサイトを簡潔に (例えば MASTER_SITE_XCONTRIB とか、 MASTER_SITE_PERL_CPAN のように) 指定することができます。 MASTER_SITES を これらの変数の一つにセットし、 サイト内でのパスを MASTER_SITE_SUBDIR に指定するだけです。 以下に例を示します。
MASTER_SITES= ${MASTER_SITE_XCONTRIB} MASTER_SITE_SUBDIR= applications
これらの変数は /usr/ports/Mk/bsd.sites.mk で定義されています。 いつでも新しい項目が追加されて行きますので、 port を提出する前に このファイルの最新版を チェックするように心掛けてください。
ユーザは /etc/make.conf 中で MASTER_SITE_* 変数を上書きすることもできます。 そうすることで、これらの有名なアーカイブそのものではなく、 好みのミラーサイトを使用することができます。
配布ファイルが 1 つで、 圧縮方式を示すのに普通と異なる接尾辞を使っていたら、 EXTRACT_SUFX を設定してください。
例えば、配布ファイルがより一般的な foo.tar.gz ではなく、 foo.tgz となっていたら、 次のように書きます。
DISTNAME= foo EXTRACT_SUFX= .tgz
USE_BZIP2 と USE_ZIP 変数を設定すると、EXTRACT_SUFX は必要に応じて自動的に .bz2 または .zip に設定されます。 どちらも設定されていなければ、EXTRACT_SUFX は .tar.gz に設定されます。
注意: EXTRACT_SUFX と DISTFILES を両方設定する必要はありません。
時々、ダウンロードするファイルの名称が port の名称とまったく似ていないことがあります。たとえば、 source.tar.gz などと名づけられていることもあるでしょう。 ほかに、ソースコードがいくつかのアーカイブに分かれていて、 そのすべてをダウンロードしなければならないならないこともあります。
この場合、DISTFILES に、ダウンロードしなければならないファイルすべてのリストを、 スペースで区切って設定してください。
DISTFILES= source1.tar.gz source2.tar.gz
明示的に設定されていない場合、 DISTFILES は ${DISTNAME}${EXTRACT_SUFX} に設定されます。
DISTFILES の一部だけを展開すべき (例えば、一方がソースコードで、もう一方は圧縮されていない文書という) 場合、展開しなければならないファイル名を EXTRACT_ONLY に設定してください。
DISTFILES= source.tar.gz manual.html EXTRACT_ONLY= source.tar.gz
どの DISTFILES も展開すべきではないなら、 EXTRACT_ONLY に空文字列を設定してください。
EXTRACT_ONLY=
その port が配布ファイルの他に FTP や HTTP で手に入る追加パッチを必要とする場合には、 PATCHFILES にはそのパッチのファイル名を、 PATCH_SITES にはそのファイルが置かれているディレクトリの URL をセットしてください。(書き方は MASTER_SITES と同じです。)
そのパッチに記録されているファイル名に余計なパス名がついていて、 ソースツリーのトップディレクトリ (つまり WKRSRC) からの相対パスになっていない場合には、 それに応じた PATCH_DIST_STRIP を指定してください。 たとえば、パッチ内のすべてのファイル名の先頭に、余計な foozolix-1.0/ がついている場合には、 PATCH_DIST_STRIP=-p1 としてください。
これらのパッチは圧縮されていても大丈夫です。 ファイル名が .gz や .Z で終わる場合には、自動的に展開されるようになっています。
もしパッチが、ドキュメント等その他のファイルと一緒に gzip された tar ファイルで配布されている場合には、単に PATCHFILES を使うだけではうまくいきません。 このような場合には、このパッチの tar ファイルの名前と場所を DISTFILES と MASTER_SITES に追加しておきます。 それから、EXTRA_PATCHES 変数にそれらのパッチを指定すれば、 bsd.port.mk が 自動的にパッチを適用してくれます。 特に注意が必要なのは、パッチファイルを PATCHDIR ディレクトリにコピーしてはならないことです — (訳注: port が CD-ROM 上に置かれている等の場合には、) そのディレクトリには書き込みができないかもしれません。
注意: それが普通の gzip か compress された tar ファイルであれば、 通常のソースファイルと一緒にパッチ適用時までに展開されていますので、 明示的に展開する必要はありません。 もしパッチを DISTFILES に追加した場合には、パッチを含むファイルが展開される際に、 そのディレクトリにある何かを上書きしないように注意してください。 さらに、コピーされたパッチファイルを削除するコマンドを pre-clean ターゲットに追加することを忘れないでください。
(これはいささか``高度な話題''です。 この文書を初めて読む人は、 最初はこの節を飛ばしてもよいでしょう)。
この節は MASTER_SITES:n や MASTER_SITES_NN と呼ばれる取得方法について説明しています。 ここでは、この方式を MASTER_SITES:n と呼びます。
まず、背景を少し説明しておきましょう。OpenBSD には、DISTFILES と PATCHFILES 変数の両方に素敵な機能があります。ファイル、パッチの両方とも、 後ろに :n (n は [0-9] のどれかになります) をつけてグループを指示できます。たとえば、
DISTFILES= alpha:0 beta:1
OpenBSD では、配布ファイル alpha は、通常の MASTER_SITES ではなく MASTER_SITES0 に、 beta は MASTER_SITES1 に結び付けられます。
これは、正しいダウンロードサイトを際限なく探す羽目になるのを減らせる、 興味深い機能です。
DISTFILES にファイルが 2 つ指定され、MASTER_SITES が 20 サイトあって、サイトはものすごく遅く、 beta は MASTER_SITES 中のすべてのサイトに置かれていますが、 alpha は 20 番目のサイトにしかないという場合を考えてください。 メンテナがあらかじめそのことを知っていたら、 すべてのサイトを確認するのは無駄だと思いませんか? 楽しい週末のはじまりというわけにはゆきませんね。
イメージできたら、今度は DISTFILES や MASTER_SITES がもっと沢山あるのを想像してください。 ``distfiles 調査マイスタ''は、 ネットワーク負荷が緩和されることを喜ぶに違いありません。
次節からは、FreeBSD におけるこのアイディアの実装について説明します。 OpenBSD の考え方を多少改良しています。
この節では、複数の配布ファイルやパッチを、 異なるサイトやサブディレクトリから細かく分けて取得する簡単な設定を示します。 ここでは、単純化した MASTER_SITES:n の使い方を説明します。ほとんどの場面ではこれで十分です。 さらに詳しいことを知りたければ、次の節をお読みください。
アプリケーションによっては、 いくつもの異なるサイトからダウンロードする複数の配布ファイルからなっているものがあります。 たとえば、Ghostscript は、中核部のプログラムと、 ユーザのプリンタに応じて使い分けられる多数のドライバファイルからなっています。 このドライバファイルの一部は中核部と共に配布されますが、 多くはさまざまなサイトからダウンロードしなければなりません。
これに対応するため、DISTFILES の各項目の後ろには、コロンと``タグ名'' をつけられるようになっています。MASTER_SITES に設定されているそれぞれのサイトの末尾にも、コロンと、 そのサイトからダウンロードすべきファイルを示すためのタグを加えます。
たとえば、ソースコードが source1.tar.gz と source2.tar.gz の 2 つに分けられていて、 2 つの別のサイトからダウンロードしなければならないアプリケーションを考えてみましょう。 その port の Makefile には、例5-1 のような行があるとします。
例 5-1. 各サイトに 1 つファイルがある場合の、簡単な MASTER_SITES:n の使用法
MASTER_SITES= ftp://ftp.example1.com/:source1 \ ftp://ftp.example2.com/:source2 DISTFILES= source1.tar.gz:source1 \ source2.tar.gz:source2
複数の配布ファイルに同じタグがついていてもかまいません。 先ほどの例に続いて、3 番目の配布ファイル source3.tar.gz があって、 ftp.example2.com からダウンロードすべきだとしましょう。 Makefile は 例5-2 のようになります。
分かりました。 前節の例ではあなたの要求を満足できなかったわけですね。 この節では、ファイルの取得を細かく制御する仕組み MASTER_SITES:n がどう働くかと、これを利用するために ports をどう変更すればよいかを詳しく説明します。
要素の末尾に :n をつけることができます。 ここで、n は [^:,]+ つまり、概念上はいかなる文字と数字からなる文字列でもよいのですが、 われわれとしては、当面は [a-zA-Z_][0-9a-zA-Z_]+ に制限します。
さらに、文字列のマッチは大文字と小文字を区別します。 つまり、n と N は別の文字として扱われます。
しかし、 default, all, ALL は特別な意味を与えられているので、 末尾に付加するのには使えません (これは、ii 項で内部的に利用されています)。 さらに、DEFAULT は特別な意味を持つ単語です (3 の項を確認してください)。
:n がついた要素は、グループ n に属し、 :m がついた要素は、グループ m に属するということになります。
接尾辞がついていない要素はグループに属しません。 これは、特別なグループ DEFAULT に属しているとして扱われます。 要素の後ろに DEFAULT をつけるのは、その要素を DEFAULT とそれ以外のグループに同時に割り当てたいのでなければ、 冗長に過ぎません (5 の項を確認してください)。
次の例はどちらも同じ意味ですが、 最初の方が好ましいです。
MASTER_SITES= alpha MASTER_SITES= alpha:DEFAULT
グループは相互排他ではありません。 ひとつの要素が同時に複数のグループに属することができ、 ひとつのグループには複数の要素が属することも、 何も割り当てないこともできます。 同じグループで何回も指定された要素は、 単に複数回指定された要素ということになります。
ある要素を同時にいくつものグループに所属させたい時は、 カンマ演算子 (,) が使えます。
その都度別の接尾辞をつけて繰り返すかわりに、 一度だけ接尾辞を指定して複数のグループを指定できます。 たとえば、:m,n,o と書くと、その要素はグループ m, n および o に属することを示します。
以下の例はすべて同等ですが、 最後の形式がもっともよいでしょう。
MASTER_SITES= alpha alpha:SOME_SITE MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE MASTER_SITES= alpha:SOME_SITE,DEFAULT MASTER_SITES= alpha:DEFAULT,SOME_SITE
任意のグループ内のサイトは、 MASTER_SORT_AWK によって整列されます。 MASTER_SITES と PATCH_SITES 内のすべてのグループについても同様に整列されます。
グループの概念は、変数 MASTER_SITES, PATCH_SITES, MASTER_SITE_SUBDIR, PATCH_SITE_SUBDIR, DISTFILES および PATCHFILES においても、下記の文法に従って使えます。
MASTER_SITES, PATCH_SITES, MASTER_SITE_SUBDIR および PATCH_SITE_SUBDIR のすべての要素はスラッシュ / 記号で終端されていなければなりません。 ある要素がどれかのグループに属しているなら、 グループの接尾辞 :n は、終端記号 / のすぐ後にこなければなりません。 MASTER_SITES:n の仕組みでは、終端記号 / があることで、 :n が要素の有効な一部である場合と、 :n がグループ n を示す場合の混同を避けることができます。 以前は、 MASTER_SITE_SUBDIR と PATCH_SITE_SUBDIR 要素のいずれにおいても終端記号 / は不要だったので、互換性を保つために、 接尾辞の直前の文字が / でなければ、 要素の接尾辞が :n であっても、 グループの接尾語ではなく、 要素の有効な一部分として扱われます。 例5-3 と 例5-4 の両方をご覧ください。
例 5-3. MASTER_SITE_SUBDIR における MASTER_SITES:n の詳細な使用法
MASTER_SITE_SUBDIR= old:n new/:NEW
グループ DEFAULT に属するディレクトリ -> old:n
グループ NEW に属するディレクトリ -> new
例 5-4. カンマ演算子、複数のファイル、複数のサイト、 複数のサブディレクトリと合わせた MASTER_SITES:n の詳細な使用法
MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \ http://site3/:group3 http://site4/:group4 \ http://site5/:group5 http://site6/:group6 \ http://site7/:DEFAULT,group6 \ http://site8/%SUBDIR%/:group6,group7 \ http://site9/:group8 DISTFILES= file1 file2:DEFAULT file3:group3 \ file4:group4,group5,group6 file5:grouping \ file6:group7 MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \ directory-one/:group6,DEFAULT \ directory
上の例は、次のような細かく分けた取得を実現します。 サイトは、利用される順番で挙げられています。
file1 は次のサイトから取得されます。
MASTER_SITE_OVERRIDE
http://site1/directory/
http://site1/directory-one/
http://site1/directory-trial:1/
http://site2/
http://site7/
MASTER_SITE_BACKUP
file2 は、file1 と同じグループに属しているので、 まったく同じように取得されます。
MASTER_SITE_OVERRIDE
http://site1/directory/
http://site1/directory-one/
http://site1/directory-trial:1/
http://site2/
http://site7/
MASTER_SITE_BACKUP
file3 は次のサイトから取得されます。
MASTER_SITE_OVERRIDE
http://site3/
MASTER_SITE_BACKUP
file4 は次のサイトから取得されます。
MASTER_SITE_OVERRIDE
http://site4/
http://site5/
http://site6/
http://site7/
http://site8/directory-one/
MASTER_SITE_BACKUP
file5 は次のサイトから取得されます。
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
file6 は次のサイトから取得されます。
MASTER_SITE_OVERRIDE
http://site8/directory-one/
MASTER_SITE_BACKUP
MASTER_SITE_SOURCEFORGE のように、bsd.sites.mk で定義される特別な変数をグループに割り当てるにはどうすればよいですか?
例5-5 をご覧ください。
例 5-5. MASTER_SITE_SOURCEFORGE と合わせた MASTER_SITES:n の詳しい使用法
MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/} DISTFILES= something.tar.gz:sourceforge
something.tar.gz は、MASTER_SITE_SOURCEFORGE に含まれるあらゆるサイトから取得されます。
これを PATCH* 変数と組み合わせて使うにはどうすればよいでしょうか?
すべての例で MASTER* 変数を使っていますが、例5-6 にあるように、PATCH* 変数に対してもまったく同じように働きます。
現在のすべての ports はそのまま変わりません。 MASTER_SITES:n 機能のコードは、7 で述べた文法に従う :n のような形式が後ろについた要素がある場合だけ動作します。
port を make する際のターゲットにも変更はありません。 checksum, makesum, patch, configure, build 等です。 もちろん、do-fetch, fetch-list, master-sites それから patch-sites は例外です。
do-fetch は、新しくグループ分けの接尾辞のついた DISTFILES と PATCHFILES を設定します。それぞれが、対応する MASTER_SITES と PATCH_SITES を利用し、さらに対応する MASTER_SITE_SUBDIR と PATCH_SITE_SUBDIR を利用します。 例5-4 をご覧ください。
fetch-list は、do-fetch と同じようにグループを利用するということを除いて、以前の fetch-list のように動作します。
master-sites および patch-sites は、 (古いバージョンと互換性がなくなり) DEFAULT グループの要素を返すだけになっています。 実際は、それぞれ master-sites-default および patch-sites-default というターゲットを実行します。
さらに、 MASTER_SITES や PATCH_SITES を直接確認するよりも、 master-sites-all または patch-sites-all のどちらかのターゲットを使う方がよいです。 また、将来のバージョンでも直接確認ができるかどうかは保証されていません。 これら新規 port ターゲットについては、iii.ii の項をご確認ください。
新規の port ターゲット
MASTER_SITES および PATCH_SITES のそれぞれについて、 グループ n の要素を表示する master-sites-n および patch-sites-n ターゲットがあります。たとえば、 master-sites-DEFAULT および patch-sites-DEFAULT のいずれも DEFAULT グループの要素を返し、 master-sites-test および patch-sites-test は test グループの要素を返します。
以前の master-sites および patch-sites が行っていた作業を行う master-sites-all および patch-sites-all という新たなターゲットがあります。 これらのターゲットは、 すべてのグループの要素をすべてが同じグループに属しているかのように返します。 ただし、 master-sites-all および patch-sites-all のそれぞれについて、 DISTFILES や PATCHFILES で定義されているグループと同じ数だけ MASTER_SITE_BACKUP と MASTER_SITE_OVERRIDE を表示します。
/usr/ports/distfiles ディレクトリ内をあまり散らかさないようにしてください。 たくさんのファイルを取ってくる port や、他の port と名前の衝突が起きる恐れのあるファイル (Makefile など) がある場合には、 DIST_SUBDIR に port の名前 (${PORTNAME} か ${PKGNAMEPREFIX}${PORTNAME} を使うといいでしょう) を入れてください。すると DISTDIR がデフォルトの /usr/ports/distfiles から /usr/ports/distfiles/DIST_SUBDIR に変更され、 取ってきたファイルはすべてそのサブディレクトリの中に置かれるようになります。
また、 ファイルを取ってくるときにバックアップサイトとして使われる ftp.FreeBSD.org のディレクトリ名にもこの変数の値が使われます (Makefile の中で DISTDIR を明示的に指定した場合、 ローカルのファイルを置くところは変わりますが、 このサイトのディレクトリ名は変わりません。 必ず DIST_SUBDIR を使うようにしてください)。
注意: この変数は Makefile 中で明示的に指定された MASTER_SITES には影響しません。