4 2018年MacPorts

某月某日、子羊が来た。 訴えは GLSC3D のインストールがうまく行かない、だったけれど、 原因というか本当の問題は、 MacPorts のアップデートに失敗していた、ということだった。

この機会に MacPorts 関係のことをまとめておくべきと考え、 少し書いてみた (書いてみたら結構ぐちゃぐちゃだ)。

MacPorts の入手

MacPorts Project が総本山。 英語がすらすら読めるならば、それで十分 (かもしれない…)。

Installing MacPorts から、 自分の Mac の macOS のバージョンに適合した MacPorts を選んでダウンロードする。 例えば、HighSierra の場合、 MacPorts-2.4.3-10.13-HighSierra.pkg というパッケージをダウンロードすることになる。

MacPorts の情報

やはり、 MacPorts Project にある Guide (documentation) が一番信頼がおける。

Xcode のインストール

MacPorts をインストールするには、 Xcode のコマンドライン・ツール (command line tools) が必要である。 現象数理学科 Mac にはインストールされているはずであるが、 macOS のアップグレードをして古くなっていたり、 削除されてしまっている学生が少なくない。 そういう場合は、Xcode の更新 (再インストール) が必要になる。

(蛇足: Xcode をインストールするだけでは、 command line tools はインストールされないし、 Xcode をインストールせずに、 command line tools だけをインストールすることも可能である。 command line tools だけをインストールした状態で、 MacPorts を使い出すと、頻繁に警告が出るけれど、 一応使えているようにも見える。 そういう意味では、Xcode をインストールすることは、 必要条件でも十分条件でもないのかも。)

  1. Xcode のインストールは App Store で行う。
  2. Xcode をインストールしたら、まず一度起動する。 ライセンスへの同意を求められるので、それに応じる。 続いて必要なコンポーネントのインストールをするよう促されるので、 それにも同意しておく。
  3. 続いて、Xcode の command line tools をインストールする。 そのためには、ターミナルで
    xcode-select --install
    
    とすると良い。

MacPorts のインストーラー (pkg ファイル) を実行すると、 (ターミナルで使う) シェルの設定ファイルが書き換えられて、 PATH に /opt/local/bin が追加される。 自動的にやってくれるわけであるが、 正しく設定されたかをチェックする必要があるかもしれない。 ターミナルで
which port
(port で実行されるコマンドはどれ?)
として、/opt/local/bin/port と表示されることを確かめよう。

注意: 設定ファイルを書き換えても、すでに起動済みのシェルに反映されない。 シェルを新しく起動するか (ターミナルを起動し直せばシェルも新しく起動される)、 source コマンドで設定ファイルを再実行すると良い。 例えば、 多くの人は ~/.profile が設定ファイルになっている。 その場合は
source ~/.profile
とすれば良い。

MacPorts の更新

MacPorts とその ports の更新は、日常的には、ターミナルから
更新のおまじない
sudo port selfupdate
sudo port upgrade outdated
とすれば良い (最初のコマンドは、MacPorts 自身の更新。 二つ目のコマンドは、 インストール済みの ports のうちで古くなっているものの更新。)。


しかし、macOS をアップグレードしたときは、 (学生にありがちなのは、macOS 自体は自分でアップグレードするが、 Xcode や MacPorts のアップデートはしないので、 使えない状態になっている、というパターン)、 上のやり方ではうまく行かない。

MacPorts とそれでインストールした ports を更新するための手順は、 MacPorts のサイトの “Migrating a MacPorts installation” で説明されてある。


注意: 単純に新しいものを上書きインストールするのでは、 うまく行かない場合がある、ということである。

どうすべきか、次の2つの選択肢がある。

(i)
素直に Migrating a MacPorts installation にある手順を踏む。
(ii)
古いものを(なるべく)全部消して、すべてを新しくインストールし直す。

私のオススメは (i) である (トラブルが生じにくい)。 しかし、(i) を知らずに、 新しいものを上書きインストールしてハマっている人がいて (自分もそうしたことがある)、 そういう場合は (ii) に近いことをする必要があるであろう。

以下では (ii) について説明する。


MacPorts のアンインストール

“Migrating a MacPorts installation” の 2.4. Uninstall によると、
MacPorts をアンインストールする手順
sudo port -fp uninstall installed

sudo rm -rf \
        /opt/local \
        /Applications/DarwinPorts \
        /Applications/MacPorts \
        /Library/LaunchDaemons/org.macports.* \
        /Library/Receipts/DarwinPorts*.pkg \
        /Library/Receipts/MacPorts*.pkg \
        /Library/StartupItems/DarwinPortsStartup \
        /Library/Tcl/darwinports1.0 \
        /Library/Tcl/macports1.0 \
        ~/.macports
(まず ports を削除して、それから MacPorts 自身を削除する。)
としなさい、とのこと。 /opt/local 以外にも、 色々なところにファイルが置かれていることが分かる。

(2018/9/13) 本当にそんなにあちこちにあるのだろうか?最近は
sudo rm -rf /opt/local /Applications/MacPorts /Library/Tcl/macports1.0
で十分なような感じもする (要調査)。


注意すべきは、MacPorts が古くなっていると、 最初の port コマンドが動かないことである。 それをさぼって rm するだけだと、ゴミが残る可能性がある。

sudo port -fp uninstall installed を実行するためには、

