残念ながら, 移植がそう簡単ではなく, 動かすために多少の変更が 必要な場合も多いでしょう. この節では, portsコレクション の方法論にのっとって, そのような場合にどのように変更を施し, 動 くようにしたらよいかを順を追って説明します.
まず, あなたがportのディレクトリで `make' とタイ
プしてから起こる一連の出来事について,順を追って説明しま
す. ここを読むときには, 他のウィンドウで同時に 
bsd.port.mkも開いておくとよいかもしれません.
しかし, bsd.port.mkが何をしているのか, 完全に理解
できなくても心配する必要はありません. そう多くの人が理解して
いるわけではないですから... f(^_^;)
${DISTDIR}に配布ファ
イルがあるようにするのが役目です. もし, fetchが必要なファ
イルを${DISTDIR}に見つけることができなけ
れば, Makefileに指定されているURL
${MASTER_SITES}, そして私たちのFTPサイトで
ある ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/ (ここ
には, 私たちが取ってきたファイルをバックアップとして置いてあ
ります) に探しにいきます. そして, ユーザのサイトがインター
ネットに直接接続されている場合には,
${FETCH} を使って, その名前のファイルを取っ
てきて, ${DISTDIR}に保存します.
${DISTDIR}にある, 配布ファイル (普通は
gzipされたtarファイル) を読み, ソースを一時的な作業ディレ
クトリ${WRKDIR} (デフォルトは
work) に展開します.
${PATCHFILES}に定義されている, すべてのパッ
チをあてます. 次にもし${PATCHDIR} (デフォ
ルトはpatches サブディレクトリ) にパッチが存在す
れば, これらをアルファベット順にあてます.
scripts/configure が実行されます. 
${HAS_CONFIGURE} あるいは
${GNU_CONFIGURE} がセットされていれば, 
${WRKSRC}/configure が実行されます. 
${USE_IMAKE} がセットされていれば, 
${XMKMF} (デフォルト: `xmkmf
-a') が実行されます. 
${WRKSRC}) にい
き, コンパイルするのが役目です. もし 
${USE_GMAKE} がセットされていれば, GNU
makeが使用されます. さもなければFreeBSDの 
makeが使用されます.
上記はデフォルトのルールです. さらに, `pre-<何とか
>や `post-<何とか>' というターゲット
が定義してあったり, そのような名前のスクリプトが 
scripts サブディレクトリに置いてある場合には, それ
らはデフォルトの動作の前後に実行されます.
たとえば, post-extractというターゲットがMakefile 
で定義されていて, pre-buildというファイルが,
scriptsサブディレクトリにあるとすると,
post-extractターゲットは, 通常の展開動作のあとに呼
び出され, pre-buildスクリプトはデフォルトのコンパイ
ルのルールが実行される前に実行されます. もし動作が簡単であれ
ば, Makefileのターゲットを使用することが推奨されています. な
ぜならば, そのportが何らかのデフォルトではない動作を必要とす
るのかどうかが一箇所にまとめて書いてあった方が他の人に理解しやす
いからです.
デフォルトの動作はbsd.port.mk の
`do-<何とか>' というターゲットでおこなわれます.
たとえば, portを展開するコマンドは, `do-extract' 
というターゲットにあります.  もし, デフォルトのターゲットに
不満があれば, `do-<something>' というターゲッ
トを再定義することによって, どのようにでも直すことができます.
「メイン」のターゲット (例えば, extract,
configure等) は, すべての前段階が実行されていること
を確認して, 実際のターゲットやスクリプトを呼び出す以外のこと
はしません. bsd.port.mkはこれらが変更されることは仮定してい
ませんので, もし, 例えば, 展開の仕方を直したいときには,
do-extract を直し, 絶対にextractには手を
触れないでください.
これで, ユーザが `make' と入力したときに何が起こ
るのかが理解できたと思います. では, 完璧なportを手順を追っ
て作ってみましょう.
オリジナルのソースを, (普通は) 圧縮されたtarファイルの形
(<foo>.tar.gzあるいは 
<foo>.tar.Z) で入手して, それを 
${DISTDIR} にコピーします. 可能なかぎり, 広
く使われている主流のソースを使用するようにしてください.
もし, ネットワークへの接続のよい FTP/HTTP サイトを見つけるこ
とができなかったり, 頭にくるような非標準的な形式しか持ってい
ないサイトしか見つけられないときには, 自分で管理する確実な
ftp か http サーバ (たとえば, あなたのホームページ)に置くこと
ができます. MASTER_SITES に正しく反映されていること
を確認してください.
もしも, そのような都合の良く, 安心な置き場所が見つけられない
場合(あなたが FreeBSD の committer であれば, 自分の 
public_html ディレクトリに置けます), 私たちが,
ftp://ftp.FreeBSD.ORG/pub/FreeBSD/distfiles/LOCAL_PORTS/
に置き場所を提供できます. この場所は, 変数
${MASTER_SITE_LOCAL} を使って参照してくださ
い. これについての問い合わせのメールは FreeBSD 移植ソフトウエアメーリングリスト
<freebsd-ports@FreeBSD.ORG> へお願いしま
す.
その port の配布ファイルが特に理由もなく, しょっちゅう
変る場合には, 配布ファイルをあなたのホームページに置いて
MASTER_SITESの最初に入れてください. こうすること
によって, ユーザ利用する場合に `checksum mismatch' エラー
が起るのを防ぎ, 我々の ftp サイトの保守の負担を
減らすことができます.  もし, master site がたった一つ
しかない場合には, あなたのサイトにバックアップを置いて
MASTER_SITES の2番目に加えてください.
もし, あなたのportに必要ないくつかの追加パッチがインター
ネット上で手に入るのならば, それらも取ってきて,
${DISTDIR} に置きます. もし, それらがメイン
のソースのtarファイルとは別のサイトにあっても, 心配する必要
はありません. そのような状況にはちゃんと対応できるようになっ
ています. (以下の
${PATCHFILES}の記述をご覧ください).
適当なディレクトリにtarファイルを展開して, FreeBSDの最新の バージョン上で, 正しくコンパイルできるために必要なあらゆる変 更を施します. 最終的に処理は自動化するわけですから, 何をおこなっ たかを注意深く記録しておきましょう. あなたのport が完成した暁には, ファイルの削除, 追加, 修正を含むすべての処 理が, 自動化されたスクリプトやパッチファイルでおこなえるようになっ ていないといけません.
もし, あなたのportのコンパイルやインストールのために必要 な手作業があまりに多いようならば, Larry Wallの模範的な Configureスクリプトでも参考にしたほうがいいかもしれませ ん. 新しいportsコレクションは, 最小のディスクスペースで, 個々のportがエンドユーザにできるだけ「プラグ & プレ イ」の状態でmakeできることをめざしています.
注意: あなたが作成しFreeBSDのportsに寄付されたパッチファイル, スクリプトおよびその他のファイルは,明示的に記述されている場合 を除いては, BSDの標準的な著作権条件によりカバーされていると見な されます.
portの過程で追加されたり変更されたファイルは再帰的diffで変
更点を取り出すことができます. パッチは適当にまとめて,
`patch-<xx>' という名前のファイルに入れてくだ
さい. <xx>はパッチが適用される順番を示します -- 
これらは, アルファベット順, つまり `aa' が
最初, つぎに `ab' などとなります. これらのファイル
を${PATCHDIR}に置いておくと, 自動的に適用さ
れるようになっています. すべてのパッチは
${WRKSRC} (通常は, portのtarファイルが展
開されるところで, makeが実行されるところと同じです) からの相
対パスになります. 修正やアップグレードを容易にするため, 2つ
以上のパッチが同じファイルを修正するのは避けてください. (例,
patch-aaとpatch-abが共に${WRKSRC}/foobar.c
を修正する, など.)
カスタマイズのために追加したいコマンドがあれば,
configureという名前のスクリプトに入れて
`scripts' サブディレクトリに置きます. 上で述べたよ
うに, pre-configure あるいはpost-configure
というMakefileのターゲットおよび/あるいはスクリプトで処理す
ることもできます.
もし, そのportがビルド, コンフィグレーション, インストー
ルの際にユーザからの入力を必要とするならば, Makefileで 
IS_INTERACTIVEをセットしてください. これによって, 
深夜, 自動的にたくさんのportをコンパイルすることが可能にな
ります. 環境変数BATCHがセットされていると 
IS_INTERACTIVEの定義されているportはスキップされ
ます (そして, ユーザがINTERACTIVEという変数をセッ
トすると入力を必要とするportのみコンパイルされま
す).
もし, 適切なデフォルト設定があるのであれば, 
PACKAGE_BUILDING 変数をチェックして, それが設定されて
いる場合には, ユーザ入力のスクリプトを起動しないように
してください. こうすることによって,  CD-ROM や ftp に
置く package を我々が作成することができます.