---
title: 第7章 MASTERDIR
prev: books/porters-handbook/special
next: books/porters-handbook/shared
showBookMenu: true
weight: 7
params:
  path: "/books/porters-handbook/porting-masterdir/"
---

[[porting-masterdir]]
= `MASTERDIR`
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 7
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/porters-handbook/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

その port の変数 (たとえば解像度とか紙のサイズなど) を 変えたりした、少しだけ違うバージョンを作成する必要があるときには、 ユーザが分りやすいように package ごとに別々のサブディレクトリを作成し、 できるだけ port 間でファイルを共有するようにしてください。 ほとんどの場合、うまく変数を使えば、一つを除くすべてのディレクトリには とても短い [.filename]#Makefile# を置くだけで済みます。 その短い [.filename]#Makefile# では、 `MASTERDIR` を使って、 残りのファイルがあるディレクトリを指定できます。 また、<<porting-pkgname,`PKGNAMESUFFIX`>> の 一部に変数に使って、package が別々の名前を持つようにしてください。

具体的な例を示すのが一番わかりやすいでしょう。 これは [.filename]#japanese/xdvi300/Makefile# の一部です。

[.programlisting]
....
PORTNAME=       xdvi
PORTVERSION=    17
PKGNAMEPREFIX=  ja-
PKGNAMESUFFIX=  ${RESOLUTION}
 :
# default
RESOLUTION?=   300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
       ${RESOLUTION} != 300 && ${RESOLUTION} != 400
       @${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
       @${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
       @${FALSE}
.endif
....

package:japanese/xdvi300[] には [.filename]#Makefile# の他に通常のパッチや、 package ファイル等が置かれています。 このディレクトリで `make` を実行すると、 デフォルトの解像度 (300) を使って、 普通に port のビルドを行ないます。

他の解像度に関していうと、 [.filename]#xdvi118/Makefile# に 必要なのは_これだけ_です:

[.programlisting]
....
RESOLUTION=     118
MASTERDIR=      ${.CURDIR}/../xdvi300

.include "${MASTERDIR}/Makefile"
....

([.filename]#xdvi240/Makefile# や [.filename]#xdvi400/Makefile# も同様のものになります)。 [.filename]#bsd.port.mk# は、 `MASTERDIR` の定義から `FILESDIR` や `SCRIPTDIR` 等の 通常のサブディレクトリが [.filename]#xdvi300# 以下に存在することを理解します。 `RESOLUTION=118` の行が、 [.filename]#xdvi300/Makefile# の `RESOLUTION=300` の行を上書きし、 port は解像度を 118 として作成されます。
