2010年10月10日日曜日

(Linux等の)シェルスクリプトを Mac の Finder からダブルクリックで実行するには

少し躓いたので、メモメモ。まとめると次の3点が要点となる。

  1. スクリプトの拡張子を .command にする
  2. ターミナルから、chmod で実行権限を与える
  3. スクリプトの Shebang のすぐ下に cd `dirname $0` を入れる (シングルではなくバッククオートであることに注意)

詳細について。まず、シェルスクリプトの書き方から。これは Linux と同様 Shebang ではじめ、通常通りコードを書いていく。

#!/bin/sh

[ここからコード]

このスクリプトファイルをダブルクリックした時にターミナルを起動するように設定する必要がある。Mac 上で拡張子の関連付けを行えばよいことになるが、10.6 (Snow Leopard) では、デフォルトで ".command" という拡張子がターミナルに関連付けられいることを確認した。"install.command" のような感じで拡張子をつけて保存するとよい。(もちろん別の拡張子を利用したい場合はその拡張子をターミナルに関連付けておく)

また、Linux と同様にスクリプトには実行権限を付加しておく必要がある。これは Mac 標準の Finder からは設定できないようなので、ターミナルから実行権限を付加する。例えばコードが install.command だった場合、

chmod +x install.command

もちろん、ファイルがホームディレクトリに無い場合は、該当のディレクトリに移動するか、フルパス指定で実行。

ただし、Mac ではダブルクリックで起動した場合、ホームディレクトリをカレントディレクトリとしてコードが実行されてしまう。例えば、ユーザー名が hoge、コードが /Users/hoge/abc/install.command においてある場合、Mac は自動的にホームディレクトリでコードを実行してしまう(下の太字の部分が Mac が実際に実行しているコマンド)。

Last login Sun Oct 10 22:54:02 on Console
pcname:~ hoge$ /Users/hoge/abc/install.command ; exit;
[コマンド実行結果]
logout

[プロセスが完了しました]

コード内で相対パスを利用している場合、コードの置いてあるディレクトリにカレントディレクトリを移動させないと不具合が出る場合がある。これを行うためには、例えば "cd `dirname $0`" というコードをシェルスクリプトの冒頭に入れておけばいい(シングルではなくバッククオートであることに注意)。これは、コードのパスからディレクトリを dirname で取得し、その結果を cd に渡すことでカレントディレクトリを適切なところに移動するコードである。

結局、スクリプトは次のように書けばよいことになる。

#!/bin/sh
cd `dirname $0`

[ここからコード]

2010年10月1日金曜日

Ubuntu 10.04 で x86 向け Android 2.2 (froyo-x86) のビルド(コンパイル)と iso イメージの構築

今回は android-x86.org を参考にして、Android を ubuntu 10.04 でコンパイルし、インストールディスクを作成してみます。ただし、記事のままだとマウスが動かないなどの状態だったので、実用的に使えるレベルで動作させるには、このブログ記事の内容に加えてカーネルをカスタマイズしていく必要がありそうです。

コンパイルを行う環境として、ハードディスクドライブは20GB、メモリとしては最低でも1GBぐらい必要です。特に VMware や VirtualBox 等仮想環境でコンパイルする場合は割り当てるリソース量を多めにしてください。

まず、Java について躓いたのでメモ。Ubuntu 10.04 では、OpenJDK を標準化したいらしく、sun による実装がパッケージマネージャに含まれていないらしい。まず、Java のリポジトリを追加する。次の % までが1行ですので、お気をつけ下さい(出力は書いていません)。

% sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
% sudo apt-get update

ちなみに、Java 1.5 JDK でのコンパイル環境を想定しているらしいが、最近最新版の 1.6 でもコンパイルできるようにパッチがあてられたらしいので問題なし。

コンパイル等に必要なパッケージをインストール。

% sudo apt-get -y install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev valgrind g++

ソースコードの管理は git で行われているが、Android 用にこれをラッピングする repo というスクリプトがあるのでそれを ~bin にインストールし、実行権限とパスを設定。

% mkdir ~bin
% curl http://android.git.kernel.org/repo >~/bin/repo
% chmod a+x ~/bin/repo
% export PATH=$PATH:~/bin

JAVA_HOME を設定する必要があるようなので、設定。

% export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.**.**

(Java のバージョンは変わるので、各自調整してください。Ubuntu のデフォルトのシェルである bash の場合、java-6-sun-1.6. まで入力したら[TAB]キーでその後ろを補完してくれます)

ホームディレクトリの直下に android-x86 というディレクトリを作成し、そこにリポジトリからソースコードをダウンロード。

% mkdir ~android-x86
% cd ~android-x86
% repo init -u git://git.android-x86.org/manifest.git -b froyo-x86
% repo sync

repo init の行で、名前とメールアドレスを聞かれるので、入力する。その次の repo sync を実行した時点で、ソースコードのダウンロードが始まる。結構時間かかります。ちなみに、執筆時では実際にダウンロードした全容量は 4.6 GB でした。

ダウンロードが完了したら、コンパイルして iso イメージを作成。USB イメージも作成できるようですが、今回はより簡単な Live CD を作成してみます。Live CD を作成するには、make のターゲットを iso_img とします。OSを構築するので、このコンパイル作業には数時間かかります。

% make iso_img TARGET_PRODUCT=generic_x86

以上の作業で、~/android/out/target/product/generic_x86/generic_x86.iso が作成されているはずです。これが Live CD 本体ですので、このファイルを CD に焼き、CD からブートしてみてください。BIOS で CD から起動できる設定にするのをお忘れなく。なお、Live ディスクからハードディスクへのインストールも可能のようです。

なお、USB イメージの作成だけでなく、iso データを圧縮するかオプションで設定したり、マルチプロセッサによる並列化等ができるようですが、これについては公式ページを参照してください(英語)。

コンパイルやインストールはできましたが、やはり一部カスタマイズしないとマウスなどが使えなかったりしました。もう少し調べる必要がありそうです。

参考ページ:

  1. 公式ページ(英語)
  2. ITpro 旧バージョン cupcake のインストール手順