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「各サイトに 1 つファイルがある場合の、簡単な
MASTER_SITES:n の使用法」
のような行があるとします。
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「各サイトに 1 つ以上ファイルがある場合の、簡単な
MASTER_SITES:n の使用法」
のようになります。
MASTER_SITES:n の使用法MASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2 \
source3.tar.gz:source2分かりました。
前節の例ではあなたの要求を満足できなかったわけですね。
この節では、ファイルの取得を細かく制御する仕組み
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「MASTER_SITE_SUBDIR における
MASTER_SITES:n の詳細な使用法」
と 例5.4「カンマ演算子、複数のファイル、複数のサイト、
複数のサブディレクトリと合わせた
MASTER_SITES:n
の詳細な使用法」
の両方をご覧ください。
MASTER_SITE_SUBDIR における
MASTER_SITES:n の詳細な使用法MASTER_SITE_SUBDIR= old:n new/:NEW
グループ DEFAULT
に属するディレクトリ -> old:n
グループ NEW
に属するディレクトリ -> new
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「MASTER_SITE_SOURCEFORGE
と合わせた MASTER_SITES:n
の詳しい使用法」
をご覧ください。
MASTER_SITE_SOURCEFORGE
と合わせた MASTER_SITES:n
の詳しい使用法MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
DISTFILES= something.tar.gz:sourceforgesomething.tar.gz
は、MASTER_SITE_SOURCEFORGE
に含まれるあらゆるサイトから取得されます。
これを PATCH*
変数と組み合わせて使うにはどうすればよいでしょうか?
すべての例で MASTER*
変数を使っていますが、例5.6「PATCH_SITES と合わせた
MASTER_SITES:n の簡単な使用法」
にあるように、PATCH*
変数に対してもまったく同じように働きます。
PATCH_SITES と合わせた
MASTER_SITES:n の簡単な使用法PATCH_SITES= http://site1/ http://site2/:test PATCHFILES= patch1:test
現在のすべての 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「カンマ演算子、複数のファイル、複数のサイト、
複数のサブディレクトリと合わせた
MASTER_SITES:n
の詳細な使用法」
をご覧ください。
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 ターゲットについては、B
の項をご確認ください。
新規の port ターゲット
MASTER_SITES および
PATCH_SITES
のそれぞれについて、
グループ n の要素を表示する
master-sites-
および
npatch-sites-
ターゲットがあります。たとえば、
nmaster-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
には影響しません。
本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。
FreeBSD に関する質問がある場合には、
ドキュメント を読んだ上で
<questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、
<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。