selflearn @ ウィキ

MacPortsのPortfileをゴニョゴニョする

最終更新:

selflearn

- view
メンバー限定 登録/ログイン
-

MacPortsで用いるPortfileを自分好みに変更する方法

このページでは、MacでMacportsを使用しているときによくある要求:
  • 最近出たばかりの新バージョンをMacPortsで管理したい
    • MacPortsの設定変更を待てない
に対して、自分でPortfileを変更して対処する方法について記します。

注意

本ページをお読みいただくにあたり、以下の点にご注意ください。
  • MacPortsについての説明は省略します。参考サイトに挙げた別サイトを確認してください
  • 以下の情報については記述していません。
    • 独自パッケージに対するPortfileの作り方
    • variantsなど、checksumsとversion以外の項目の変更方法
  • 本作業によって問題が生じても私は責任を持てません。後述する補足事項を確認して、自己責任下で作業を行ってください。
  • このサイトを見るより、MacPortsWikiJPを見ると価値の多い情報が載っていますよ。
最終更新日:2009年06月05日 (金) 10時59分17秒;

Portfileってなに?


MacPortsでは、自分でインストールすることのできるファイルの一覧をPortfileというテキストファイルで管理しています。このファイルで、
  • 管理パッケージの情報
    • カテゴリ
    • 名称
    • バージョン
    • 概要
  • ダウンロードファイルのチェックサム(MD5,SHA-1,etc.)
  • ビルドオプション(variants)
  • 依存パッケージ
を記述しておくことで、「port install hogehoge」で色々と手回ししつつビルド・セットアップを行ってくれるわけです。
そしてこれらのファイルは「port selfupdate」や「port sync」によって、配布元の最新ファイルに随時更新されていきます。

つまり、このファイルを自分なりに手を加えることで、自分が望むバージョンのファイルを入れたりすることができるようになるわけです。

本記事を記述するに当たって、多くのサイトの情報を参考にさせてもらいました。それらはできる限り参考サイトに載せておきましたが、載せられなかった方については、この場を借りてお詫び&お礼を申し上げておきます。

目次

作業環境

設定ファイルに直接手を入れているので、バージョンや環境を明示しておきます。

プログラム バージョン
OS Mac OS X 10.5 Leopard(10.5.5) IntelMac上で使用
MacPorts 1.600
Portfileのフォーマットや書き方はそうそう変わるものではないでしょうが、今後のMacPortsの展開次第では本情報は無益なものになる可能性があります。その点はあらかじめご了承ください。

基本手順

まず、大まかな手順を伝えておきます。
  1. (すでにインストール済みのパッケージであればアンインストールしておく)
  2. 目的のPortfileを変更する
  3. インストール
以下では、依存関係もなく修正が簡単なパッケージ「GNU global」を取り上げ、その最新パッケージをインストールできるようにする方法を紹介します。

1.すでにインストール済みのパッケージであればアンインストールしておく

これから変更しようとするパッケージがインストール済みであれば、それをアンインストールしておいてください。
% port installed | grep global
  global @5.6.2_0 (active)
% sudo port uninstall global
Password:
--->  Deactivating global 5.6.2_0
--->  Uninstalling global 5.6.2_0
% port installed | grep global
%  

2.目的のPortfileを変更する

次に、Portfileの中身を変更します。
globalのPortfileは「/opt/local/var/macports/sources/rsync.macports.org/release/ports/devel/global」にあります。中身は以下のとおりです。
% cd /opt/local/var/macports/sources/rsync.macports.org/release/ports/devel/global
% more Portfile
# $Id: Portfile 33469 2008-01-27 15:20:37Z nox@macports.org $
 
PortSystem      1.0
 
name            global
version         5.6.2
categories      devel
platforms       darwin
maintainers     nomaintainer
description     source code tag system
 
long_description \
    GNU GLOBAL is a source code tag system that works the \
    same way across diverse environments. You can locate a \
    specified object in the source files and move there \
    easily. It is useful for hacking a large project \
    containing many subdirectories, many #ifdef and many \
    main() functions. It is similar to ctags or etags but \
    is different from them at the point of independence of \
    any editor.
 
homepage        http://www.gnu.org/software/global/
master_sites    gnu
 
checksums       md5 c927bcd92dff1c092d43f7d78911fc9c \
                sha1 0f594e1c10ab04db6dbd3e7bd6d6e16dd3c58ffa \
                rmd160 70862a2d79ec8fe97caa63416c1c945913fe0065
 
configure.args  --infodir=${prefix}/share/info \
                --mandir=${prefix}/share/man
 
test.run        yes
test.target     check
 
livecheck.check regex
livecheck.url   http://ftp.gnu.org/gnu/${name}/?C=M&O=D
livecheck.regex ${name}-(\\d+\\.\\d+(?:\\.\\d+)?) 
本ファイルから、動作に関する情報をいくつか知ることができます。
属性 判明する情報
name パッケージの名前は"global"(本Portfileが存在するディレクトリ名との関係は不明)
version 対象としているバージョンは5.6.2
description, long_description 本属性で概要と、もう少し詳しい説明を記述している
checksums チェックサムに3種類(MD5, SHA-1, RIPEMD160)のメッセージダイジェストを使用していること
livecheck.* ファイルの取得先がhttp://ftp.gnu.org/gnuで、${name}はたぶんglobalを指していること。また、バージョンの情報が書かれていないことから、バージョン情報はversion属性を使用していること
そのほかにも色々ありますが、ちょっとよく分かっていません。詳しくは「man 7 portfile」で。
この中のファイルを修正します。globalの場合、
  • versionを5.7.2に変更(2008/10/29時点の最新版)
  • checksumsを5.7.2の情報に変更