(1)
macOS の更新前に実行しておく。
(2)
新しい MacPorts をインストールして、その port で実行する。
(その後に rm -rf /opt/local … するので、 その port は削除されてしまい、 後でもう一度インストールするということになる。 馬鹿馬鹿しいようだが、MacPorts のインストール自身はごく短時間で済むので、 それほど悩ましくない。)

今の場合、(1) が無理な場合が多く、そのときは (2) をすることになるだろう。


書いていて「大変だなあ」と思うが、 やっていること (数多くの ports -- ソフトウェアを一斉に更新する) を考えると、仕方がないであろう。


私がインストールしているパッケージ    

sudo port install lha
sudo port install a2ps-j
sudo port install nkf
sudo port install jpeg2ps
sudo port install lv
sudo port install gsed
sudo port install wget
sudo port install gnupg2
sudo port install gv
sudo port install ghostscript-fonts-hiragino
sudo port install xpdf-japanese +autoactivate
sudo port install kochi-substitute
sudo port install netpbm
sudo port install gnuplot
sudo port install ImageMagick
sudo port install ffmpeg +nonfree

gsed はときどき必要になる GNU の sed、 wget は WWW サイト等からファイルをダウンロードするコマンド、 a2ps-j は日本語テキスト・ファイルを PostScript に変換するコマンド (utashiro a2ps)、 nkf (Network Kanji Filter) は文字コード変換コマンド、 lv はテキスト・ファイルのビューアー (less の上位互換)、 gnupg2 は GNU privacy guard (暗号化ソフトウェア), gv は PostScript ファイルのビューアー (Ghostscript のインターフェイス)、 ghostscript-fonts-hiragino は Ghostscript で Mac に付属しているヒラギノ・フォントを使う設定 (これをするには、 /opt/local/share/fonts/otf/Hiragino にフォントが必要 -- §[*] 参照)、 xpdf は PDF のビューアー (周辺ソフトが便利)、 kochi-substitute は日本語フォント (例えば xpdf で使える)、 netpbm は画像イメージ・ファイルを扱うライブラリィ、 ImageMagick は画像イメージ・ファイルを扱うコマンド集 (convert とか display とか identity)、 gnuplot は(ご存知?)グラフ描き用のコマンド、 ffmpeg は動画ファイル・音声ファイルを扱うコマンド。


以前は上のコマンドを複数行まとめてコピー&ペーストして実行していたが、 最近は途中で色々尋ねられてしまい、うまく動かない。 1行ずつコピー&ペーストして実行するべき?? その方が安全・確実かもしれないが、 次のように -N というオプションをつけると、 尋ねられないはず (今度やってみよう)。
(一度 sudo を実行して、パスワード入力を済ませておくと、 以下がスムーズに進められる。)
sudo port -N install gsed
sudo port -N install wget
sudo port -N install lha
sudo port -N install a2ps-j
sudo port -N install nkf
sudo port -N install lv
sudo port -N install jpeg2ps
sudo port -N install gnupg2
sudo port -N install gv
sudo port -N install ghostscript-fonts-hiragino
sudo port -N install xpdf-japanese +autoactivate
sudo port -N install kochi-substitute
sudo port -N install netpbm
sudo port -N install gnuplot
sudo port -N install ImageMagick
sudo port -N install ffmpeg +nonfree

ghostscript-fonts-hiragino では、 /opt/local/share/fonts/otf/Hiragino に次のようなファイルがあると仮定している?
Hiragino Sans GB W3.otf
Hiragino Sans GB W6.otf
ヒラギノ明朝 Pro W3.otf
ヒラギノ明朝 Pro W6.otf
ヒラギノ明朝 ProN W3.otf
ヒラギノ明朝 ProN W6.otf
ヒラギノ角ゴ Pro W3.otf
ヒラギノ丸ゴ Pro W4.otf
ヒラギノ角ゴ Pro W6.otf
ヒラギノ角ゴ ProN W3.otf
ヒラギノ丸ゴ ProN W4.otf
ヒラギノ角ゴ ProN W6.otf
ヒラギノ角ゴ Std W8.otf
ヒラギノ角ゴ StdN W8.otf
これらのファイルは、 Yosemite のような古い macOS (MacOS X?) では、 /Library/Fonts//System/Library/Fonts/ に置いてある。

(2018/09/19) あれ、また表示できなくなっている。 バージョンを戻す (こういうことをして大丈夫なのか、理解できていない)。
sudo port activate ghostscript @9.23_3+x11
(何でも、ghostscript 9.23 以前に脆弱性が見つかって、 9.24 は急遽リリースされたそれに対処するためのバージョンらしいけれど、 色々問題含みで、 「9.24 はインストールするな, 9.25を待て」という人達もいるみたい。 9.25 がリリースされたようだけれど、 MacPorts にやってくるにはもう少し時間がかかりそう。 ここ数年振り返ってみると、ghostscript に結構時間を取られている気がする。)


ソースプログラムが自動で入手出来ないとき     最近は滅多に起こらないが、 ソフトウェアのソースプログラムの配布ファイルを自動的に入手出来ない場合がある。 そういうとき、マニュアルで入手した配布ファイルを /opt/local/var/macports/distfiles/パッケージ名 に置いてやれば良い。


たまに使うコマンド    

どのポートがインストールされているか表示するには
port installed
(表示するだけなので sudo はいらない。)


古くなって使っていないポートを掃除する。
sudo port -uf uninstall leaves
sudo port -p uninstall inactive
sudo port -p clean --all all

桂田 祐史
2020-04-05