MacPortsの紹介

# MacPortsとは

[MacPorts](http://www.macports.org)はOS X用のパッケージ管理システムです。いくつかのportsのメンテナ/コミッタをしています。以前はFinkのメンテナを少ししていました。Homebrewはあまり使ったことがありません。ここでは、MacPortsの特徴を紹介したいと思います。

## 履歴

* 2018/3/7 追記: MacPortsはgithubに[移行](https://github.com/macports)しました。内容の一部は古いです。
* 2020/1/31 改訂・スライドモード対応: [HPC-Phys](http://hpc-phys.kek.jp/workshop/workshop200131.html)登壇のため

---

# OS X用のパッケージ管理システム

OS X用のメジャーなパッケージ管理システムは3つあります。用途や好みに合わせて選択すれば良いと思いますが、混乱の元ですのでどれか一つだけを使うことをお勧めします。

* [Fink](http://www.finkproject.org) 2000年〜。Perl。
* [MacPorts](http://www.macports.org) 2002年〜。Tcl。
* [Homebrew](http://brew.sh) 2007年〜。Ruby。


FinkやMacPortsは歴史が長く昔からあるスクリプト言語で書かれているため、FinkやMacPortsを使うのはおっさんだと言われているようです。10年以上続いているということは、愛用される理由があると思います。

---

# 私が気に入っているところ

* 既定のインストール先``/opt/local``
* 機能の選択
* 単一のツリー
* portsの可読性
* Appleの支援

以下順に説明します。

---

## 既定のインストール先

* Fink: `/sw`
* MacPorts: `/opt/local`
* Homebrew:`/usr/local`

パッケージ管理システム以外でインストールする場合、通常インストール先は``/usr/local``です。MacPortsのパッケージは豊富なため、バイナリをインストールすることは少ないのですが、自分でソースコードからコンパイルしてインストールすることもあります。インストール先が共通だとパッケージ管理システムが適切にバージョンや依存関係を管理できなくなります。

どのシステムでも既定以外のインストール先が指定できます。FinkやMacPortsで``/usr/local``を使ったり、Homebrewで``/sw``や``/opt/local``を使うことも可能ですが、ややこしいことになる可能性が高いのでやめておいた方が良いでしょう。

---

## 機能の選択

ソフトウェアを構成（configure）する際に、使用したい機能のオン・オフが選択できることがあります。MacPortsにはvariantという仕組みがあり、使いたいものを追加したり、使わないものを削除できます。`port info`コマンドで`Variants`に表示されるものが提供されています。例としてGMTは地球物理学でよく利用されるデータ描画ソフトウェア`gmt5`について調べてみます。

```
$ port info gmt5
gmt5 @5.4.5_1 (science)
Sub-ports:            gmt6
Variants:             debug, fftw3, [+]gdal, lgpl, [+]nonfree, openmp, [+]pcre, universal
...
```

`[+]`が付いているものは既定でインストールされる`default_variants`です。

---

### Variantsを指定する

FFTWを使えるようにし、フリーでない機能を削除するには、

```
$ sudo port install gmt5 +fftw3 -nonfree
```
とします。追加するものはvariant名の前に``+``をつけ、削除するものはvariant名の前に``-``をつけます。

#### MacPortsはportsの数が少ない?

2020年1月31日現在[Fink](http://pdb.finkproject.org/pdb/index.php?phpLang=ja)には30180 のパッケージ、[MacPorts](https://www.macports.org)には22912のportsがあります（あれ、思ったより差がない）。Finkでは別のパッケージにしているものがMacPortsでは同じportのvariantとして提供されていることがあるため、数が少なくなります。

---

### 単一のツリー

FinkはOS、アーキテクチャ（powerpc, i386, x86_64）、安定・不安定（stable/unstable）毎に別のパッケージになっています。MacPortsはOSやアーキテクチャの差異はPortfileで吸収しています。そのためportsのツリーは単一です。

### 個人用、部内用のツリー

```/opt/local/etc/macports/sources.conf
file:///Users/landonf/misc/MacPorts/ports [nosync]
```

`[nosync]`は、`port sync`でツリーが最新版に同期される時に対象外とすることを示すものです。ツリーの同期は``port selfupdate``でも実行されます。

---

## portsの可読性

MacPortsは少しのCとTclで書かれています。Tclは古くからあるスクリプト言語で、まだ使われていることに驚くかもしれません。Tclが選ばれた理由の一つは、文法が簡潔（コマンド 引数1 引数2 ...）であることです。

Portfileは、Tclのプログラマでない大多数の人にとっては、単なる設定ファイルのように見えます。

```tcl:archivers/zlib/Portfile
name                    zlib
version                 1.2.11
```

実は`name`や`version`はTclのコマンドとして定義されています。

メンテナにとって、PortfileがTclスクリプトであることは、OSのバージョンやアーキテクチャの差異を吸収するためのコードを含めるときに役立っています。簡潔かつ強力であることがTclが採用されている大きな理由なのです。

---

## Appleの支援

MacPortsはAppleのサーバでホストされるオープンソースプロジェクトの一つでした。[XQuartz](https://www.xquartz.org)や[WebKit](https://webkit.org)などとともに[MacOSForge](https://www.macosforge.org)に挙げられています。[MacPorts Project Team](https://trac.macports.org/wiki/MacPortsDevelopers)には、Apple社員でFreeBSDでも有名なJordan K. Hubbard氏がElder Councilに入っています。Ryan Schmidt氏は、画像ライブラリやサーバ関連のportsを多数管理しており、Project Managersの一人で，一時Appleに雇用されていました。

---

# 個性

最後にそれぞれのシステムに対する印象を述べたいと思います。


* Finkはレビューが厳しく、辛いときもありました。細かくツリーを分けていますので、潔癖なところがあるのかもしれません。反面、ユーザはstableツリーを安心して使えるはずです。
* MacPortsのコミュニティは、ユーザにもメンテナにも大変親切です。調べてから質問しなさいというようなありがちな返事は少ないように思います。上に理由をいくつか挙げましたが、ユーザとしてメンテナ・コミッタ長続きしている本当の理由はコミュニティの居心地がいいからかもしれません。
* HomebrewはRuby、Pythonのパッケージ管理のようにさっとインストールできそうですが、インストールしてとにかく使えることに重きがあり、パッケージをきちんと管理するのは二の次であるような印象を受けます。本当はMacPortsにあるものでも、Homebrewでのインストール手順だけが書いてあるのをよく目にするので勢いを感じます。比較的新しいだけに、徐々に構造が複雑化しつつあるように思います。

振り返れば、MacPortsも徐々に複雑になってきました。Finkにはコンフリクトの機能があったのですが、MacPortsには当初ありませんでした。今でもインストール先を工夫するなどして、コンフリクトは極力回避することになっていますが、現在はコンフリクトが指定できます。高機能化して複雑さが増すことにどのように対処するかが使いやすさに関係していると思います。今のところMacPortsはうまくバランスを取っていると思います。