HAYAGUI

MacOS X 10.4 + PackageMakerでインストーラを作る

はじめに

MacOSXにソフトウェアをインストールする手段には、Finderからソフトウェア(のディレクトリ)をシステムにコピーする方法と、インストーラを使用する方法があります。インストーラには、MacOSX付属のインストーラとサードパーティ製などがあります。
今回は、MacOSX付属のPackageMakerで、 hello というアプリケーションを /usr/local/bin にインストールするインストーラを作ります。
参考:

helloを作る

インストールするアプリケーションは、helloworldを出力する hello です。
ibg4:~ kenz$ cat hello.c 
#include <stdio.h>
int main(void){
    printf("helloworld\n");
    return 0;
}

ibg4:~ kenz$ gcc -o hello hello.c 
ibg4:~ kenz$ ./hello 
helloworld
ibg4:~ kenz$ 

作業ディレクトリを作る

インストールするディレクトリをファイルを作ります。 PackageMakerで作るインストーラは、インストールするシステムの指定したディレクトリから、この作業ディレクトリの内容をコピーするような感じになります。

たとえば、/usr/local/bin にファイルをインストールしたい場合は、 PackageMakerで /usr を指定して、作業ディレクトリには local/bin を作ってもいいし、PackageMakerで /usr/local/bin を指定すれば、作業ディレクトリには、インストールするファイルさえ置けば良いことになります。

今回は、/usr 以下の /usr/lib や /usr/bin も想定して、 PackageMakerには /usr を指定し、作業ディレクトリには local/bin を置きます。

作業ディレクトリ名は work 。

ibg4:~ kenz$ pwd
/Users/kenz
ibg4:~ kenz$ mkdir work  
ibg4:~ kenz$ cd work/
ibg4:~/work kenz$ mkdir -p local/bin
ibg4:~/work kenz$ cp ~/hello local/bin/
ibg4:~/work kenz$ ls -laR
total 0
drwxr-xr-x    3 kenz  kenz   102 Jun  3 21:52 .
drwx------   39 kenz  kenz  1428 Jun  3 21:50 ..
drwxr-xr-x    3 kenz  kenz   102 Jun  3 21:52 local

./local:
total 0
drwxr-xr-x   3 kenz  kenz  102 Jun  3 21:52 .
drwxr-xr-x   3 kenz  kenz  102 Jun  3 21:52 ..
drwxr-xr-x   3 kenz  kenz  102 Jun  3 21:53 bin

