アーキテクチャごとに設定を振り分ける
同じOSを使っている場合でも、アーキテクチャが異なっていると指定するオプションが違ってくるコマンドがある。コンパイラで指定するオプションなどがそれだ。そういった場合はOSごとに設定を振り分けるのではなくて、アーキテクチャごとに設定を振り分ける。
プロンプト1.1 gccでアーキテクチャオプションを表示 - FreeBSD-current on Core 2 Duo
% gcc -march=[ここでタブキーを押す]
athlon athlon-xp i486 k6-3 pentium-m pentium4 winchip2
athlon-4 athlon64 i586 k8 pentium-mmx pentium4m
athlon-fx c3 i686 nocona pentium2 pentiumpro
athlon-mp c3-2 k6 opteron pentium3 prescott
athlon-tbird i386 k6-2 pentium pentium3m winchip-c6
プロンプト1.2 gccでCPUオプションを表示 - Mac OS X on PowerPC
% gcc -mcpu=[ここでタブキーを押す]
403 501 603 604 common power powerpc rios1 rios2 rsc
この場合の設定振り分けには、MACHTYPE変数を使うと便利だ。
gccの設定を参考にしてみよう
zshのgccコマンド補間設定ファイルを見てみると、リスト2.1のような処理ではじまっているところがある。なお、ここで参考にしたのはzsh 4.3.4である。MACHTYPE変数を使って処理を割り振っている感じがするだろう。
リスト2.1 zsh/4.3.4/functions/Completion/Unix/_gcc - アーキテクチャごとに設定が分岐している
case $MACHTYPE in
m68*)
args=(
-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881
-mbitfield -mc68000 -mc68020 -mfpa -mnobitfield
-mrtd -mshort -msoft-float
)
;;
vax)
args=(
-mg -mgnu -munix
)
;;
さらに、ここを抜きだして整理するとリスト2.2のようになる。
リスト2.2 アーキテクチャごとに分離している部分を整理するとこうなる
case $MACHTYPE in
m68*)
引数にオプションを追加
;;
vax)
引数にオプションを追加
;;
c[1234]*)
引数にオプションを追加
;;
amd290?0)
引数にオプションを追加
;;
arm)
引数にオプションを追加
;;
m88k)
引数にオプションを追加
;;
rs6000|powerpc*)
引数にオプションを追加
;;
romp)
引数にオプションを追加
;;
mips*)
引数にオプションを追加
;;
i[3456]86|x86_64)
引数にオプションを追加
;;
hppa*)
引数にオプションを追加
;;
i960)
引数にオプションを追加
;;
sparc)
引数にオプションを追加
;;
alpha*)
引数にオプションを追加
;;
clipper)
引数にオプションを追加
;;
h8/300)
引数にオプションを追加
;;
esac
果たしてvaxアーキテクチャでzshを使う漢たちがどれだけいるのか…それは分からない(エミュレータの開発で使ったりするんだろうか)。しかし、これくらいは振り分けが効くということは分かる。32ビット/64ビットアーキテクチャという環境の違いへの対応といった用途では、なかなか便利に使える。同じMac OS Xを使うにしても、Core 2 Duoを搭載した最近のマシンとPowerPCを使った以前のマシンを混在して使っているならば、やっぱり同じような処理が必要になる。
ただし、Mac OS Xを使っている漢たちは、若干注意してほしい。デフォルトでインストールされているzshはバージョンが古いため、Core 2 Duo搭載マシンでも、アーキテクチャはPowerPCと表示される。そのため、最新のzshをダウンロードしてきて、自分でビルドし、インストールして使うことを勧める。