*11http://akenox.dip.jp/index.php?Translations%2FMac%20OS%20X%20Key%20Bindingsに詳しい解説がある。
*12Lionからは「Save As. . .」が「Duplicate」などに置き換わってしまったため、コードC.1の設定をしてもC-x C-wは動作しません。
98
付録 D configure と Make
macOSやLinux環境でソフトウェアを導入する時、インストールの方法は主に3つあります。1つ目は、C.6で説明
したようなパッケージ管理ソフト*1を使う方法す。2つ目は、既にコンパイル済みでバイナリ配布されているソフトを 導入する方法です。例えば、KeyRemap4MacBookをインストーラを使ってインストールしたのがこれに当たります。
また、ROOTを入れる場合でもバイナリ配布されているものを使うことが可能です。3つ目は、ソースコードの配布 されているソフトウェアを自分でコンパイル(compile)する*2方法です。これは2.1でROOTの導入として説明しま した。
自分でソフトウェアをソースコードからコンパイルする場合、標準的なやり方が存在します。また、研究で通常使う ソフトウェアの多くがこの標準的な方法に則して作成されています。そのためここで説明する方法を覚えておけば、多 くのソフトウェアを自分で簡単にインストールできるようになります。
このやり方を覚えるために、「GNU Hello*3」と呼ばれるソフトウェアを試しにインストールしてみましょう。この
「GNU Hello」は標準的な方法を学ぶ上で最適なもので、インストールしても実用性はありません。
まず、次のコマンドでhttp://ftp.gnu.org/gnu/hello/から最新版のhello-2.8.tar.gzを落としてき て展開します。展開されたディレクトリに移動してlsで中身を見てみましょう。
$ curl -O http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 681k 100 681k 0 0 150k 0 0:00:04 0:00:04 --:--:-- 166k
$ tar zxf hello-2.8.tar.gz
$ cd hello-2.8
$ ls
ABOUT-NLS INSTALL THANKS configure.ac man
AUTHORS Makefile.am TODO contrib po
COPYING Makefile.in aclocal.m4 doc src
ChangeLog NEWS build-aux lib tests
ChangeLog.O README config.in m4 GNUmakefile README-release configure maint.mk
ここで重要なのは、README、INSTALL、configureの3つです。READMEは、そのソフトウェアに関する全般 的な説明が書かれています。INSTALLには、そのソフトウェアのインストール方法が書かれています。lessコマン ドなどで、試しに中身を読んでみて下さい。
$ less README
$ less INSTALL
*1macOSではMacPorts、Fink、Homebrewなど、LinuxではYumやAPTなど。
*2ビルド(build)するとも言います。
*3http://www.gnu.org/software/hello/
付録D configureとMake 99
configureはシェルスクリプトで、そのソフトウェアをコンパイルするときに必要なライブラリやコマンドが存在 するかどうか、存在するパスはどこか、OSの環境は何かを自動的に調べて必要な設定をしてくれます。また、必要に 応じてユーザが様々なオプションを指定することができます。どのようなオプションがあるかは、次のようにヘルプを 表示することで読むことができます。
$ ./configure --help
様々なオプションが表示されますが、このうち最も頻繁に使われるのがインストール先の指定のオプション --prefixです。次のようにconfigureを実行することで、helloコマンドを/usr/local/binにインストー ルし、またマニュアルを/usr/local/share/man/man1にインストールします。もし/usr/localの代わりに他 の場所をしていすれば、これらのファイルは指定した場所の下にインストールされます。
$ ./configure --prefix=/usr/local
configureが問題なく実行されれば、Makefileというファイルが新たに生成されているはずです。このファイ ルの中には、そのソフトウェアをどのような手順でコンパイルすれば良いかが全て書かれています。ユーザはどのよう なソースコードがあるのかなどを気にする必要はありません。このMakefileの手順の通りに自動的にソフトウェア をコンパイルするには、以下のコマンドを打つだけです。
$ make -j 4
makeコマンドがMakefileの中身を自動的に調べ、そこに書かれている手順を追ってコンパイルを行います。-j 4のオプションは、使っているCPU能力を最大限に引き出すためのものです。この場合、4コアのCPUを全て使って くれます。
これで必要なファイルが全て生成されたので、最後にインストール作業を行います。通常は/usr/localにインス トールする場合に管理者権限が必要なので、次のコマンドを実行します。
$ sudo make install Password:
これで、/usr/local/bin/helloなどが配置されたはずです。では、確認のためhelloを実行しましょう。
$ hello Hello, world!
どのようなオプションを渡せるかは、--helpや-hをつけて確認します。
$ hello -h
Usage: hello [OPTION]...
Print a friendly, customizable greeting.
-h, --help display this help and exit
-v, --version display version information and exit -t, --traditional use traditional greeting format -n, --next-generation use next-generation greeting format -g, --greeting=TEXT use TEXT as the greeting message Report bugs to: [email protected]
GNU Hello home page: <http://www.gnu.org/software/hello/>
General help using GNU software: <http://www.gnu.org/gethelp/>
付録D configureとMake 100 またhelloコマンドのマニュアルを見るにはmanコマンドを使います。
$ man hello
101
付録 E 本文で登場した ROOT スクリプトの PyROOT 版
ここでは、本文中で登場したROOTスクリプトをPyROOTで書き換えた例を掲載します。foo.CというROOTス クリプトであれば、foo.pyというPyROOTスクリプトにしてあります。
コードE.1 population.py 1 import ROOT
2
3 def population():
4 global hist, can, leg
5 fin = open(’population.dat’) 6
7 kBinsN = 21
8 hist = []
9
10 names = fin.readline().split(’\t’) 11
12 for i in range(len(names)):
13 hist.append(ROOT.TH1D(names[i], names[i], kBinsN, 0, 105)) 14
15 for i, line in enumerate(fin.readlines()):
16 data = line.split(’\t’) 17 for j in range(len(hist)):
18 hist[j].SetBinContent(i + 1, float(data[j])) 19
20 can = ROOT.TCanvas(’can’, ’histogram’)
21 can.DrawFrame(0, 0, 105, 10, ’Population by Age;Age;Population per 5-year Generation (%/5 year)’)
22
23 leg = ROOT.TLegend(0.65, 0.7, 0.85, 0.85) 24 leg.SetFillStyle(0)
25
26 kColor = (ROOT.kGray + 1, ROOT.kRed - 4, ROOT.kBlue - 4) 27
28 for i in range(len(names)):
29 hist[i].Scale(100./hist[i].GetEffectiveEntries()) 30 hist[i].SetLineColor(kColor[i])
31 hist[i].SetFillColor(kColor[i]) 32 hist[i].SetBarWidth(0.28)
33 hist[i].SetBarOffset(0.08 + 0.28*i) 34 hist[i].Draw(’bar same’)
付録E 本文で登場したROOTスクリプトのPyROOT版 102
35 leg.AddEntry(hist[i], hist[i].GetTitle(), ’f’) 36
37 leg.Draw()