./local/bin:
total 40
drwxr-xr-x   3 kenz  kenz    102 Jun  3 21:53 .
drwxr-xr-x   3 kenz  kenz    102 Jun  3 21:52 ..
-rwxr-xr-x   1 kenz  kenz  17748 Jun  3 21:53 hello
ibg4:~/work kenz$ tree
.
`-- local
    `-- bin
        `-- hello

2 directories, 1 file
ibg4:~/work kenz$ 

作業ディレクトリ内のディレクトリとファイルのオーナーとパーミッションは、以下のように実際にインストールするオーナーとパーミッションに設定してもいいですし、しなくてもいいです。しない時は、PackageMaker内で設定を行います。
ibg4:~/work kenz$ ls -la /usr/local/bin/ | head
total 37576
drwxr-xr-x   48 root  wheel      1632 Apr  7 10:24 .
drwxr-xr-x   14 root  wheel       476 Jun  3 21:45 ..
-rwxr-xr-x    1 root  wheel       114 Oct 15  2003 bdftops
-rwxr-xr-x    1 root  wheel       962 Oct 15  2003 dvipdf
-rwxr-xr-x    1 root  wheel       437 Oct 15  2003 eps2eps
-rwxr-xr-x    1 root  wheel      4645 Oct 15  2003 fixmswrd.pl
-rwxr-xr-x    1 root  wheel       122 Oct 15  2003 font2c
lrwxr-xr-x    1 root  wheel         5 Aug  3  2005 gs -> ./gs7
-rwxr-xr-x    1 root  wheel  16969032 Oct 30  2004 gs7
ibg4:~/work kenz$ 

PackageMaker

PackageMaker は、/Developer/Applications/Utilities/PackageMaker.app です。起動すると、以下のようなプロジェクト選択が表示されます。

機能の説明は、私がPackageMakerのヘルプを読んで解釈したものです。間違っていたらごめんなさい。

「Single Package Project」を選択します。

「Installer Interface」の「Title」に、パッケージのタイトルを設定します。
「Description」に、パッケージの説明を入力します。この文字列がどこに反映されるのかはわかりません。

「Show Installer Interface Editor」ボタンをクリックすると、 以降のユーザインターフェイス設定ができます。

「Background」で、背景の画像を設定できます。

上の画面の右に以下のようなプロパティが表示されます。

「Introduction」で、 Welcomeメッセージを設定できます。

「Read Me」で、 Readme を設定できます。

「License」で、 ライセンス文を設定できます。

  • 「Root」は、作業ディレクトリを設定します。
  • 「File Permissions...」ボタンをクリックすると、 インストールするディレクトリとファイルのオーナーとパーミッションを設定できます。
  • 「Compress Archive」は、インストールするファイルをインストーラ内部で圧縮する機能です。
  • 「Remove .DS_Store Files from Archive」は、圧縮する時に .DS_Store ファイルを削除する機能です。

ディレクトリとファイルのオーナーとパーミッションを、インストール先の設定にします。 この設定を保存する時は、管理者権限をもつユーザの認証が必要です。

  • 「Default Location」は、インストールする初期ディレクトリです。
  • 「Authentication」は、インストーラを実行できるユーザ権限を設定します。「None」と「Administrator」と「Root」を選択できます。/usr にインストールするには、「Root」が必要になります。
  • 「Post-Install Action」は、「インストールした後にどうする?」という設定です。「None」、「Recommended Restart」、「Required Logout」、「Required Restart」、「Required Shutdown」を選択できて、動作はメニューの通りです。
  • 「Relocatable」は、インストールするディレクトリをユーザが選択できる機能です。
  • 「Root Volume Only」は、インストールするハードディスクを現在の起動中のハードディスクだけに制限する機能です。システムに直接関係あるファイルをインストールする時は、チェック有りです。チェック有りにすると、こんな感じに警告を出します。

  • 「Follow Symbolic Links」は、インストール先がシンボリックリンクであった時に、そのまま継続する(チェック有り)、上書きする(チェックなし)を設定します。
  • 「Overwrite Directory Permissions」は、インストール先のディレクトリやファイルのパーミッションを上書きするかしないかを設定します。
  • 「Allow Revert To Previous Version」は、インストールするファイルより新しいバージョンのファイルがインストール先にある時、インストールするかしないかを設定します。
  • 「Update Installed Languages Only」は、現在インストールしている言語だけをアップデートするかしないかを設定します。

「Script」には、インストール中に起動する以下のスクリプトを保存しているディレクトリを設定します。以下のようなスクリプトを動かすことができます。

  • preflight : インストールプロセスの前に実行するスクリプト
  • postflight : インストールプロセスの後に実行するスクリプト
  • preinstall : ひとつのパッケージをインストールする前に実行するスクリプト。アップグレードの時は実行しない。
  • postinstall : ひとつのパッケージをインストールした後に実行するスクリプト。アップグレードの時は実行しない。
  • preupgrade : ひとつのパッケージをアップグレードする前に実行するスクリプト。インストールの時は実行しない。
  • posupgrade : ひとつのパッケージをアップグレードした後に実行するスクリプト。インストールの時は実行しない。

  • 「Identifier」は、ユニークなパッケージ名を設定します。
  • 「Get Info String」は、Copyrightなどのパッケージ情報。
  • 「Version」は、インストールバージョンを設定します。この項目は「アップグレード/ダウングレード」を判断する重要な項目です。

インストーラを作るには、「メニュー」の「Project」「Build...」を選択します。
インストーラのファイル名を設定します。

ディレクトリのパーミッションを確認します。その後、ユーザ認証を入力します。

Buildが終わるとlogを表示します。

Buildしたファイルの情報をFinderから見ます。
ここの「バージョン」は、「Get Info String」で設定した情報です。

これで出来上がり。

作ったインストーラの中身を見る

作ったインストーラをFinder 上から見ると一つのファイルですが、 Terminalから見るとディレクトリです。 こんな感じ。
ibg4:~ kenz$ cd hello.pkg/
ibg4:~/hello.pkg kenz$ tree
.
`-- Contents
    |-- Archive.bom
    |-- Archive.pax.gz
    |-- Info.plist
    |-- PkgInfo
    `-- Resources
        |-- BundleVersions.plist
        |-- English.lproj
        |   |-- Description.plist
        |   `-- hello.info
        |-- hello.bom -> ../Archive.bom
        |-- hello.pax.gz -> ../Archive.pax.gz
        |-- hello.sizes
        `-- package_version

3 directories, 11 files
ibg4:~/hello.pkg kenz$ 
インストールするファイルは、Archive.pax.gz にあります。

Archive.pax.gz を gunzip して pax で展開します。

ibg4:~/hello.pkg kenz$ cp Contents/Archive.pax.gz ~/
ibg4:~/hello.pkg kenz$ cd ..
ibg4:~ kenz$ 
ibg4:~ kenz$ gunzip -dc Archive.pax.gz > Archive.pax
ibg4:~ kenz$ ls -la Archive.pax
-rw-r--r--   1 kenz  kenz  18691 Jun  3 22:11 Archive.pax
ibg4:~ kenz$ file Archive.pax
Archive.pax: ASCII cpio archive (pre-SVR4 or odc)
ibg4:~ kenz$ 
ibg4:~ kenz$ pax -r -v -f Archive.pax
.
./local
./local/bin
./local/bin/hello
pax: cpio vol 1, 4 files, 18691 bytes read, 0 bytes written.
ibg4:~ kenz$ 

ibg4:~ kenz$ ls -laR local 
total 0
drwxr-xr-x    3 kenz  kenz   102 Jun  3 21:52 .
drwx------   44 kenz  kenz  1598 Jun  3 22:04 ..
drwxr-xr-x    3 kenz  kenz   102 Jun  3 21:53 bin

local/bin:
total 40
drwxr-xr-x   3 kenz  kenz    102 Jun  3 21:53 .
drwxr-xr-x   3 kenz  kenz    102 Jun  3 21:52 ..
-rwxr-xr-x   1 kenz  kenz  17748 Jun  3 21:53 hello
ibg4:~ kenz$ 



インストールしてみる

作ったインストーラを起動します。

インストール先を選択します。

インストールを確認します。インストール途中でユーザ認証を表示します。

あっというまに終わる。

完了。

オーナー、パーミッション、動くことを確認。

ibg4:~ kenz$ cd /usr/local/bin/
ibg4:/usr/local/bin kenz$ ls -la hello 
-rwxrwxr-x   1 root  wheel  17748 Jun  3 21:53 hello
ibg4:/usr/local/bin kenz$ 
ibg4:/usr/local/bin kenz$ ./hello 
helloworld
ibg4:/usr/local/bin kenz$ 

インストール情報を消す

一度インストーラでインストールした状態で再度インストールしようとすると、以下のように「アップグレード」と表示されます。

これはシステムにインストールした情報が保存されているからです。
インストールのテストを何回もするのであれば、以下のディレクトリを削除することでOK.

ibg4:/usr/local/bin kenz$ ls -la /Library/Receipts/hello.pkg/
total 0
drwxrwxr-x     3 root  admin   102 Jun  3 22:36 .
drwxrwxr-x   137 root  admin  4658 Jun  3 22:36 ..
drwxrwxr-x     6 root  admin   204 Jun  3 22:36 Contents
ibg4:/usr/local/bin kenz$ 
ibg4:/usr/local/bin kenz$ sudo rm -Rf /Library/Receipts/hello.pkg 
Password:
ibg4:/usr/local/bin kenz$ 


戻る



(C)1999 - 2006 Kenji Ito All rights reserved.