以上の作業を行います。

2.1. versionを5.7.2に変更

ファイル中の「version」を「5.6.2」から「5.7.2」に書き換えます。
version         5.6.2→5.7.2 

2.2. checksumsを5.7.2の情報に変更

チェックサムを5.7.2のファイルで計算した値に書き換えます。でないとインストール時にチェックサムのエラーが発生してしまいます。

ところが、この情報はhttp://ftp.gnu.org/gnu/globalに行っても得られません(ファイルが置いてあるのみ)。
そこで本ファイルを別途ダウンロードしておき、opensslコマンドでチェックサムを求める、という対策を取ります。

まず、http://ftp.gnu.org/pub/gnu/global/global-5.7.2.tar.gzをダウンロードしてください。
そしてこのファイルに対してopensslコマンドを使用します。
% openssl dgst global-5.7.2.tar.gz
MD5(global-5.7.2.tar.gz)= d161aa02e458dca32357b8f1a3e72809
% openssl dgst -sha1 global-5.7.2.tar.gz
SHA1(global-5.7.2.tar.gz)= 497a7ff7bae39ee5177862f19e364b26a7cd6f61
% openssl dgst -rmd160 global-5.7.2.tar.gz
RIPEMD160(global-5.7.2.tar.gz)= 65ce66729af7323ea1cc5f33cd4c691688bfddb3
%
 
これで必要な情報が揃ったので、それぞれをコピペして書き換えます。
checksums       md5 c927bcd92dff1c092d43f7d78911fc9c \
                sha1 0f594e1c10ab04db6dbd3e7bd6d6e16dd3c58ffa \
                rmd160 70862a2d79ec8fe97caa63416c1c945913fe0065
 
以上です。

念のため、全体のdiffも載せておきます。
% diff -u Portfile Portfile.20081029_orig
--- Portfile	2008-10-29 14:09:41.000000000 +0900
+++ Portfile.orig	2008-10-29 14:02:32.000000000 +0900
@@ -3,7 +3,7 @@
 PortSystem      1.0
 
 name            global
-version         5.7.2
+version         5.6.2
 categories      devel
 platforms       darwin
 maintainers     nomaintainer
@@ -22,9 +22,9 @@
 homepage        http://www.gnu.org/software/global/
 master_sites    gnu
 
-checksums       md5 d161aa02e458dca32357b8f1a3e72809 \
-                sha1 497a7ff7bae39ee5177862f19e364b26a7cd6f61 \
-                rmd160 65ce66729af7323ea1cc5f33cd4c691688bfddb3
+checksums       md5 c927bcd92dff1c092d43f7d78911fc9c \
+                sha1 0f594e1c10ab04db6dbd3e7bd6d6e16dd3c58ffa \
+                rmd160 70862a2d79ec8fe97caa63416c1c945913fe0065
 
 configure.args  --infodir=${prefix}/share/info \
                 --mandir=${prefix}/share/man
% 

3.インストール

最後に、修正したファイルによってパッケージをインストールします。
% sudo port install global
--->  Fetching global
--->  Verifying checksum(s) for global
--->  Extracting global
--->  Configuring global
--->  Building global with target all
--->  Staging global into destroot
--->  Installing global 5.7.2_0
--->  Activating global 5.7.2_0
--->  Cleaning global
% port installed | grep global
  global @5.7.2_0 (active)
% 
念のため、最後に「global --version」と実行して目的のバージョンに変わっていればOK。作業完了です。

補足

  • 依存関係のあるパッケージは、そのパッケージも新しいバージョンにしておかなければ正常に動作しない可能性があります。その場合依存するパッケージも全て変更してしまうか、おとなしく引き下がるかの判断が必要です。
  • 以上の作業はportコマンドの振る舞いを変えるため、問題が発生する可能性があります。オリジナルのPortfileはバックアップを取っておくなどして不測の事態に備えておいてください。
  • port updateした場合、対象のPortfileに変更があれば変更したPortfileも上書きされてしまいます。保存しておきたい場合はPortfileを別の場所にコピーしておいてください。

参考サイト


余談

実はこの作業、GNU global5.6.2を使っていてC++の名前空間(extern "C" {…}を含む)内のファイルをタグとして正しく取り扱えない(シンボルならOK)ということに気がつき、ひょっとしたら最新バージョンなら修正されているかも、という期待の下で行いました*1。ですが・・・5.7.2でもダメでした。残念。
(後日談:GNU globalのMLに入って、パッチと共にバグ報告したらCommitされました。次のバージョンではきっと直っています)
記事メニュー
目安箱バナー
注釈

*1 不具合自体は2007年に報告されているんですが・・・。