Red Hat Enterprise Linux 7 開発者ガイド

Red Hat Enterprise Linux 7
開発者ガイド
Red Hat Enterprise Linux 7 のアプリケーション開発ツールのご紹介
Red Hat Subject Matter ExpertsDave Brolley
William Cohen
Roland Grunberg
Karsten Hopp
Jakub Jelinek
Benjamin Kosnik
Chris Moller
Alex Kurtakov
Charley Wang
Kent Sebastian
Aldy Hernandez
Jeff Johnston
Phil Muldoon
Development Community
Red Hat Enterprise Linux 7 開発者ガイド
Red Hat Enterprise Linux 7 のアプリケーション開発ツールのご紹介
Dave Bro lley
Red Hat Engineering ツール開発
bro [email protected] m
プロファイリング
William Co hen
Red Hat Engineering ツール開発
wco [email protected] m
プロファイリング
Ro land Grunberg
Red Hat Engineering ツール開発
[email protected] m
Eclipse および Eclipse プラグイン
Aldy Hernandez
Red Hat Engineering ツール開発
[email protected] m
コンパイルおよびビルド
Karsten Ho pp
Base Operating System コアサービス - BRNO
[email protected] m
コンパイル
Jakub Jelinek
Red Hat Engineering ツール開発
[email protected] m
プロファイリング
Jeff Jo hnsto n
Red Hat Engineering ツール開発
jjo [email protected] m
Eclipse および Eclipse プラグイン
Benjamin Ko snik
Red Hat Engineering ツール開発
bko [email protected] m
ライブラリおよびランタイムのサポート
Chris Mo ller
Red Hat Engineering ツール開発
cmo [email protected] m
デバッグ
Phil Muldo o n
Red Hat Engineering ツール開発
pmuldo o [email protected] m
デバッグ
Alex Kurtako v
Red Hat Engineering ツール開発
akurtako @redhat.co m
Eclipse および Eclipse プラグイン
Charley Wang
Red Hat Engineering ツール開発
[email protected] m
Eclipse および Eclipse プラグイン
Kent Sebastian
[email protected] m
プロファイリング
Red Hat Subject Matter Experts
Develo pment Co mmunity
編集者
Jacquelynn East
Engineering コンテンツサービス
[email protected] m
Do n Do mingo
Red Hat Engineering コンテンツサービス
ddo mingo @redhat.co m
法律上の通知
Co pyright © 20 12 Red Hat, Inc. and o thers.
This do cument is licensed by Red Hat under the Creative Co mmo ns Attributio n-ShareAlike 3.0
Unpo rted License. If yo u distribute this do cument, o r a mo dified versio n o f it, yo u must pro vide
attributio n to Red Hat, Inc. and pro vide a link to the o riginal. If the do cument is mo dified, all Red
Hat trademarks must be remo ved.
Red Hat, as the licenso r o f this do cument, waives the right to enfo rce, and agrees no t to assert,
Sectio n 4 d o f CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shado wman lo go , JBo ss, MetaMatrix, Fedo ra, the Infinity
Lo go , and RHCE are trademarks o f Red Hat, Inc., registered in the United States and o ther
co untries.
Linux ® is the registered trademark o f Linus To rvalds in the United States and o ther co untries.
Java ® is a registered trademark o f Oracle and/o r its affiliates.
XFS ® is a trademark o f Silico n Graphics Internatio nal Co rp. o r its subsidiaries in the United
States and/o r o ther co untries.
MySQL ® is a registered trademark o f MySQL AB in the United States, the Euro pean Unio n and
o ther co untries.
No de.js ® is an o fficial trademark o f Jo yent. Red Hat So ftware Co llectio ns is no t fo rmally
related to o r endo rsed by the o fficial Jo yent No de.js o pen so urce o r co mmercial pro ject.
The OpenStack ® Wo rd Mark and OpenStack Lo go are either registered trademarks/service
marks o r trademarks/service marks o f the OpenStack Fo undatio n, in the United States and o ther
co untries and are used with the OpenStack Fo undatio n's permissio n. We are no t affiliated with,
endo rsed o r spo nso red by the OpenStack Fo undatio n, o r the OpenStack co mmunity.
All o ther trademarks are the pro perty o f their respective o wners.
概要
本書では、Red Hat Enterprise Linux 7 をアプリケーション開発の理想的なエンタープライズプ
ラットフォームとする様々な機能やユーティリティーを説明します。ここでは、エンドツーエン
ドの総合開発環境 (IDE) として Eclipse にフォーカスしますが、Eclipse 外のコマンドラインツー
ルや他のユーティリティーも説明されています。
目次
目次
. . 1. 章
⁠第
. . Eclipse
. . . . . . . の開発環境
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. . . . . . . . . .
⁠1.1. Ec lip s e プロジェクトの開始
3
⁠1.2. Ec lip s e ユーザーインターフェイス
6
⁠1.3. Ec lip s e での C/C+ + ソースコードの編集
17
⁠1.4. Ec lip s e での Java ソースコードの編集
21
⁠1.5. Ec lip s e RPM ビルディング
22
⁠1.6 . Ec lip s e のドキュメンテーション
23
. . 2. 章
⁠第
. . 協同作業
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. 6. . . . . . . . . .
⁠2 .1. Co nc urrent Vers io ns Sys tem (CVS)
26
⁠2 .2. Ap ac he Sub vers io n (SVN)
28
⁠2 .3. G it
34
. . 3章
⁠第
. . . ライブラリおよびランタイムのサポート
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. 6. . . . . . . . . .
⁠3 .1. バージョン情報
⁠3 .2. 互換性
⁠3 .3. ライブラリおよびランタイムの詳細
46
47
47
. . 4. 章
⁠第
. . コンパイルおよびビルド
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. 5. . . . . . . . . .
⁠4 .1. G NU コンパイラーコレクション (G CC)
75
⁠4 .2. 分散コンパイル
99
⁠4 .3. Auto to o ls
99
⁠4 .4. Ec lip s e Built-in Sp ec file Ed ito r
10 1
⁠4 .5. Ec lip s e の CDT
10 1
⁠4 .6 . b uild -id バイナリの一意の ID
10 3
⁠4 .7. So ftware Co llec tio ns および s c l-utils
10 3
. . 5章
⁠第
. . . デバッグ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. 0. 5. . . . . . . . . .
⁠5 .1. ELF の実行可能バイナリ
10 5
⁠5 .2. Deb ug info パッケージのインストール
10 6
⁠5 .3. G DB
10 9
⁠5 .4. Variab le Trac king at As s ig nments
121
⁠5 .5. Pytho n Pretty-Printer
122
⁠5 .6 . Ec lip s e による C/C+ + アプリケーションのデバッグ
124
. . 6. 章
⁠第
. . プロファイル
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1.2. 6. . . . . . . . . .
⁠6 .1. Valg rind
126
⁠6 .2. O Pro file
129
⁠6 .3. Sys temTap
132
⁠6 .4. Perfo rmanc e Co unters fo r Linux (PCL) ツールおよび p erf
136
⁠6 .5. ftrac e
139
. . 7. 章
⁠第
. . Red
. . . . Hat
. . . . Developer
.........T
. .oolset
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1.4. 1. . . . . . . . . .
⁠7 .1. Red Hat Develo p er To o ls et の機能
141
⁠7 .2. b inutils の変更点
142
⁠7 .3. プラットフォームの互換性
147
⁠7 .4. Red Hat Develo p er To o ls et の参考資料
147
. . 8. 章
⁠第
. . Red
. . . . Hat
. . . . Soft
. . . .ware
. . . . Collect
. . . . . . .ions
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1.4. 8. . . . . . . . . .
⁠8 .1. Red Hat So ftware Co llec tio ns の機能
148
⁠8 .2. プラットフォームの互換性
149
⁠8 .3. Red Hat So ftware Co llec tio ns の使用
149
⁠8 .4. Red Hat So ftware Co llec tio ns を使用するアプリケーションの導入
150
⁠8 .5. その他の情報
150
1
開発者ガイド
⁠8 .5. その他の情報
150
. . 9. 章
⁠第
. . ドキュメンテーションツール
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. 51
...........
⁠9 .1. Pub lic an
151
⁠9 .2. Do xyg en
156
. .録
⁠付
. .A. 付録
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1.6. 4. . . . . . . . . .
⁠A .1. mallo p t
16 4
. .録
⁠付
. .B. .改訂履歴
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1.6. 6. . . . . . . . . .
. .引
⁠索
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1.6. 7. . . . . . . . . .
2
⁠第1 章 Eclipse の開発環境
第1章 Eclipse の開発環境
Eclipse は、開発プロセスの各フェーズにツールを提供する強力な開発環境です。容易に使用できるように
するために完全に設定済の単独ユーザーインターフェイスに統合されています。そして各種方法で拡張を可
能にするプラグ可能なアーキテクチャを特徴としています。
Eclipse は幅広い異なるツールを統一された環境に統合して豊かな開発体験を作り出します。例えば、
Valgrind プラグインでは、プログラマーは Eclipse ユーザーインターフェイスで (通常はコマンドラインで
実行される) メモリプロファイリングを実行できます。この機能は、Eclipse のみというわけではありませ
ん。
Eclipse はグラフィカルなアプリケーションなので、コマンドラインインターフェイスになじめず難しいと
感じていた開発者には歓迎されるものとなります。また、Eclipse のビルトインの ヘルプ システムは、各統
合機能およびツールに幅広いドキュメンテーションを提供します。これにより、新しい開発者が使い方に慣
れるまでに必要な時間が大幅に短縮されます。
従来型の (つまり、ほとんどコマンドラインベースの) Linux ツールスイート (g cc や g d b など) と Eclipse
は別個の 2 つのアプローチをプログラミングに提供します。ほとんどの従来型 Linux ツールは、Eclipse
ベースのものよりはるかに柔軟性があり繊細で (トータルでは) 強力なものです。一方でこれらの従来型
Linux ツールは熟達するのが難しく、ほとんどのプログラマーやプロジェクトが必要とする以上の機能を提
供します。対照的に Eclipse は、これらの機能の一部を犠牲にして統合型環境を優先します。これは、単一
のグラフィカルなインターフェイスでアクセス可能なツールを好むユーザーには適しています。
1.1. Eclipse プロジェクトの開始
以下のコマンドで Eclipse をインストールします。
# yum i nstal l ecl i pse
インストール後に Eclipse を開始するには、手動で /usr/bi n/ecl i pse を実行するか、作成されたシス
テムメニューを使用します。
Eclipse は、指定された ワークスペース にすべてのプロジェクトおよびユーザーファイルを保存します。
複数のワークスペースを用意して、切り替えることも可能です。ただし、Eclipse はその時点でアクティブ
なワークスペースからしかプロジェクトを読み込むことができません。アクティブなワークスペースの間で
切り替えるには、File > Swit ch Wo rksp ace > /path/to/workspace に進みます。また、Wo rksp ace
Lau n ch er ウィザードを使って新たなワークスペースを追加することもできます。このウィザードを開く
には、File > Swit ch Wo rksp ace > O t h er に進みます。
3
開発者ガイド
図1.1 Wo rksp ace Lau n ch er
ワークスペース設定の詳細情報は、『Workbench User Guide』 (H elp C o n t en t s) の 『Reference』 >
『Preferences』 > 『Workspace』 を参照してください。
プロジェクトに必要な Eclipse メタファイルがプロジェクトに含まれている場合は、Eclipse に直接イン
ポートすることができます。Eclipse はこれらのファイルを使って実装するパースペクティブ、ツール、そ
の他のユーザーインターフェイス設定の種類を決定します。
このため、Eclipse で使用されたことのないプロジェクトをインポートしようとする際は、Imp o rt ウィ
ザードではなく N ew Pro ject ウィザードを使用する必要があります。これによりプロジェクトに必要な
Eclipse メタファイルが作成され、プロジェクトをコミットする際にこれらのファイルを含めることもでき
ます。
4
⁠第1 章 Eclipse の開発環境
図1.2 N ew Pro ject ウィザード
Imp o rt ウィザードは、Eclipse で作成もしくは以前に編集されたほとんどのプロジェクトに適していま
す。これらのプロジェクトには、必要な Eclipse メタファイルが含まれています。
5
開発者ガイド
図1.3 Imp o rt ウィザード
1.2. Eclipse ユーザーインターフェイス
図1.4「Eclipse ユーザーインターフェイス (デフォルト)」 内のユーザーインターフェイス全体は、Eclipse
ワークベンチ と呼ばれています。通常これは、コードのEd it o r、Pro ject Exp lo rer ウィンドウ、いくつ
かのビューで構成されます。Eclipse ワークベンチ内のすべての要素は設定可能で、『Workbench User
Guide』 (H elp C o n t en t s) に詳細があります。ユーザーインターフェイスのカスタマイズに関する概要
は、「パースペクティブのカスタマイズ」 を参照してください。
Eclipse には異なる パースペクティブ の機能があります。パースペクティブは、ビューとエディターの
セットで、特定の種類のタスクやプロジェクトに有用なものです。Eclipse ワークベンチには 1 つ以上の
パースペクティブを入れることができます。図1.4「Eclipse ユーザーインターフェイス (デフォルト)」 は
C/C++ 向けのデフォルトのパースペクティブを表示しています。
また Eclipse は多くの機能をいくつかのクラスに分け、個別のメニューアイテム 内にこれらを格納しま
す。例えば、プロジェクト メニューにはプロジェクトのコンパイル/構築関連の機能が格納されます。ウィ
ンドウ メニューにはパースペクティブやメニューアイテム、その他のユーザーインターフェイス要素を作
成/カスタマイズするオプションが格納されます。各メインメニューの簡単な概要については、『C/C++
D evelopment User Guide』 の R ef eren ce> → C /C + + Men u b ar か 『Java D evelopment User
Guide』 の R ef eren ce → Men u s an d Act io n s を参照してください。
6
⁠第1 章 Eclipse の開発環境
以下のセクションでは、Eclipse 統合開発環境 (ID E) のデフォルトのユーザーインターフェイスで表示され
る異なる要素の高レベルな概要を説明します。
Eclipse ワークベンチは、開発プロセスの各フェーズで必須の数多くの機能やツールにおけるユーザーイン
ターフェイスを提供します。このセクションでは、Eclipse の主要ユーザーインターフェイスの概要を説明
します。
図1.4 Eclip se ユーザーインターフェイス ( デフォルト)
図1.4「Eclipse ユーザーインターフェイス (デフォルト)」 では C/C++ プロジェクト用のデフォルトのワー
クベンチが示されています。ワークベンチ内で利用可能なパースペクティブの切り替えを行うに
は、C trl +F8 を押します。パースペクティブのカスタマイズに関するヒントについては、
「パースペク
ティブのカスタマイズ」 を参照してください。以下に続く図は、デフォルトの C/C++ パースペクティブで
表示される基本的な要素です。
7
開発者ガイド
図1.5 Eclip se Ed it o r
Ed it o r はソースファイルの書き込みおよび編集に使用します。Eclipse はほとんどのタイプのソース言語
で、適正な言語エディターを自動検出し読み込みます (例えば、. c で終わっているファイルには C Editor
)。Ed i to r を設定するには、Win d o w > Pref eren ces > language ( 例えば、Java、C++) > C o d e
St yle に移動します。
図1.6 Pro ject Exp lo rer
Pro ject Exp lo rer View は、全プロジェクトリソースの階層ビューを提供します (バイナリ、ソースファ
イルなど)。このビューからファイルを開いたり、削除したり、編集したりすることができます。
Pro ject Exp lo rer View の Vi ew Menu ボタンを使うと、Pro ject Exp lo rer View のトップレベルアイ
テムをプロジェクトとするか working sets とするかを設定できます。working set は一つのセットとして任
8
⁠第1 章 Eclipse の開発環境
意に分類されたプロジェクトのグループです。これは、関連またはリンクしているプロジェクトの編成に便
利なものです。
図1.7 O u t lin e Win d o w
O u t lin e ウィンドウは、ソースファイル内のコードの圧縮ビューを提供します。Ed it o r 内の選択ファイ
ルからの異なる変数や関数、ライブラリ、その他の構造体の要素を詳細表示します。これらはすべて、エ
ディター固有のものです。
図1.8 C o n so le View
Eclipse の機能やプラグインプログラムのなかには出力を C o n so le ビューに送信するものもあります。こ
のビューの D i spl ay Sel ected C o nso l e を使うと異なるコンソール間の切り替えができます。
9
開発者ガイド
図1.9 T asks View
T asks ビューでは、コード内で特別にマークされたリマインダのコメントを追跡できます。このビューで
は、各タスクコメントの場合が表示され、いくつかの方法でこれらを分類できます。
図1.10 追跡されたコメントの例
ほとんどの Eclipse エディターは //FIXME または //T O D O タグでマークされたコメントを追跡しま
す。タスクタグ と呼ばれるこれらの追跡されたタグは、他の言語で記述されたソースファイルによって異
なります。タスクタグを追加または設定するには、Win d o w > Pref eren ces に移動し、task tag s の
キーワードで特定のエディター/言語のタスクタグ設定メニューを表示します。
10
⁠第1 章 Eclipse の開発環境
図1.11 T ask Pro p ert ies
別の方法では、Ed it > Ad d T ask に移動して、タスクの Pro p ert ies メニュー (図1.11「Task
Properties」) を開くこともできます。この方法だと、タスクタグを使わずにソースファイルの特定の場所
にタスクを追加することができます。
図1.12 Pro b lems View
Pro b lems ビューは、ビルドやクリーン、プロファイルの実行など特定のアクションの実行中に発生した
エラーや警告を表示します。特定の問題に対する " quick fix (緊急措置) " の例を表示するには、問題を選択
して C trl +1 を押します。
1.2.1. クイックアクセスメニュー
11
開発者ガイド
Eclipse で最も便利な機能の一つが、q u ick access メニューです。q u ick access メニューに単語を入
力すると、その単語に関連したビューやコマンド、ヘルプファイル、その他のアクションの一覧が表示され
ます。このメニューを開くには、C trl +3 を押します。
図1.13 クイックアクセスメニュー
図1.13「クイックアクセスメニュー」 で Views > Pro ject Exp lo rer をクリックすると、Pro ject
Exp lo rer ウィンドウが表示されます。C o mman d s、Men u s、N ew、Pref eren ces カテゴリーからア
イテムを選択して、これをクリックして実行します。これは、メニューオプションやタスクバーのアイコン
をクリックするのと同様の動作です。また、矢印キーを使って q u ick access メニューを移動することも
できます。
1.2.2. キーボードショートカット
すべてのキーボードショートカットの完全一覧を表示することもできます。Shi ft+C trl +L を押すと表示
されます。
12
⁠第1 章 Eclipse の開発環境
図1.14 キーボードショートカット
Eclipse のキーボードショートカットを設定するには、K eyb o ard Sh o rt cu t s リストの表示中に
Shi ft+C trl +L を再度押します。
13
開発者ガイド
図1.15 キーボードショートカットの設定
1.2.3. パースペクティブのカスタマイズ
現在のパースペクティブをカスタマイズするには、Win d o w > C u st o miz e Persp ect ive を選択しま
す。これで C u st o miz e Persp ect ive ( パースペクティブのカスタマイズ) メニューが開き、表示可能な
ツールバー、メインメニューアイテム、コマンドグループ、ショートカットが設定可能となります。
ワークベンチ内の各ビューの場所は、ビューのタイトルをクリックして移動した場所にドラッグすること
でカスタマイズできます。
図1.16 パースペクティブメニューのカスタマイズ
図1.16「パースペクティブメニューのカスタマイズ」 は T o o l B ar Visib ilit y タブを表示しています。名
前が示すようにこのタブではツールバー表示を変更できます (図1.17「ツールバー」)。
14
⁠第1 章 Eclipse の開発環境
図1.17 ツールバー
以下の図では C u st o miz e Persp ect ive Men u の他のタブを表示しています。
図1.18 Men u Visib ilit y タブ
Men u Visib ilit y タブでは、各メインメニューアイテムで表示される機能を設定します。メインメニュー
アイテムの概要については、『C/C++ D evelopment User Guide』 の 『Reference』 > 『C/C++
Menubar』 か 『Java D evelopment User Guide』 の 『Reference』 > 『Menus and Actions』 を参照し
てください。
15
開発者ガイド
図1.19 C o mman d G ro u p Availab ilit y タブ
コマンドグループでは、機能またはオプションをメインメニューもしくはツールバーのエリアに追加しま
す。C o mman d G ro u p Availab ilit y タブを使ってコマンドグループを追加もしくは削除しま
す。Men u b ar d et ails と T o o lb ar d et ails フィールドでは、コマンドグループがそれぞれメインメ
ニューとツールバーエリアに追加した機能もしくはオプションが表示されます。
16
⁠第1 章 Eclipse の開発環境
図1.20 Sh o rt cu t s タブ
Sh o rt cu t s タブ タブでは、以下のサブメニューで利用可能なメニューアイテムを設定します。
File > N ew
Win d o w > O p en Persp ect ive
Win d o w > Sh o w View
1.3. Eclipse での C/C++ ソースコードの編集
Red Hat Enterprise Linux 6 は C/C++ 開発用の Eclipse プラグイン CD T を提供します。C/C++ ソース
コード用の特別エディターやメイクファイル、GNU Autotools ファイルも含まれています。プログラムの
実行およびデバッグの機能も利用できます。
Eclipse テキストエディターはカット、コピー、ペースト、ブロック選択 (C trl +Shi ft+A) といったテキ
ストエディターに通常備わっているほとんどの機能をサポートします。また、選択先の移動
(Al t+Up/D o wn Arro w) といった比較的ユニークな機能もあります。
C/C++ プログラマーにとって特に興味深いのは、コンテンツアシスト 機能です。この機能はポップアップ
ウィンドウで現行ファイル/場所で実行可能な関数、変数、テンプレートを提示します。これを起動するに
は、カーソルを希望の場所において、C trl +Space を押します。
ライブラリからの関数呼び出しの詳細に関しては、「l i bho ver プラグイン」 を参照してください。
Eclipse C/C++ コードエディターにはエラーの強調表示およびリファクタリングもあります。
17
開発者ガイド
コードエラーや警告は、色付きの波型下線で示されます。このようなエラーや警告は、コードをエディター
に入力する際、もしくはビルドが発生しコンパイラー出力がこのようなマークに変換されて表示される場合
があります。
提供されるリファクタリングツールには、コード要素の名前を変更する機能があります。
詳細は 「Eclipse による C/C++ アプリケーションのデバッグ」 または 「Eclipse 用の Autotools プラグイ
ン」 を参照するか、ヘルプコンテンツ内にある『C/C++ D evelopment User Guide』 でC o n cep t s →
C o d in g aid s と C o n cep t s → Ed it in g C /C + + Files、T asks → Writ e co d e を参照してください。
1.3.1. l i bho ver プラグイン
Eclipse 用の l i bho ver プラグインは、GNU C ライブラリおよび GNU C++ 標準ライブラリにプラグアン
ドプレイのホバーヘルプサポートを提供します。これにより開発者は、 ホバーヘルプ および code
completion を使ってよりシームレスで便利な方法で Eclipse ID E 内でg l i bc および l i bstd c+ + ライブ
ラリに関する既存ドキュメンテーションを参照できます。
C + + 言語
メソッド入力候補のドキュメンテーションは C++ に対応していません。ヘッダーファイルからのプロトタ
イプのみが提供されます。また、C++ メソッドでは、ソースファイルにヘッダーファイルを追加する機能
は対応していません。
C++ ライブラリリソースでは、l i bho ver は CD T インデクサーを使ってファイルの インデックス化 をす
る必要があります。インデックス化は、ビルドのコンテキストで対象ファイルを解析します。ビルドコンテ
キストは、ヘッダーファイルがどこから来るか、またタイプやマクロ、同様のアイテムがどのように解決さ
れるかを決定します。l i bho ver はヘッダーファイルの場所が分かっている場合もありますが、C++ ソー
スファイルのインデックス化ができるようになるには、通常実際のビルドが先に実行される必要がありま
す。
C++ メンバー関数名はドキュメンテーションの検索に十分な情報ではないので、l i bho ver プラグインは
C++ ソースのインデックス化を必要とする場合があります。C++ は、クラス内においても異なるクラスが
同一名のメンバーを持つことを可能とし、メンバーは異なるメソッドシグネチャの同一名を持つ場合があり
ます。これには、クラス名と関数のパラメーターシグネチャが提供されて正確にどのメンバーが参照されて
いるかを判断する必要があります。
また、C++ にはタイプ定義とテンプレート化されたクラスもあります。この様な情報は、ファイル全体と
関連の i ncl ud e ファイルの解析が必要になります。l i bho ver はインデックス化によってのみ、これが
できます。
C 言語
C 関数では、入力候補 (C trl +Space) を実行することで、潜在的なソースに追加される C 関数の一覧が提
供され (例えば、prin と入力して C trl +Space を押すと completion の一つとしてpri ntf が一覧表示さ
れます)、新たなウィンドウでドキュメンテーションが表示され、厳密にどの C 関数が必要かを判断しま
す。
18
⁠第1 章 Eclipse の開発環境
図1.21 C o d e C o mp let io n ( 入力候補) の使用
C 関数は名前だけでドキュメンテーション内での参照が可能です。このため、l i bho ver はホバーヘルプ
や code 入力候補を提供するために C ソースファイルをインデックス化する必要がありません。C ライブ
ラリ関数用の適切なヘッダーファイルインクルードステートメントは、すでに存在していない場合は自動的
に追加されます。
ファイル内で C 関数を選択し、右クリック > So u rce > Ad d In clu d e と進んで、ソースに必要なヘッ
ダーファイルを自動的に追加します。これは、Shi ft+C trl +N を押すことでも実行できます。
1 .3.1 .1 . 設定および使用方法
すべてのインストール済み l i bho ver ライブラリ用のホバーヘルプはデフォルトで有効となっており、プ
ロジェクトごとに無効とすることができます。特定のプロジェクトごとにホバーヘルプを無効または有効に
するには、プロジェクト名を右クリックして Pro p ert ies をクリックします。表示されるメニューで
C /C + + G en eral > D o cu men t at io n と進みます。H elp b o o ks セクションのライブラリにチェックを
入れるか外すかして、そのライブラリのホバーヘルプを有効/無効にします。
19
開発者ガイド
図1.22 ホバーヘルプの有効/無効化
複数の l i bho ver ライブラリが機能上で重複している場合は特に、特定のライブラリのホバーヘルプを無
効にすることをお勧めします。例えば、newl i b C ライブラリのような C ライブラリ用のl i bho ver プ
ラグインが手動でインストールされたとします (newl i b C ライブラリプラグインは Red Hat Enterprise
Linux 6 で提供されていないことに注意してください)。ホバーヘルプには C 関数が含まれており、その名
前が GNU C ライブラリ内のものと重複します (デフォルトで提供) 。これらのホバーヘルプの両方が同時に
アクティブになるのはユーザーに好ましくないので、どちらかを無効にすることが実用的です。
複数の l i bho ver ライブラリが有効となっていてライブラリ間で関数の重複がある場合、H elp b o o ks
セクションで 最初に 一覧表示されているライブラリからの関数のヘルプコンテンツがホバーヘルプに表示
されます (つまり、図1.22「ホバーヘルプの有効/無効化」 では g l i bc がこれに当たります)。code 入力候
補では、l i bho ver が有効なすべての l i bho ver ライブラリから考えられるすべての代替案を提供しま
す。
ホバーヘルプを使うには、 C /C + + Ed it o r で関数名またはメンバー関数名の上にカーソルを持っていきま
す。2、3秒のうちに、l i bho ver が選択した C 関数もしくは C++ メンバー関数に関するライブラリド
キュメンテーションが表示されます。
20
⁠第1 章 Eclipse の開発環境
図1.23 ホバーヘルプの使用
1.4 . Eclipse での Java ソースコードの編集
Red Hat Enterprise Linux 6 は Java (Java SE) 開発用の Eclipse プラグイン JD T を提供します。Java
ソースコードや ant bui l d . xml 用の特別エディターも含まれています。プログラムの実行およびデバッ
グの機能も利用できます。
Eclipse は Java 開発者用にフル機能搭載のインタラクティブな開発環境を提供します。
N ew Pro ject ウィザード
Eclipse の N ew Pro ject ウィザード は、Java プロジェクトの開始に必要な標準的セットアップのほとん
どを実行します。これによりユーザーは、どの Java ランタイム環境を使用するかや望ましいプロジェクト
ファイルツリーのレイアウトなどの様々なオプションを選択したり、カスタマイズしたりすることができま
す。
既存プロジェクトのエクスポートと同じ手順を行い、場所を求められたら、代わりに既存プロジェクトの場
所を入力します。
新規 Java プロジェクトの設定に関する詳細は、H elp > H elp C o n t en t s > Java D evelo p men t >
G et t in g St art ed > B asic T u t o rial > C reat in g Yo u r First Java Pro ject を参照してください。
コンテンツアシスタンス
Eclipse の Java 開発環境 (JD T) は、豊富なコンテンツアシスタンス機能を提供することで、生産性を高
め、エラーを減らします。これは通常、C trl + Space を押すと起動します。この機能に含まれるのは、
コードやライブラリでのメソッド名の完成や、Javadoc でのパラメーター名の挿入、メソッド呼び出しの
際のパラメーターの記入などです。これは完全にカスタマイズ可能で、特定候補を禁止したり、コード記入
の際に使用するカスタムコードテンプレートを追加したりすることができます。
これらの機能の概要については、H elp > H elp C o n t en t s > Java D evelo p men t U ser G u id e > T ip s
an d T ricks を参照してください。
21
開発者ガイド
コードの書式設定
コードの書式設定は C trl + Shi ft + F でアクセスできる JD T の別の便利な機能です。書式設定は
Win d o w > Pref eren ces > Java > C o d e St yler > Fo rmat t er に移動し、インストール済みの書式設定
プロファイルを使用するか、プロジェクトのスタイルに一致するように新たなプロファイルを作成するかを
選択することができます。
デバッグ機能
JD T にはデバッグ機能もいくつかあります。対象のコードの行の左マージンでダブルクリックすると、ブ
レークポイントが作成されます。デバッガーの実行中は、そのコード行でプログラムは停止するので、これ
はエラーの場所の検出に役立ちます。
デバッガーの初回実行時に設定されるデバッグパースペクティブは、デバッグに関連するビューをよりす
ぐれたものにする別のレイアウトです。例えば、Exp ressio n s ビューは、現行フレームのコンテキスト内
での Java 演算の評価を可能にします。
デバッグパースペクティブを構成するビューは、すべてのビューがそうであるように、Win d o w > Sh o w
View でアクセスでき、これらのビューへのアクセスにデバッグする必要はありません。
デバッグ中に変数の上にカーソルを持って行くと、その値が表示されます。または、Variab les ビューを
使用します。デバッグビューを使用すると、プログラムの実行を管理し、スタック上の様々なフレームを参
照することができます。
JD T でのデバッグに関する詳細は、H elp > H elp C o n t en t s > Java D evelo p men t > G et t in g
St art ed > B asic T u t o rial > D eb u g g in g Yo u r Pro g rams を参照してください。
JD T 機能
JD T は高度にカスタマイズ可能で、幅広い機能があり、その一覧は、Win d o w > Pref eren ces > Java と
Pro ject > Pro p ert ies の Java 設定で表示されます。JD T の詳細なドキュメンテーションとその機能に
ついては、H elp > H elp C o n t en t s > Java D evelo p men t U ser G u id e にある 『Java D evelopment
User Guide』 を参照してください。
1.5. Eclipse RPM ビルディング
Eclipse 用の Specfile Editor プラグインは、開発者が . spec ファイルを管理する際に役立つ機能を提供し
ます。このプラグインを使うと、ユーザーは . spec ファイルの編集の際に、オートコンプリート機能やハ
イライト、ファイルのハイパーリンク、折り曲げなどのいくつかの Eclipse GUI 機能を活用することができ
ます。
また、Specfile Editor プラグインは rpml i nt ツールを Eclipse インターフェイスに統合しま
す。rpml i nt はコマンドラインツールで、開発者が一般的な RPM パッケージエラーを検出する際に役立
ちます。Eclipse インターフェイスが提供する豊富な仮想化は、rpml i nt がレポートするミスを開発者が
迅速に検出、表示、訂正する際に役立ちます。
Eclipse の . spec file editor プラグインは、RPM プロジェクトからの RPM ファイルのビルドもサポート
します。この機能は、エクスポートウィザード (Imp o rt → R PM → So u rce/B in ary R PM) を利用するこ
とで使用可能になり、ソース RPM (src. rpm) かバイナリ RPM、もしくはその両方が必要かどうかを選択
することが可能になります。
ビルド出力は Eclipse コンソールビューにあります。一定数のビルド失敗には、ハイパーリンクのサポート
があります。つまり、ビルド失敗の特定部分は Eclipse コンソールビューでハイパーリンクに変更され
(C trl +Click)、これがユーザーを問題を発生させている. spec ファイルの実際の行に向けます。
22
⁠第1 章 Eclipse の開発環境
また、ソース RPM (. src. rpm) ファイルのインポートウィザードも重要です。これは、Imp o rt → R PM
→ So u rce R PM にあります。これを使用すると、ソース RPM が既に作成されている場合、設定なしで
ユーザーは簡単に開始することができます。するとこのプロジェクトは、spec ファイルの編集と、ソース/
バイナリ RPM へのビルド (エクスポート) の準備ができたことになります。
詳細はヘルプコンテンツにある 『Specfile Editor User Guide』 の Sp ecf ile Ed it o r U ser G u id e →
Imp o rt src.rp m an d exp o rt rp m an d src.rp m セクションを参照してください。
1.6. Eclipse のドキュメンテーション
Eclipse には包括的な内部ヘルプライブラリがあり、統合開発環境 (ID E) のほとんどすべての側面がカバー
されています。Eclipse のドキュメンテーションプラグインはすべて、そのコンテンツをこのライブラリに
インストールし、そこでインデックス化されます。このライブラリにアクセスするには、H elp メニューを
使います。
図1.24 H elp
メインの H elp メニューを開くには、H elp > H elp C o n t en t s に移動します。H elp メニューでは、
C o n t en t s フィールドにインストール済みドキュメンテーションプラグインが提供するすべての利用可能
なコンテンツが表示されます。
23
開発者ガイド
図1.25 H elp Men u
C o n t en t s フィールド下部のタブは、Eclipse ドキュメンテーションにアクセスするオプションになりま
す。セクション/ヘッダーごと、または Search フィールドで検索して各「ブック」に移動できます。各
ブックにブックマークを付けて、B o o kmarks タブからその箇所にアクセスすることもできます。
『Workbench User Guide』 は Eclipse ユーザーインターフェイスの全側面を幅広くカバーしています。
Eclipse の機能方法を理解するために便利な Eclipse ワークベンチ、パースペクティブ、異なるコンセプト
の非常に低レベルな情報が含まれています。『Workbench User Guide』 は、Eclipse や ID E 全般に関す
る経験がほとんどない、またはある程度あるユーザーに理想的なリソースとなります。このドキュメンテー
ションプラグインはデフォルトでインストールされます。
Eclipse ヘルプシステムには、動的ヘルプ 機能も含まれています。この機能はワークベンチ内で新たなウィ
ンドウを開き、選択されたインターフェイス要素に関連のあるドキュメンテーションを表示します。動的ヘ
ルプをアクティベートするには、H elp > D yn amic H elp に移動します。
24
⁠第1 章 Eclipse の開発環境
図1.26 動的ヘルプ
図1.26「動的ヘルプ」 の右端のウィンドウには O u t lin e ビューに関連するヘルプトピックが表示されて
います。これが選択されたユーザーインターフェイスの要素だからです。
25
開発者ガイド
第2章 協同作業
複数の開発者が関わるプロジェクトでは、効果的な改訂管理が必須になります。これにより、チーム内の開
発者全員が組織的かつ規則的な方法でコードを作成、見直し、改訂、記録できるようになります。Red Hat
Enterprise Linux 7 は、CVS、SVN、Git というオープンソースの改訂管理システムのなかで 3 つの最も人
気のあるものをサポートしています。これらの改訂管理システム向けのツールは、個別の内部コードリポジ
トリを設定する機能に加え、公開で入手可能な幅広いオープンソースコードへのアクセスを提供します。
以下のセクションでは、各ツールの関連資料の概要と参照先を説明します。
2.1. Concurrent Versions Syst em (CVS)
Concurrent Versions System (CVS) は、クライアント/サーバーアーキテクチャーの改訂管理システム
(RCS) フォーマットをベースとした中央管理のバージョン管理システムです。これは最初のバージョン管
理システムで、Subversion (SVN) 以前のものです。
2.1.1. CVS の概要
このセクションでは、CVS の長短両方の様々な要素を見ていきます。
CVS は、ネットワーク接続の信頼性が低く、頻繁に切断していた時期に開発されました。つまり、ファイ
ルをいくつか同時にコミットした際にネットワークが切断されると、コミットは失敗に終わりました。
ネットワークの信頼性が低いと、この現象は現在でも起こり得ますが、現状のネットワークインフラストラ
クチャーではその可能性は低いものとなっています。ネットワーク切断時には、CVS 管理者は 2 つのオプ
ションで問題を解決できます。1 つめは ad mi n コマンドを使用してストールがロックされたファイルを取
り除き、変更ファイルを取り消す方法です。2 つ目は、コミットコマンドを再発行する方法です。
CVS は バックアップの作成に 1 つの集中した場所を使います。これは不安定なネットワークでは便利なも
のです。中央化されたアーキテクチャーのため、手動で準備されたトリガー (自動化されたテスト、ビル
ド、アクセス制御リスト (ACL) バグ追跡システムとの統合) によるコミットポリシーの強制が可能になりま
す。
バックアップへのより詳細なコミットを作成するには、CVS は アットマーク (@) の付いたキーワードを拡
張して、コミットの詳細 (例: コミッター名、コミットメッセージ、コミット時間など) をコミットされた
ファイルに記録することができます。
これらのコミットを継続して追跡するために、CVS はサーバーを使って各ファイルの変更を別個に、最新
のものから順に追跡します。こうすることで、最新バージョンが直接保存され、すばやく取り出すことがで
きます。古いバージョンはサーバーが再計算する必要があります。変更され、コミットされたファイルはそ
れぞれ個別の改訂識別子を付けて追跡されます。こうすると、複数の変更ファイルがコミットされた際にど
のファイルが変更されたかを見つけ出すのが困難になる場合があります。これに対処するには、ユーザーは
リポジトリ状態にタグ付けを実行し、必要に応じて変更に戻って参照し、この変更を表示すべきです。
CVS リポジトリは 2 つの方法でアクセスできます。リポジトリがクライアント (: l o cal : アクセス方法)
と同じマシン上にある場合は、クライアントがサーバーを起動します。リポジトリがリモートのマシン上に
ある場合は、サーバーは rsh/SSH (C VS_R HS 環境変数) を使ってクライアントもしくは inet デーモン
(/etc/xi netd . d /cvs) が起動することができ、異なる認証方法 (例えば、: g server: アクセス方法が
Kerberos 認証を統合) が使用可能です。
最後に、CVS ではセキュリティ目的でクライアント/サーバーアプローチが使用されます。つまり、クライ
アントはサーバーへの接続性に依存し、サーバーアクセスのパーミッションなしにはいかなる操作 (コミッ
トやコミットログの読み取り) も実行できません。
2.1.2. 典型的なシナリオ
26
⁠第2 章 協同作業
以下のコマンドの手順では、$C VSR O O T ディレクトリに (シグナル : l o cal : アクセス方法への絶対パス
を使用して) CVSリポジトリを作成する方法を示しています。$SO UR C ES からソースをインポートし、リ
ポジトリから $WO R KD IR にソースをチェックアウトし、ファイルを修正し、変更をコミットします。
手順2.1 C VS の使用方法
1. CVS ストレージを初期化します。
$ mkdir "$CVSROOT"
$ cvs -d "$CVSROOT" init
リポジトリ設定で $C VSR O O T 下に C VSR O O T サブディレクトリが作成されます。
2. $SO UR C ES ディレクトリから CVS にコードを $R EP O SIT O R Y としてインポートし、コミット
$MESSAG E とともに $VEND O R _T AG および $R ELEASE_T AG をタグ付けします。
$ cd "$SOURCES"
$ cvs -d "$CVSROOT" import -m "$MESSAGE" "$REPOSITORY" \
"$VENDOR_TAG" "$RELEASE_TAG"
$SO UR C ES コンテンツは $C VSR O O T /$R EP O SIT O R Y 下で CVS にインポートされます。単一
CVS ストレージ内に複数のリポジトリを設置することも可能です。ただし、この例では 1 つにして
います。$VEND O R _T AG および $R ELEASE_T AG は、暗黙的なリポジトリブランチ用のタグで
す。
3. これで異なる開発者がコードを $WO R KD IR にチェックアウトできます。
$ cd "$WORKDIR"
$ cvs -d "$CVSROOT" checkout "$REPOSITORY"
警告
元の $SO UR C ES にチェックアウトしないでください。これを行った場合、クライアント側
でデータ破損が発生する可能性があり、CVS は様々な CVS 呼び出しでエラーを出力するこ
とになります。
4. 最新バージョンの CVS リポジトリが $R EP O SIT O R Y サブディレクトリに転送されました。開発
者は一つのサーバーから複数のリポジトリをチェックアウトすることもできます。
$ cd $REPOSITORY
5. 新規 $FILE の追加をスケジュールするには、以下を使用します。
$ vi "$FILE"
$ cvs add "$FILE"
6. 開発者は $EXIST ING _FILE を修正することができます。
$ vi "$EXISTING_FILE"
7. 最後に、開発者は $C O MMIT _MESSAG E を付けてこれらの変更をコミットすることができます。
27
開発者ガイド
$ cvs commit -m "$COMMIT_MESSAGE"
$C VSR O O T 値を C VSR O O T 環境変数としてエクスポートすることは可能で、cvs ツールはこれを優先し
ます。これにより開発者は -d "$C VSR O O T " オプションを繰り返し提供する必要がなくなります。この値
は初回のチェックアウトで CVS ヘルパーサブディレクトリに保存され、CVS ツールはそこから自動的にこ
の値を取り出します。
2.1.3. CVS ドキュメンテーション
CVS の man ページは、man cvs でアクセスできます。
また、ローカルの FAQ ページは /usr/share/d o c/cvs-version/FAQ にあります。
CVS の情報ページは http://ximbiot.com/cvs/manual/ で入手可能です。
CVS の ホームページは http://www.nongnu.org/cvs/ になります。
2.2. Apache Subversion (SVN)
Subversion は、ファイルやディレクトリ、それらへの変更を管理し、障害時にはそれらをリカバリして確
認できるバージョン管理システムです。これは CVS の機能に適合して同一の開発モデルを保存できるよう
に作成されており、CVS で頻繁に発生する問題に対処できるようになっています。このため、CVS ユー
ザーは最小限の労力で SVN に切り替えができます。
本セクションでは、SVN のインストールと詳細な使用方法を説明します。
2.2.1. インストール
SVN はバイナリパッケージでソースコードから直接またはコンソールからインストールできます。
SVN をインストールする最も簡単な方法は、yum i nstal l subversi o n コマンドでコンソールから行
います。この方法を選択すると、Red Hat 認定パッケージのみが使用されることを確認でき、手動更新の要
件がなくなります。
最後に、SVN はソースコードからもインストールできますが、これは複雑なものとなる可能性がありま
す。SVN Webサイトからソースコードの最新リリースをダウンロードし、i nstal l の指示にしたがいま
す。
2.2.2. SVN リポジトリ
SVN を使い始めるためには、まず新たなリポジトリを作成する必要があります。SVN はプロジェクト間の
違いを判断できません。ファイルツリーを管理し、プロジェクトを好みに合わせて別のディレクトリに置く
のはユーザーの判断になります。以下のコマンドを使用してリポジトリを作成します。
# mkdir /var/svn
# svnadmin create /var/svn/repos
# ls /var/svn/repos/
conf db format hooks locks README.txt
このコマンドで必要なデータベースファイルのある新規ディレクトリ /var/svn/repo s が作成されま
す。
SVN リポジトリには URL でアクセスします。通常、http:// の標準構文が使用されますが、これに限定され
るものではありません。以下の URL 形式も使用できます。
28
⁠第2 章 協同作業
f ile:///
直接リポジトリアクセス (ローカルディスク上)
h t t p ://
WebD AV プロトコルで Subversion 対応の Apache サーバーにアクセスします。
h t t p s://
http:// と同じですが SSL 暗号化を使用
svn ://
カスタムプロトコルを使って svnserver サーバーを使用
svn + ssh ://
svn:// と同じですが SSH トンネルを使用
重要
URL に空白が含まれている場合は、その前後を引用符で囲んでシェルが単一引数として処理するよ
うにします。引用符を用いないと、URL は無効となります。
2.2.3. データのインポート
複数ファイルで構成されるプロジェクトがすでに作成されたと仮定し、これらが一つのディレクトリに置か
れるようにまとめます。branches、tag s、trunk という名前で 3 つのトップレベルディレクトリを使用
することが推奨されます。これは SVN が必要とするものではありませんが、一般的な慣習です。trunk
ディレクトリにはプロジェクトファイルを格納し、branches および tag s ディレクトリは空にしておき
ます。例えば、以下のようになります。
myproject/branches/
myproject/tags/
myproject/trunk
foo.c
bar.c
Makefile
情報を適切にまとめた後は、これを SVN リポジトリにインポートします。以下のように、svn i mpo rt コ
マンドで実行します。
$ svn import /path/to/mytree \
http://host.example.com/svn/repo/myproject
-m "Initial import"
Adding myproject/foo.c
Adding myproject/bar.c
Adding myproject/subdir
Adding myproject/subdir/quux.h
\
Committed revision 1.
$
SVN は、ファイルツリーの設定方法に基づいて必要なディレクトリを作成します。これは作成した URL か
29
開発者ガイド
コマンドで表示できます。
$ svn list http://host.example.com/svn/repo/myproject
2.2.4 . 作業コピー
リポジトリにプロジェクトの最初のリビジョンがチェックされた後は、これを修正/作業することができま
す。これを行うには、作業コピーを作成します。以下のように、svn checko ut コマンドで実行します。
$ svn checkout http://host.example.com/svn/repo/trunk
A trunk/README
A trunk/INSTALL
A trunk/src/main.c
A trunk/src/header.h
...
Checked out revision 8810.
$
これでプロジェクトの作業コピーのあるディレクトリがローカルマシン上に作成されました。以下のコマン
ドで、プロジェクトのチェックアウト先となるローカルディレクトリを指定することもできます。
$ svn checkout http://host.example.com/svn/repo/trunk my-working-copy
指定されたローカルディレクトリが存在しない場合は、SVN が作成します。
警告
作業コピー内のディレクトリにはすべて、. svn と呼ばれるサブディレクトリが含まれています。こ
れは管理ディレクトリなので、通常は list コマンドでは表示されません。これは重要なファイルなの
で、削除や変更はしないでください。Subversion はこのディレクトリを使って作業コピーを管理す
るので、これに手を加えるとエラーが発生したり不安定になります。このディレクトリを誤って削除
してしまった場合は、全体を含むディレクトリを削除し (svn d el ete ではなく、通常のシステム
削除)、親ディレクトリから svn upd ate を実行するのが最善の修正方法です。削除されたディレ
クトリは、なくなったり変更された . svn ディレクトリを含めて再作成されます。これは、データ
損失につながる可能性があります。
これで作業コピーは編集可能となりましたが、ファイルツリーが変更される際は常にこの変更をリポジトリ
にも送信する必要があることに注意してください。これは様々なコマンドで実行できます。
svn ad d filename
新たに作成されたファイルもしくはディレクトリおよびそれに含まれるファイルは、リポジトリ
に追加されるようフラグが付けられます。次回のコミットでこれらはリポジトリに追加され、こ
れは全員がアクセス/表示することができます。
svn d el ete filename
ファイルもしくはディレクトリおよびそれに含まれるファイルは、リポジトリから削除されるよ
うフラグが付けられます。次回のコミットで削除されます。しかし、削除されたファイルは、以
前のリビジョンが SVN でアクセス可能です。
svn co py filename1 filename2
filename1 の同一コピーである新規ファイル filename2 を作成します。そして、次回のコミットで
30
⁠第2 章 協同作業
filename2 を追加するスケジュールを行います。svn co py は --parents オプションがない
と、中間ディレクトリを作成しないことに注意してください。
svn mo ve filename1 filename2
これは、svn co py filename1 filename2 の次に svn d el ete filename1 を実行する
のと同様の動作になります。コピーが作成され、次回のコミットで filename1 の削除をスケ
ジュールします。svn mo ve は --parents オプションがないと、中間ディレクトリを作成し
ないことに注意してください。
svn mkd i r directory
このコマンドは、指定されたディレクトリを作成し、次回のコミットでのリポジトリへの追加を
スケジュールします。
簡単な変更を加えるために作業コピー全体をチェックアウトするのは現実的でない場合もあります。こうい
う場合は、リポジトリ URL 上で直接 svn mkd i r、svn co py、svn mo ve、svn d el ete を実行する
ことができます。
重要
これらのこのコマンドを使用する際は、その結果を最初に作業コピーで確認する方法がないので、注
意してください。
2.2.5. 変更のコミット
変更作業が完了し、間違いがないことを確認したら、他の関係者も変更を閲覧できるように発行します。
作業コピー内の各ファイルで、SVN は 2 つの情報を記録します。
現在の作業ファイルの基となっているファイルの作業リビジョン。
ローカルコピーをリポジトリが最後に更新したことを記録するタイムスタンプ。
SVN はこの情報を使って作業コピーをローカルシステム上で 4 つのカテゴリに分類します。
U n ch an g ed ; cu rren t ( 変更なし; 現行)
作業ディレクトリ内のファイルは変更されておらず、リポジトリ内のコピーと一致します。つま
り、初回のチェックアウト以降、コミットされた変更はありません。svn co mmi t または svn
upd ate を実行しても何も起こりません。
Lo cally ch an g ed ; cu rren t ( ローカルで変更; 現行)
作業ディレクトリ内のファイルは編集されていますが、リポジトリにはコミットされていませ
ん。また、リポジトリのバージョンは、初回のチェックアウト以降、変更されていません。svn
co mmi t を実行すると、作業ディレクトリ内の変更でリポジトリが更新されます。svn upd ate
を実行しても何も起こりません。
U n ch an g ed ; o u t o f d at e ( 変更なし; 期限切れ)
作業ディレクトリ内のファイルは編集されていませんが、リポジトリ内のバージョンは編集され
ているので、作業コピーは期限切れになってしまっています。svn co mmi t を実行しても何も
起こりません。svn upd ate を実行すると、リポジトリ内の変更とローカルの作業コピーをマー
ジします。
Lo cally ch an g ed ; o u t o f d at e ( ローカルで変更; 期限切れ)
31
開発者ガイド
作業ディレクトリ内のファイルとリポジトリの両方が変更されています。svn co mmi t を先に
実行すると、「out-of-date (期限切れ)」エラーが発生します。最初にファイルを更新してくださ
い。svn upd ate を実行すると、リポジトリ内の変更と作業コピーの変更のマージを試みます。
競合があると、競合を解決する最善のアクションをユーザーが選択できるように SVN はオプ
ションを提供します。
svn status を実行すると、リポジトリ内の現行バージョンに一致しない作業ツリー内の全ファイルが文
字ごとにコード化されて表示されます。
? アイテム
ファイルが SVN で認識されていません。つまり、作業コピー内にあるものの、リポジトリに追加
されていないか、アクションがスケジュールされていません。
A アイテム
ファイルがリポジトリに追加するようスケジュールされており、次回のコミットで追加されま
す。
C アイテム
ファイルはリポジトリでなされた変更と競合しています。つまり、作業コピーで現在変更された
ファイルの同一セクションを別のユーザーが編集してコミットしていて、SVN はどちらが「正し
い」か分からない状態です。変更がコミットされる前にこの競合を解決する必要があります。
D アイテム
ファイルは次回のコミットで削除されるようにスケジュールされています。
M アイテム
ファイルが修正され、次回のコミットで変更が更新されます。
--verbo se (-v) が svn status で実行されると、変更されていないものも含め、作業コピー内の全アイ
テムのステータスが表示されます。例えば、以下のようになります。
$ svn status -v
M 44 23 sally README
44 30 sally INSTALL
M 44 20 harry bar.c
44 18 ira stuff
44 35 harry stuff/trout.c
D 44 19 ira stuff/fish.c
44 21 sally stuff/things
A 0 ? ? stuff/things/bloo.h
44 36 harry stuff/things/gloo.c
表示されているのは順に、文字コード、作業リビジョン、アイテムが最後に変更されたリビジョン、変更者
名、変更されたアイテム、になります。
チェックアウトが最後に実行されてからリポジトリ内で修正されたアイテムを確認することも役に立ちま
す。これは、svn status で --sho w-upd ates (-u) の実行で可能です。アスタリスク (*) が文字ステー
タスと svn co mmi t 実行時に更新されるファイルの作業リビジョン番号の間に表示されます。
変更を表示するもう一つの方法は、svn d i ff コマンドです。これにより、変更部分が統一された差分
フォーマットで表示され、ファイルのコンテンツの「スニペット」と説明されます。各行の先頭には以下
の文字が付けられます。空白の場合は変更なし、マイナス記号 (-) の場合は削除された行、プラス記号 (+)
の場合は追加された行を示します。
32
⁠第2 章 協同作業
競合が発生する場合もあります。SVN は最も一般的な 3 種類の応答を返し (postpone、diff-full、edit)、4
つ目のオプションは全オプションとその内容を一覧表示します。利用可能な各オプションは以下の通りで
す。
( p ) p o st p o n e
競合を後で解消するようにマークします。
( d f ) d if f - f u ll
ベースリビジョンと競合ファイルの違いを統一された差分フォーマットで表示します。
( e) ed it
マージされたファイルをエディターで変更します。
( r) reso lved
マージされたバージョンのファイルを受け付けます。
( mf ) min e- f u ll
ユーザーのファイル全体を受け入れ、リポジトリの最新の変更を無視します。
( t f ) t h eirs- f u ll
ユーザーと競合している側のファイル全体を受け入れ、ローカルの作業コピーの最新の変更を無
視します。
( l) lau n ch
競合解消のために外部ツールを起動します (これには外部ツールを前もって設定しておく必要があ
ります)。
( h ) h elp
ここで説明されたオプションを一覧表示します。
最後に、プロジェクトがローカルで変更され、競合が解消された場合、この変更は svn co mmi t コマンド
に -m オプションをつけてコミットすることができます。
$ svn commit filename -m"Fixed a typo in filename"
Sending filename
Transmitting file data .
Committed revision 57.
$
上記の例のように、-m オプションを使うとコミットメッセージを記録することができます。メッセージが
分かりやすいと役に立ち、コミットに戻って参照する場合も分かりやすくなります。
これでリポジトリにアクセス可能なユーザーはだれでも最新の更新バージョンを使ってローカルで最新コ
ピーに更新できるようになります。
2.2.6. SVN ドキュメンテーション
svn --hel p コマンドは、SVN と一緒に使用する利用可能なコマンドに関する情報を提供し、svn
subcommand --hel p は特定のサブコマンドに関するより詳細な情報を提供します。
SVN の公式ガイドは http://svnbook.red-bean.com/ で入手可能です。
33
開発者ガイド
SVN の公式 Web サイトは http://subversion.apache.org/ になります。
2.3. Git
Git は CVS や SVN の改善というよりも、それらに対抗するために開発されたバージョン管理システムで
す。Git は以下の 4 つの点を念頭に作成されました。
1. CVS や SVN とは異なる。Git の作成者である Torvalds 氏は、これらのプログラムを好まなかった
ので、これらと違うものを作成したいと思いました。
2. BitKeeper のような作業フローをサポート。理想的なプロジェクトの管理方法は BitKeeper と同様
のプロセスとする一方で、独自の設計を維持して BitKeeper のクローンとはならないようにする。
3. アクシデントもしくは悪意による破損に対する強固な安全対策。
4. 非常に高いパフォーマンス。
これらを達成するために、Git はこれまでとは違う方法でデータ処理方法にアプローチしています。
このセクションでは、通常の Git の使用方法で最も一般的なプロセスについて説明します。
(CVS や SVN などの) 以前のバージョン管理は、データを各ファイルの基本バージョンに対する変更として
処理していました。Git ではその代わりにデータ変更をファイルがどのように見えるかという別個のスナッ
プショットとして扱い、該当ファイルへのリファレンスを保存します (ただし、ファイルが変更されていな
ければ、Git は別のファイルをコピーするのではなく、以前の同一バージョンへのリンクを保存します)。こ
れにより、新たなミニファイルシステムが作成されます。下図は、これらの概念を視覚的に比較したもので
す。
図2.1 G it バージョン管理
34
⁠第2 章 協同作業
Git は継続的にリモートのリポジトリに接続する必要がないので、非常に高速なものになっています。Git
のスナップショットの性質と全バージョンがローカルのファイルシステムに保存される方法が意味するの
は、ほとんどすべてのことがネットワークに接続することなくでき、プロジェクトの履歴がローカルで入手
可能ということです。
Torvalds 氏の完全な要件を満たすために、Git ではすべてのものが保存前にチェックサムを行い、その後に
そのチェックサムで照合されます。つまり、Git が知らない間にコンテンツが変更されるということがな
く、情報が転送中に失われたり、破損したりすることがありません。SHA-1 ハッシュメカニズム (40 文字
の 16 進法の文字列) がこのために使われています。
また、Git では元に戻すことができないものはほとんどありません。これは、ファイルが以下の 3 つの状態
のいずれかに属することが役に立っています。
C o mmit t ed ( コミット済み)
データは安全にローカルのデータベースに保存され、変更されていません。
Mo d if ied ( 変更済)
ファイルは変更されているが、データベースにはコミットされていない。
St ag ed
修正されたファイルが現行バージョンでコミットされるようにマークされている。
2.3.1. インストール
Git はソースまたはコンソールのいずれかからインストールできます。ユーザーに自信がある場合は、ソー
スからのインストールが推奨されます。これは、バイナリインストーラーには常に最新のバージョンがある
とは限らないためです。
ソースコードから Git をインストールする場合は、以下の手順にしたがいます。
手順2.2 ソースコードからの G it インストール
1. Git が依存する以下のライブラリをインストールしま
す。curl 、zl i b、o penssl 、expat、l i bi co nv。
# yum install curl-devel expat-devel gettext-devel \
openssl-devel zlib-devel gcc
2. 以下のアドレスにある Git Web サイトから最新のスナップショットをダウンロードしま
す。http://git-scm.com/download
3. コンパイルして、インストールします。
#
#
#
#
tar -zxf git-1.7.6.1.tar.gz
cd git-1.7.6.1
make prefix=/usr/local
make prefix=/usr/local install
4. これで Git から Git のアップデートを入手することが可能になりました。
$ git clone git://git.kernel.org/pub/scm/git/git.git
コンソールからバイナリインストーラーで Git をインストールするには、単に以下のコマンドを実行しま
す。
35
開発者ガイド
# yum i nstal l g i t
2.3.2. 初期設定
インストール後に Git をパーソナル化するステップを実行して使用する準備を整えます。これらのセッティ
ングが設定されると、以降の Git セッションで維持されます。ただし、これ以降に変更する場合は、コマン
ドを再度実行します。
これらの変更は、3 つの別の場所の保存されている変数を変更することで実行されます。
1. /etc/g i tco nfi g ファイルにはシステム上の全ユーザーとその全リポジトリ用の変数が含まれて
います。ここには基本設定が格納されており、--system オプションを g i t co nfi g に指定する
と、このファイルから読み書きをするように設定します。
2. ~ /. g i tco nfi g ファイルはユーザー固有のものです。--g l o bal を指定すると、Git にこの
ファイルへの読み書きを指示し、上記 1 番の設定に優先します。
3. 現在使用しているリポジトリの Git ディレクトリ内の設定ファイルです (. g i t/co nfi g )。これ
は、このリポジトリのみに固有のもので、1 および 2 番の設定に優先します。
初回のコミット前に、変更の際に表示される名前と E メールアドレスを提供して、Git に詳細を記入しま
す。
例えば、ユーザーの名前が John Q. Smith であれば、以下のコマンドを使用します。
$ git config --global user.name "John Smith"
$ git config --global user.email "jsmith@ example.com"
上記の説明にあるように、--g l o bal オプションを指定すると、これらの設定は維持されますが、特定の
リポジトリで無効にすることもできます。
エディターが必要な場合は、Git はデフォルトで Vi もしくは Vim を起動します。ただし、これらが好みに
合わない場合は、別のエディターに変更することもできます。これを行うには、以下のコマンドを使用しま
す。
git config --global core.editor EditorName
差分ツールは様々なファイルで変更を表示させる際に使用し、コミット前に確認する際に役立ちます。
以下のコマンドを使って好みの差分ツールを設定します。
$ git config --global merge.tool DiffTool
最後に、これらの設定が正しく行われているかを確認します。以下のコマンドを実行します。
$ git config --list
user.name=John Smith
[email protected]
異なるファイルで異なる設定になっている場合、Git はすべてをリッスンし、最後の値をアクティブなもの
とします。また、g i t co nfi g {key} コマンドを使用して、Git が変数への特定の応答を確認するよう
にすることもできます。例えば、以下のようになります。
36
⁠第2 章 協同作業
$ git config user.name
John Smith
2.3.3. Git リポジトリ
Git リポジトリには、プロジェクトのメタデータやオブジェクトデータベースが保存されます。ローカルシ
ステム上でリポジトリのローカルのクローンを作成する際は、ここからプロジェクトがプルされます。
Git リポジトリを取得するには 2 つの方法があります。1 つ目は、ディレクトリが既に存在し、Git リポジ
トリを初期化する必要がある場合に使われます。2 つ目は、既に存在するリポジトリをクローンする方法で
す。
既存のリポジトリ (例えば投稿するための) をクローンするには、以下のコマンドを実行します。
$ git clone git://location/of/git/repository.git
このコマンドは g i t cl o ne であって、CVS や SVN などのバージョン管理システムで使われるg i t
checko ut ではないことに注意してください。これは、Git ではプロジェクトの全履歴にあるすべてのファ
イルのコピーが渡されるのに対し、他のバージョン管理システムでは最新のファイルのみが渡されることが
理由です。
上記のコマンドでディレクトリが作成され、その名前は . g i t 接尾辞のない URL の最後の部分になりま
す。しかし、cl o ne コマンドは最後に好みのディレクトリ名を追加することで、どんな名前でも使用する
ことができます。
$ git clone git://location/of/git/repository.git my_git_repo
最後に、このコマンドでは g i t: // プロトコルを使用しますが、必要に応じてhttp: // や https: // を
使うこともできます。
データ作成が可能な新規 Git リポジトリを作成するには、まずプロジェクトのディレクトリに移動し、以下
を実行します。
$ git init
これで Git リポジトリのスケルトンが作成され、ここにはコンテンツの作成および追加に備えた必要なファ
イルすべてが含まれます。
これで スケルトンの Git リポジトリが設定されたか、ローカルクローンがコピーされローカルシステム上で
準備が整ったので、Git サイクルの残りの部分を見ていきましょう。
37
開発者ガイド
図2.2 G it ライフサイクル
上記のイメージは Git サイクルが機能する様子を示しています。以下のセクションで詳細を説明していきま
す。
2.3.4 . 追跡されていない (Unt racked) ファイル
追跡されていないファイルは、Git が認識しないものです。これは、ファイルが新たに作成された際か、新
規プロジェクトの全ファイルで発生します。ファイルのステータスは、g i t status で表示されます。新
規プロジェクトの場合は、ファイルは untracked ステータスになります。
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# filename
nothing added to commit but untracked files present (use "git add" to
track)
ステータスが分かりやすく示しているように、g i t ad d コマンドで Git にファイルを含めるように指示し
ない限り、ファイルは含まれません。
$ git add filename
g i t ad d filename コマンドは特定のファイルをまず未変更セクションに追加します。g i t ad d . を
使って現行ディレクトリ (すべてのサブディレクトリを含む) 内の全ファイルを追加します。また、例とし
て g i t ad d *. [ch] を使うと、現行ディレクトリ内のすべての . c および . h ファイルを追加します。
38
⁠第2 章 協同作業
2.3.5. 未変更 (Unmodified) ファイル
未変更ステータスは、変更されていないファイルが保存されている状態です。Git はこれを認識しており、
追跡することで、編集がなされると変更済みステータスに移動されます。また、コミット後にはファイルは
このステータスに戻されます。
また、この状態からファイルを削除して、Git による追跡を中止することも可能です。これは、ローカルで
も削除されます。以下を実行します。
$ git rm filename
rm 'filename'
$ git status
# On branch master
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: filename
#
重要
ファイルが未変更の場合、g i t rm filename はファイル全体を削除します。g i t rm
filename が診断してファイルを削除しないのは、ファイルが変更をコミットしていない場合のみ
です。変更がコミットされていないのに削除する場合は、 --fo rce または -f オプションを使い
ます。
ファイルをローカルで削除せずに Git による追跡を中止するには、 --cached オプションを使用
し、その後に削除をコミットします。
$ git rm --cached filename
$ git commit -m'remove file message'
2.3.6. 変更済みステータス
ローカルシステム上のコピーが編集可能であるとします。変更が加えられると、Git はこのファイルを変更
済みと認識し、変更済みステータスに移動します。g i t status の実行でこれが表示されます。
$
#
#
#
#
#
#
git status
On branch master
Changed but not updated:
(use "git add <file>..." to update what will be committed)
modified: filename
ファイルは変更されましたが、まだコミットされていません (いずれにしても、さらに変更が加えられる可
能性があり、コミットする準備が整っていない可能性があります)。出力が分かりやすく示しているよう
に、g i t ad d filename コマンドを再度実行すると、変更済みファイルがステージング完了 (staged)
ステータスにプッシュされ、コミットの準備が整います。
39
開発者ガイド
$
$
#
#
#
#
#
#
git add filename
git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: filename
ステージング完了ファイルがコミット前に最後の修正を必要とすると、このファイルはステージング完了ス
テータスと変更済みステータスの両方に表示されるので、このプロセスはやや複雑になる場合があります。
これが発生した場合は、ステータスは以下のようになります。
$
#
#
#
#
#
#
#
#
#
#
#
git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: filename1
Changed but not updated:
(use "git add <file>..." to unstage)
modified: filename1
Git のスナップショットが目立つのはこういう場面です。コミットの準備ができたファイルのスナップ
ショットがある一方で、変更済みステータスにも別のスナップショットがあります。コミットが実行され
れると、ステージング完了ステータスのスナップショットのみがコミットされ、修正されたバージョンは
コミットされません。g i t ad d を再度実行するとこれが解消され、ファイルの変更済みのスナップ
ショットがステージング完了ステータスのスナップショットとマージされ、新たな変更をコミットする準
備が整います。
2.3.7. ステージング完了 (st aged) ファイル
ステージング完了ステータスは、コミットの準備ができたすべてのファイルのスナップショットがある状
態です。このステータスにあるファイルはすべて、コミットコマンドでコミットされます。
2 .3.7 .1 . 変更の表示
ステージング完了ステータスのスナップショットをコミットする前に、加えられた変更をチェックしてこ
れらが受け入れ可能なものかを確認するとよいでしょう。g i t d i ff コマンドはこういう場合に使いま
す。
$ git diff
diff --git a/filename b/fi l ename
index 3cb747f..da65585 100644
--- a/filename
+++ b/filename
@ @ -36,6 +36,10 @ @ def main
@ commit.parents[0].parents[0].parents[0]
end
+ some code
40
⁠第2 章 協同作業
+ some more code
+ a comment
+ another change
- a mistake
上記のように g i t d i ff コマンドをパラメーターなしで実行すると、作業ディレクトリをステージング完
了ステータスにあるものと比較し、まだコミットされていない変更を表示します。
また、--cached オプションを使うと、ステージング完了ステータスの変更と最後にコミットされた変更
を比較することもできます。
$ git diff --cached
diff --git a/filename b/filename
new file mode 100644
index 0000000..03902a1
-- /dev/null
+++ b/filename
@ @ -0,0 +1,5 @ @
+file
+ by name1, name2
+ http://path/to/file
+
+ added information to file
注記
Git のバージョン 1.6.1 およびそれ以降では、--cached の代わりに --stag ed オプションを使う
ことができます。
2 .3.7 .2 . 変更のコミット
ステージング完了ファイルが正しいことをチェックして準備が整えば、変更をコミットします。
$ git commit
上記のコマンドで初期設定の際に選択されたエディターが起動するか、選択されていなければデフォルトの
Vim が起動します。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: filename2
# modified: filename1
~
~
~
".git/COMMIT_EDITMSG" 10L, 283C
41
開発者ガイド
上記のように、エディターには最新のステータスレポートも含まれますが、ハッシュ (#) のために実際のコ
ミットログでは見えません。コミットされる内容に関する情報を取得するには、g i t co mmi t で -v オプ
ションを指定します。コミットメッセージはここに記入するか、-m オプションでコマンドラインに記入す
ることができます。
$ git commit -m "commit message"
[master]: created 4156dc4f: "commit message"
2 files changed, 3 insertions(+), 1 deletions (-)
create mode 100644 filename
コミットメッセージは以下の情報を提供します。コミット先のブランチ (このケースではマスター)、コ
ミットにある SHA-1 チェックサム (4156dc4f)、変更されたファイル数、ファイル内の変更内容についての
統計情報。
注記
ステージング完了エリアは便利ですが、これをスキップすることは可能です。ただし、コミットの
準備ができていないものをコミットしてしまうリスクもあります。これは、g i t co mmi t で -a オ
プションを指定するとできます。
$ git status
# On branch master
#
# Changed but not updated:
#
# modified: filename
#
$ git commit -a -m 'commit message'
[master 16e15c7] commit message
1 files changed, 5 insertions(+), 2 deletions(-)
2.3.8. リモートのリポジトリ
プロジェクトを外部と共有するには、ネットワーク上もしくはインターネット上にあるリモートのリポジト
リにプロジェクトをプッシュします。リモートのディレクトリにプッシュできるようにするには、まず
ディレクトリを作成する必要があります。これには、g i t ad d [shortname] [URL] を実行します。
$ git remote add shortname git://path/to/new/repo
shortname は、リモートリポジトリ照会の際に URL の代わりに使うことができます。
これでリポジトリが追加されたので、リモートリポジトリのリストを印刷することができます。g i t
remo te コマンドで -v オプションを指定すると関連する URL と希望する場合は shortname も表示されま
す。新規リモートリポジトリが追加されていない場合でも、プロジェクトがクローンされていれば、少なく
ともクローン元のリポジトリが一覧表示されます。
$ git remote -v
repo-name git://path/to/new/remote-repository
origin git://path/to/original/remote-repository
42
⁠第2 章 協同作業
これで十分な情報が得られない場合は、g i t sho w [remote-repository] を実行すると、URL と Git
がこの特定のリポジトリで追跡しているブランチが一覧表示されます。
リモートリポジトリからデータを取得するには (例えば、プロジェクトで作業している誰かが新たな情報を
プッシュした場合)、以下のコマンドを使用します。
$ git fetch [remote-name]
これで、ローカルコピーと異なるすべての情報がこの特定のリモートホストからプルされます。別の方法と
しては、g i t pul l を実行すると、元のコピーのクローン元のリポジトリから同様の動作が実行されま
す。
より幅広い対象者とプロジェクトを共有するには、リモートリポジトリにプッシュすることが必要です。
$ git push remote-repository branch-name
このコマンドでは指定されたブランチが指定されたリポジトリにプッシュされますが、これはユーザーに書
き込みアクセスがある場合のみです。競合が発生する場合は、リモートリポジトリにプッシュする前に、新
規作業をプルしてからローカルバージョンに組み込みます。
最後に、リポジトリの名前を変更するには、g i t remo te rename original-name new-name を実
行します。この場合、リモートのブランチ名も変更されることに注意してください。リポジトリの削除も同
様に、g i t remo te rm remote-name を実行します。
2.3.9. ログのコミット
リポジトリとある程度作業を行い、変更やコミットを何回かした後に、これらの変更のログを確認する必要
があるかもしれません。これは g i t l o g コマンドで行います。このコマンドが引数なしで実行される
と、各コミットが最新のものから順に一覧表示され、コミットの日時、SHA-1 チェックサム、作成者の名
前および E メール、コミットメッセージが示されます。
これらのログには差分レポートを含めることが可能で、また特定のエントリ数で出力を制限することもでき
ます。例えば、g i t l o g -p -2 を実行すると、直近のエントリ 2 つの差分レポートと通常のログ情報が
一覧表示されます。
各コミットエントリの最後に統計情報を含めるには、g i t l o g --stat を使用します。このコマンドで
コミットメッセージの後に、変更済みファイルのリスト、変更されたファイル数、追加および削除された
行数、この情報のサマリーが含まれるようになります。
これらの便利なオプションの他に、このコマンドで指定できる多くのオプションがあります。
--sho rtstat
これは --stat オプションに似ていますが、表示されるのはコミットにおける変更、挿入、削除
のみです。
--name-o nl y
コミット情報の後に、変更済みのファイルのみを一覧表示します。
--name-status
変更、挿入、削除とともに変更済みファイルが一覧表示されます。
--abbrev-co mmi t
SHA-1 チェックサムの全 40 文字ではなく、最初の数文字のみが表示されます。
43
開発者ガイド
--rel ati ve-d ate
現在の日付に対して相対的な日付を表示します。例えば、T ue Jul y 10 : 53: 11 20 11 0 70 0 ではなく、2 weeks ag o (2 週間前) という表示をします。
--g raph D i spl ay
ログ出力のそばにブランチの ASCII グラフとマージ履歴を表示します。
--si nce= [date]
指定された日付以降のログを表示します。つまり、その日付以降、すべてのものです。日付は特
定の日付 (例: 2010-08-23) や相対的日付 (例: 1 年と 3 日 4 分前) のように異なる形式で入力可能
です。
--unti l = [date]
--si nce オプションと似ており、特定の日付までのログを表示します。つまり、その日付前ま
でのすべてのものです。
--autho r name
作成者フィールドで指定された名前のコミットのみを一覧表示します。
--co mmi tter name
コミッターフィールドで指定された名前のコミットのみを一覧表示します。
2.3.10. 問題の修正
何かに失敗して削除や取り消しが必要になる場合もあります。このセクションでは、この様なエラーを修正
する方法を説明します。
警告
ここは、Git でデータが永久に失われてしまう可能性のある数少いエリアの一つです。取り消しが実
行され、それをすべきでなかったことがわかった場合、失われたデータを回復できない可能性が非
常に高くなります。注意して実行してください。
エラーは、コミットを早くプッシュし過ぎたり、準備ができていないものをコミットしたり、コミット
メッセージでミスを犯したりすることで発生する場合が多くあります。このような場合は、--amend オプ
ションを指定して直近のコミットの上にコミットすることで修復可能です。
$ git commit --amend
ステージング完了ステータスのファイルが最後のコミットと異なる場合、コミットは元のファイルを無効
にする以外は通常通りに実行されます。ファイルが同じ場合は、再度コミットメッセージを変更して以前の
コミットを無効にするオプションが提示されます。
また、ステージング完了ファイルをステージング前に戻すこともできます。これは、2 つ以上の別個のコ
ミットを用意し、g i t ad d * が使われた場合に必要になることもあります。g i t status コマンドは、
これを行う方法についてのヒントを提示します。
# (use "git reset HEAD <file>..." to unstage)
44
⁠第2 章 協同作業
このアドバイスにしたがうには、g i t reset HEAD filename コマンドを使用します。すると、ファイ
ルはステージング完了ステータスではなく変更済みステータスに戻ります。
ファイルを直近のコミット状態に戻すには、ステージング完了ステータス前で g i t status コマンドが役
に立ちます。
# (use "git checkout -- <file>..." to discard changes in working
directory)
g i t checko ut -- filename コマンドを使ってこれらの指示に従うと、ファイルが元の状態に戻りま
す。ただし、前述の警告の繰り返しになりますが、この手順を行うと データが失われます。これを行う際に
は、対象のファイルのバージョンが必要ないことを必ず確認してください。
2.3.11. Git のドキュメンテーション
Git のメインの man ページは、man g i t で表示できます。ここでは、g i ttuto ri al (7)、Everyd ay
G i t[1]、g i tg l o ssary(7) などの他の man ページへのコマンドも紹介されています。
Git の公式ホームページは http://git-scm.com/ で、多くのドキュメンテーションをダウンロードできます。
以下の Web サイトでは、Git に関する詳細情報が提供されています。
基本的および高度な Git の指示に関する便利なブックがあります: http://progit.org/book/
Red Hat Magazine の次の記事です、『Shipping quality code with Git』:
http://magazine.redhat.com/2008/05/02/shipping-quality-code-with-git/
GNU Smalltalk Web サイトの次の記事です、『Using Git without feeling stupid - part 1』:
http://smalltalk.gnu.org/blog/bonzinip/using-git-without-feeling-stupid-part-1
GNU Smalltalk Web サイトの次の記事です、『Using Git without feeling stupid - part 2』:
http://smalltalk.gnu.org/blog/bonzinip/using-git-without-feeling-stupid-part-2
パッチの準備および E メール送信方法についての説明: http://logcheck.org/git.html
Git のコマンド早見表: http://cheat.errtheblog.com/s/git.
Tim Waugh 氏によるブログ 『How I use Git』: http://cyberelk.net/tim/2009/02/04/how-i-use-git/
ブログ記事 『Handling and avoiding conflicts in Git』 (Git での競合の処理および回避法) :
http://weblog.masukomi.org/2008/07/12/handling-and-avoiding-conflicts-in-git
『Branching and merging with Git』 (Git でのブランチングおよびマージ) :
http://lwn.net/Articles/210045/
『Getting the most out of Git in GNOME』 (GNOME で Git を最大限活用する方法) :
http://live.gnome.org/Git/D evelopers
『Integrating vim with Git』: http://vim.runpaint.org/extending/integrating-vim-with-git/
『Git Reference』: http://gitref.org/
『A successful Git branching model』: http://nvie.com/posts/a-successful-git-branching-model/
概説ガイド、『Git for the lazy』: http://www.spheredev.org/wiki/Git_for_the_lazy
『Git tricks, tips, and workflows』: http://nuclearsquid.com/writings/git-tricks-tips-workflows/
45
開発者ガイド
第3章 ライブラリおよびランタイムのサポート
Red Hat Enterprise Linux は、実績のある業界仕様のツールを使用して幅広いプログラム言語でカスタムア
プリケーションの開発をサポートします。本章では、Red Hat Enterprise Linux 7 で提供されているランタ
イムサポートのライブラリーについて説明します。
3.1. バージョン情報
以下の表では、Red Hat Enterprise Linux 7、Red Hat Enterprise Linux 6、Red Hat Enterprise Linux 5、
および Red Hat Enterprise Linux 4 の間でのサポート対象のプログラミング言語におけるランタイムサポー
トパッケージのバージョン情報を比較しています。
この表は完全なリストではなく、標準言語ランタイムの概略と Red Hat Enterprise Linux 7 で開発されたソ
フトウェアの主要依存関係になります。
表3.1 言語およびランタイムライブラリのバージョン
パッケージ名
R ed H at
En t erp rise 7
R ed H at
En t erp rise 6
R ed H at
En t erp rise 5
R ed H at
En t erp rise 4
g lib c
lib st d c+ +
b o o st
java
2.12
4.8
1.53
1.7
2.5
4.1
1.33
1.4、1.5、1.6
2.3
3.4
1.32
1.4
p yt h o n
php
ru b y
httpd
p o st g resq l
mysq l
n ss
o p en ssl
lib X11
f iref o x
kd eb ase
g t k2
2.7
5.4
2.0
2.4
9.2
5.4
3.15
1.0.1e
1.6
24.4
4.10
2.24
2.12
4.4
1.41
1.5 (IBM)、1.6
(IBM、
OpenJD K、
Oracle Java)
2.6
5.3
1.8
2.2
8.4
5.1
3.12
1.0.0
1.3
3.6
4.3
2.18
2.4
5.1
1.8
2.2
8.1
5.0
3.12
0.9.8e
1.0
3.6
3.5
2.10
2.3
4.3
1.8
2.0
7.4
4.1
3.12
0.9.7a
3.6
3.3
2.04
注記
co mpat-g l i bc RPM は Red Hat Enterprise Linux 7 に含まれていますが、ランタイムパッケージ
ではないので、何かの実行に必要というわけではありません。これはヘッダーファイルやリンク用
のダミーライブラリを含む、単なる開発パッケージです。これを使用することで、Red Hat
Enterprise Linux の古いバージョンでコンパイルおよびリンクのパッケージを実行することが可能
になります (それらのヘッダーおよびライブラリに co mpat-g cc-* を使用)。rpm -q pi
co mpat-g l i bc-* を実行すると、このパッケージの使用方法に関する情報が提供されます。
co mpat-g l i b の詳細については、「co mpat-g l i bc」 を参照してください。
46
⁠第3章 ライブラリおよびランタイムのサポート
3.2. 互換性
互換性は、コンピューターの稼働環境の異なるインスタンスにおけるバイナリオブジェクトとソースコード
の移植性を特定します。公式には、Red Hat は現行バージョンとそれ以前の 2 つのバージョンをサポート
します。つまり、Red Hat Enterprise Linux 4 および Red Hat Enterprise Linux 5 で作成されたアプリケー
ションは、それが Red Hat ガイドラインに準拠している限り (例えば、ホワイトリスト化された記号を使
用)、Red Hat Enterprise Linux 6 で稼働します。
Red Hat は、エンタープライズプラットフォームとしてお客様がそのアプリケーションの長期的開発に依
存していることを理解しています。このため、互換性ライブラリの助けを用いて C/C++ ライブラリに対し
て構築されたアプリケーションは、10 年間サポートが継続されます。
互換性には以下の 2 種類があります。
ソースの互換性
ソースの互換性は、コードが稼働環境の異なるインスタンスにおいて一貫性があり予測可能な方
法でコンパイルおよび実行することを指定します。この種類の互換性は、特定の Application
Programming Interfaces (API) との適合性で定義されます。
バイナリの互換性
バイナリの互換性は、実行可能ファイルおよび Dynamic Shared Objects (動的共有オブジェクト:
D SO) の形式でコンパイル済みバイナリが稼働環境の異なるインスタンスで正確に実行すること
を指定します。この種類の互換性は、特定の Application Binary Interfaces (ABI) との適合性で
定義されます。
この点と、コアおよび非コアライブラリー間の全レベルでの互換性についての詳細情報は、Red Hat
Enterprise Linux のサポート対象リリースを参照してください。こちらになりま
す、https://access.redhat.com/support/policy/updates/errata/。また、Red Hat Enterprise Linux の互換
性ポリシー全般は、https://access.redhat.com/site/articles/119073 を参照してください。
3.2.1. 静的リンク
静的リンクは、すべての Red Hat Enterprise Linux リリースで使用しないことが強く推奨されます。静的
リンクは解決するよりもはるかに多くの問題を生み出し、ぜひとも避けるべきです。
静的リンクの主な欠点は、それが構築されたシステム上での動作のみが保証されており、それも glibc もし
くは libstdc++ (C++ の場合) の次回リリースまでです。静的構築では、前方もしくは後方互換性がありませ
ん。さらに、以降のライブラリの更新におけるセキュリティ修正は、影響のある静的にリンクされた実行可
能ファイルが再度リンク化されない限り、利用可能にはなりません。
静的リンクを避ける他の理由は以下のとおりです。
メモリフットプリントが大きい。
アプリケーションの起動時間が長い。
静的リンクだと glibc 機能が限定される。
ロードアドレスのランダム化などのセキュリティ対策が使用できない。
glibc 外の共有オブジェクトの動的ローディングがサポートされていない。
静的リンクを避けるさらなる理由については、Static Linking Considered Harmful を参照してください。
3.3. ライブラリおよびランタイムの詳細
47
開発者ガイド
3.3.1. co mpat-g l i bc
co mpat-g l i bc は、以前のバージョンの Red Hat Enterprise Linux からの共有静的ライブラリのサブ
セットを提供します。Red Hat Enterprise Linux 6 では、以下のライブラリが提供されます。
l i banl
l i bci d n
l i bcrypt
l i bc
l i bd l
l i bm
l i bnsl
l i bpthread
l i breso l v
l i brt
l i bthread _d b
l i buti l
このライブラリセットにより、アプリケーションが上記のライブラリのみを使用するという条件で、開発者
は Red Hat Enterprise Linux 7 で Red Hat Enterprise Linux 6 のアプリケーションを作成することができ
ます。これを行うには、以下のコマンドを実行してください。
# g cc -fg nu89 -i nl i ne -I /usr/l i b/x86 _6 4 -red hat-l i nux5E/i ncl ud e -B
/usr/l i b/x86 _6 4 -red hat-l i nux5E/l i b6 4 / -l c_no nshared
重要
ソースの重複または memcpy および他の関数の対象メモリーの場所に関して ISO 違反となるアプリ
ケーションは、失敗する可能性が高くなります。
3.3.2. GNU C+ + 標準ライブラリ
l i bstd c+ + パッケージには GNU C++ 標準ライブラリが含まれています。これは ISO 14882 標準 C++
ライブラリを実装するための進行中のプロジェクトです。
l i bstd c+ + パッケージをインストールすると、リンクの依存関係が十分に満たされます (つまり、共有ラ
イブラリファイルのみ)。C++ 開発で使用可能なライブラリおよびヘッダーファイルのすべてを活用するに
は、l i bstd c+ + -d evel もインストールする必要があります。l i bstd c+ + -d evel には、GNU 固有の
標準テンプレートライブラリ (STL) の実装も含まれています。
Red Hat Enterprise Linux 4、5、6 では、C++ 言語およびランタイムの実装は安定しており、このため
l i bstd c+ + に互換性ライブラリは必要ありません。しかし、Red Hat Enterprise Linux 2 および 3 で
は、これは該当しません。Red Hat Enterprise Linux 2 では、co mpat-l i bstd c+ + -29 6 のインストー
ルが必要になります。Red Hat Enterprise Linux 3 では、co mpat-l i bstd c+ + -33 のインストールが必
要になります。どちらもデフォルトではインストールされていないので、別個に追加する必要があります。
48
⁠第3章 ライブラリおよびランタイムのサポート
3.3.2 .1 . GNU C++ 標準ライブラリ更新
Red Hat Enterprise Linux 6 バージョンの GNU C++ 標準ライブラリでは、Red Hat Enterprise Linux 5
バージョンと比較して以下の改善がなされています。
ISO C++ TR1 要素でサポートが強化。具体的には以下の通りです。
<tr1/array>
<tr1/co mpl ex>
<tr1/memo ry>
<tr1/functi o nal >
<tr1/rand o m>
<tr1/reg ex>
<tr1/tupl e>
<tr1/type_trai ts>
<tr1/uno rd ered _map>
<tr1/uno rd ered _set>
<tr1/uti l i ty>
<tr1/cmath>
今後の ISO C++ 標準、C++0x の要素のサポート強化。以下の要素が含まれます。
<array>
<chro no >
<co nd i ti o n_vari abl e>
<fo rward _l i st>
<functi o nal >
<i ni tal i zer_l i st>
<mutex>
<rand o m>
<rati o >
<reg ex>
<system_erro r>
<thread >
<tupl e>
<type_trai ts>
<uno rd ered _map>
49
開発者ガイド
<uno rd ered _set>
-fvi si bi l i ty コマンドのサポート強化。
以下の拡張子を追加。
__g nu_cxx: : typel i st
__g nu_cxx: : thro w_al l o cato r
Red Hat Enterprise Linux の l i bstd c+ + の更新に関する詳細情報は、以下のドキュメントの 『C++
Runtime Library』 セクションを参照してください。
『GCC 4.2 Release Series Changes, New Features, and Fixes』: http://gcc.gnu.org/gcc4.2/changes.html
『GCC 4.3 Release Series Changes, New Features, and Fixes』: http://gcc.gnu.org/gcc4.3/changes.html
『GCC 4.4 Release Series Changes, New Features, and Fixes』: http://gcc.gnu.org/gcc4.4/changes.html
3.3.2 .2 . GNU C++ 標準ライブラリドキュメンテーション
ライブラリコンポーネントの man を使用するには、l i bstd c+ + -d o cs パッケージをインストールしま
す。これで、ライブラリが提供するほとんどすべてのリソースの man ページ情報が提供されます。例え
ば、vecto r コンテナについての情報を表示するには、その完全修飾コンポーネント名を使用します。
man std : : vecto r
これで以下の情報が表示されます (一部省略)
std::vector(3)
std::vector(3)
NAME
std::vector A standard container which offers fixed time access to individual
elements in any order.
SYNOPSIS
Inherits std::_Vector_base< _Tp, _Alloc >.
Public Types
typedef _Alloc allocator_type
typedef __gnu_cxx::__normal_iterator< const_pointer, vector >
const_iterator
typedef _Tp_alloc_type::const_pointer const_pointer
typedef _Tp_alloc_type::const_reference const_reference
typedef std::reverse_iterator< const_iterator >
l i bstd c+ + -d o cs パッケージは、以下のディレクトリで HTML 形式のマニュアルおよび参照情報を提供
します。
fi l e: ///usr/share/d o c/l i bstd c+ + -d o cs-version/html /spi ne. html
libstdc++ 開発のメインサイトは gcc.gnu.org です。
50
⁠第3章 ライブラリおよびランタイムのサポート
3.3.3. Boost
bo o st パッケージには、ピア・レビューされた多くの無償の移植可能な C++ ソースライブラリがありま
す。これらのライブラリは、移植可能なファイルシステムおよび時間/日付抽象化、シリアル化、ユニット
テスト、スレッド作成およびマルチプロセス同期化、解析、グラフ化、正規表現の操作など、その他多くの
タスクに適しています。
bo o st パッケージのインストールは、リンクの依存関係を十分に満たします (つまり、共有ライブラリ
ファイルのみ)。C++ 開発で使用可能なライブラリおよびヘッダーファイルのすべてを活用するに
は、bo o st-d evel もインストールする必要があります。
bo o st は実際にはメタパッケージで、多くのライブラリのサブパッケージが含まれています。これらのサ
ブパッケージは個別にインストールして、より詳細なパッケージ間の依存関係の追跡を提供することもでき
ます。メタパッケージには、以下のサブパッケージすべてが含まれます。
bo o st-d ate-ti me
bo o st-fi l esystem
bo o st-g raph
bo o st-i o streams
bo o st-math
bo o st-pro g ram-o pti o ns
bo o st-pytho n
bo o st-reg ex
bo o st-seri al i zati o n
bo o st-si g nal s
bo o st-system
bo o st-test
bo o st-thread
bo o st-wave
静的リンク用のパッケージまたは基礎的 Message Passing Interface (MPI) サポートに依存するパッケー
ジは、メタパッケージに含まれません。
MPI サポートは 2 つの形式で提供されます: ひとつはデフォルトの Open MPI 実装で ⁠ [1] 、もうひとつは代
替の MPICH2 実装です。使用する基礎的 MPI ライブラリはユーザーが決定でき、特定のハードウェア詳細
とユーザーの好みによります。インストール済みファイルは一意のディレクトリの場所にあることから、こ
れらのパッケージは並行してインストールできることに注意してください。
Open MPI:
bo o st-o penmpi
bo o st-o penmpi -d evel
bo o st-g raph-o penmpi
bo o st-o penmpi -pytho n
51
開発者ガイド
MPICH2:
bo o st-mpi ch2
bo o st-mpi ch2-d evel
bo o st-g raph-mpi ch2
bo o st-mpi ch2-pytho n
静的リンクが避けられない場合は、bo o st-stati c パッケージが必要な静的ライブラリをインストールし
ます。スレッド対応と単一スレッドの両方のライブラリが提供されます。
3.3.3.1 . Bo o st 更新
Red Hat Enterprise Linux 6 バージョンの Boost 機能はパッケージ化で多くの改善があり、また新機能も
あります。
bo o st パッケージのいくつかの側面が変更されています。上記のように、モノリシックなbo o st パッ
ケージは、より小型の別個のサブパッケージで増強されてきました。これでユーザーは依存関係の管理がよ
り広くできるようになり、Boost を使用するカスタムアプリケーションをパッケージする際はより小型のバ
イナリパッケージが可能になっています。
さらに、全ライブラリのシングルスレッドとマルチスレッドバージョンがパッケージ化されています。マ
ルチスレッドバージョンには、通常の Boost 慣習の通りに mt 接尾辞が含まれています。
Boost には以下の新たなライブラリ機能もあります。
Foreach
Statechart
TR1
Typeof
Xpressive
Asio
Bitmap
Circular Buffer
Function Types
Fusion
GIL
Interprocess
Intrusive
Math/Special Functions
Math/Statistical D istributions
MPI
System
52
⁠第3章 ライブラリおよびランタイムのサポート
Accumulators
Exception
Units
Unordered
Proto
Flyweight
Scope Exit
Swap
Signals2
Property Tree
既存ライブラリの多くは改善されバグ修正されているか、強化されています。
3.3.3.2 . Bo o st ドキュメンテーション
bo o st-d o c パッケージは、以下のディレクトリで HTML 形式のマニュアルおよび参照情報を提供しま
す。
fi l e: ///usr/share/d o c/bo o st-d o c-version/i nd ex. html
Boost 開発のメインサイトは boost.org です。
3.3.4 . Qt
q t パッケージは、GUI プログラム開発に使用される Qt (「cute」と発音) クロスプラットフォームアプリ
ケーション開発フレームワークを提供します。人気のあるウィジェットツールキットというだけでなく、
Qt はコンソールツールやサーバーといった非 GUI プログラムの開発にも使用されます。Qt は、Google
Earth や KD E、Opera、OPIE、VoxOx、Skype、VLC メディアプレーヤー、VirtualBox といったすぐれ
たプロジェクトの開発に使用されました。これは、Nokiaの Qt 開発フレームワーク部門にが開発しまし
た。この部門は、Qt の元々の作成者であるノルウェーの会社 Trolltech を Nokia が 2008 年 6 月 17 日に
買収した後に組織されました。
Qt は標準 C++ を使用しますが、Meta Object Compiler (MOC) と呼ばれる特別なプリプロセッサを大幅に使
用して言語を豊かなものにします。Qt は言語バインディングで他のプログラミング言語でも使用できま
す。すべての主要プラットフォームで作動し、広範囲の国際的サポートがあります。非 GUI Qt 機能には、
SQL データベースアクセス、XML 解析、スレッド管理、ネットワークサポート、ファイル処理用の統一の
クロスプラットフォーム API が含まれます。
Qt は GNU 一般公衆利用許諾契約書 (GPL) の下で配布される無償かつオープンソースのソフトウェアで
す。Qt の Red Hat Enterprise Linux 6 バージョンは、GCC C++ コンパイラーおよび Visual Studio ス
イートを含む幅広いコンパイラーをサポートします。
3.3.4 .1 . Qt 更新
Qt の Red Hat Enterprise Linux 6 バージョンでの改善点は以下のとおりです。
高度なユーザーエクスペリエンス
Ad van ced G rap h ics Ef f ect s: 不透明度やドロップシャドウ、ぼかし、彩色、その他の類似の効
果のオプション
53
開発者ガイド
An imat io n an d St at e Mach in e: 複雑なコード管理の混乱なしにシンプルまたは複雑なアニメー
ションを作成
ジェスチャーおよびマルチタッチのサポート
新たなプラットフォームのサポート
Windows 7、Mac OSX 10.6、およびその他のデスクトッププラットフォームをサポート
モバイル開発用の新たなサポート; Qt は、予定されている Maemo 6 プラットフォームに最適化され
ており、まもなく Maemo 5 にポートされます。さらに、Qt は今では S60 フレームワーク向けの統
合で Symbian プラットフォームをサポートしています。
QNX や VxWorks などのリアルタイムのオペレーティングシステム向けの新たなサポート
(他のレンダリング更新に加えて) ハードウェアアクセラレータによるレンダリングの新たなサポートを
加えたことによるパフォーマンスの改善。
クロスプラットフォーム ID E の更新
Red Hat Enterprise Linux 6 に含まれる Qt の更新に関する詳細は、以下のリンクを参照してください。
http://doc.qt.nokia.com/4.6/qt4-6-intro.html
http://doc.qt.nokia.com/4.6/qt4-intro.html
3.3.4 .2 . Qt Cre at o r
Q t C reat o r は、Qt 開発者の要件に合わせたクロスプラットフォーム ID E です。以下のグラフィカルツー
ルが含まれます。
高度な C++ コードエディター
統合 GUI レイアウトおよびフォームデザイナー
プロジェクトおよびビルド管理ツール
コンテキストを感知する統合ヘルプシステム
視覚デバッガー
ラピッドコードナビゲーションツール
3.3.4 .3. Qt ライブラリドキュメンテーション
q t-d o c パフォーマンスは、/usr/share/d o c/q t4 /html / にある HTML マニュアルおよびリファレ
ンスを提供します。このパッケージは、『Qt Reference D ocumentation』 も提供し、これは Qt フレーム
ワーク内での開発に絶好の出発点となります。
q t-d emo s や q t-exampl es からさらなるデモや例をインストールすることもできます。Qt フレーム
ワークの機能の概要については、/usr/bi n/q td emo -q t4 (q t-d emo s が提供) を参照してください。
3.3.5. KDE 開発フレームワーク
kd el i bs-d evel パッケージは、KD E ライブラリを提供します。これは、Qt 上でビルドしてアプリケー
ション開発を容易にするフレームワークを提供します。KD E 開発フレームワークは、KD E デスクトップ環
境にわたって一貫性を提供する手助けにもなります。
3.3.5 .1 . KDE4 アーキテクチャ
54
⁠第3章 ライブラリおよびランタイムのサポート
Red Hat Enterprise Linux の KD E 開発フレームワークのアーキテクチャーは KD E4 を使用しており、これ
は以下のテクノロジーで構築されています。
Plasma
Plasma は KD E4 で KD esktop の代わりとなるものです。この実装はQ t G rap h ics View
Framewo rk に基づいており、これは Qt 4.2 で導入されました。Plasma についての詳細
は、http://techbase.kde.org/D evelopment/Architecture/KD E4/Plasma を参照してください。
So n n et
So n n et は、自動言語検出やプライマリ/バックアップ辞書、その他の便利な機能をサポートする
多言語スペルチェックアプリケーションです。これは KD E4 で kspel l 2 に代わるものです。
K IO
KIO ライブラリは、ネットワーク透過ファイル処理用のフレームワークを提供し、ユーザーは
ネットワーク透過プロトコルによるファイルアクセスが容易になります。また、標準ファイルダ
イアログの提供にも役立ちます。
K JS/K H T ML
KJS and KHTML は、(ko n q u ero r のように) KD E4 にネイティブな異なるアプリケーションが
使用する、本格的な JavaScript および HTML エンジンです。
So lid
So lid は、ハードウェアおよびネットワーク認識フレームワークで、これを使用することでハー
ドウェア対話機能でアプリケーションを開発できます。その包括的 API が必要な抽象化を提供
し、クロスプラットフォームアプリケーションの開発をサポートします。詳細情報について
は、http://techbase.kde.org/D evelopment/Architecture/KD E4/Solid を参照してください。
Ph o n o n
Ph o n o n は、そのマルチメディア機能でアプリケーション開発をサポートするマルチメディア
フレームワークです。KD E 内のメディア機能の使用を容易にします。詳細について
は、http://techbase.kde.org/D evelopment/Architecture/KD E4/Phonon を参照してください。
T elep at h y
T elep at h y は、KD E4 内でのリアルタイムの通信および共同作業のフレームワークを提供しま
す。主要機能は、KD E 内の異なるコンポーネント間の融合を高めることです。このプロジェクト
に関する概要は、http://community.kde.org/Real-Time_Communication_and_Collaboration
を参照してください。
Ako n ad i
Ako n ad i は、Parallel Infrastructure Management (PIM) コンポーネントの一元保存用のフレーム
ワークを提供します。詳細
は、http://techbase.kde.org/D evelopment/Architecture/KD E4/Akonadi を参照してください。
K D E4 内のオンラインヘルプ
KD E4 には、アプリケーションにオンラインヘルプ機能を追加する Qt ベースの操作が容易なフ
レームワークもあります。この機能に含まれるのは、ツールヒントやホバーヘルプ情
報、kh elp cen t er マニュアルなどです。KD E4 内のオンラインヘルプの概要について
は、http://techbase.kde.org/D evelopment/Architecture/KD E4/Providing_Online_Help を参照
してください。
K XMLG U I
55
開発者ガイド
K XMLG U I は、XML を使用するユーザーインターフェイス設計用のフレームワークです。このフ
レームワークを使用すると、ソースコードを改訂することなく (開発者が定義する)「アクショ
ン」に基づいて UI 要素を定義することができます。詳細情報
は、http://techbase.kde.org/D evelopment/Architecture/KD E4/XMLGUI_Technology を参照し
てください。
St rig i
St rig i は、多くのデスクトップ環境およびオペレーティングシステムに互換性のあるデスクトッ
プ検索デーモンです。自身の jst ream システムを使用することで、深いファイルのインデック
ス化が可能になります。St rig i 開発の詳細情報
は、http://www.vandenoever.info/software/strigi/ を参照してください。
K N ewSt u f f 2
K N ewSt u f f 2 多くの KD E4 アプリケーションが使用する共同作業データ共有ライブラリです。
詳細情報は、http://techbase.kde.org/Projects/KNS2 を参照してください。
3.3.5 .2 . kde libs ドキュメンテーション
kd el i bs-api d o cs パッケージは、/usr/share/d o c/HT ML/en/kd el i bs4 -api d o cs/ で KD E
開発フレームワーク用の HTML ドキュメンテーションを提供します。以下のリンクも KD E 関連のプログラ
ミングタスクに関する詳細情報を提供します。
http://techbase.kde.org/
http://techbase.kde.org/D evelopment/Tutorials
http://techbase.kde.org/D evelopment/FAQs
http://api.kde.org
3.3.6. GNOME の電源管理
GNOME 電源管理インフラストラクチャーのバックエンドプログラミングは、g no me-po wer-manag er
です。これは、Red Hat Enterprise Linux 5 で導入されており、GNOME デスクトップ環境下で完全かつ統
合された電源管理のソリューションを提供します。Red Hat Enterprise Linux 6 では、hal のストレージ
処理部分は ud i sks に代わって、l i bg no mepri nt スタックは g tk2 のプリントサポートに代わってい
ます。
3.3.6 .1 . GNOME の電源管理バージョンガイド
本セクションでは、どのバージョンの g no me-po wer-manag ement が Red Hat Enterprise Linux のどの
バージョンと同梱されているかを説明します。
ただし、一般的に Red Hat Enterprise Linux 4 には GNOME 2.8 が、Red Hat Enterprise Linux 5 には
GNOME 2.16 が、Red Hat Enterprise Linux 6 には GNOME 2.28 が同梱されています。
表3.2 デスクトップコンポーネントの比較
R ed H at En t erp rise Lin u x バージョン
G N O ME の電源管理の
デスクトップコンポー
ネント
4
5
6
hal
udisks
0.4.2
該当なし
0.5.8
該当なし
0.5.14
1.0.1
56
⁠第3章 ライブラリおよびランタイムのサポート
R ed H at En t erp rise Lin u x バージョン
G N O ME の電源管理の
デスクトップコンポー
ネント
4
5
6
glib2
gtk2
gnome-vfs2
libglade2
libgnomecanvas
gnome-desktop
gnome-media
gnome-python2
libgnome
libgnomeui
libgnomeprint22
libgnomeprintui22
gnome-session
gnome-power-manager
gnome-applets
gnome-panel
2.4.7
2.4.13
2.8.2
2.4.0
2.8.0
2.8.0
2.8.0
2.6.0
2.8.0
2.8.0
2.8.0
2.8.0
2.8.0
該当なし
2.8.0
2.8.1
2.12.3
2.10.4
2.16.2
2.6.0
2.14.0
2.16.0
2.16.1
2.16.0
2.16.0
2.16.0
2.12.1
2.12.1
2.16.0
2.16.0
2.16.0
2.16.1
2.22.5
2.18.9
2.24.2
2.6.4
2.26.0
2.28.2
2.29.91
2.28.0
2.28.0
2.24.1
該当なし
該当なし
2.28.0
2.28.3
2.28.0
2.30.2
3.3.6 .2 . glib 向けの API 変更
バージョン間では多くの glib 向け API 変更があります。
バージョン 2.4 からバージョン 2.12
バージョン 2.4 とバージョン 2.12 間 (もしくは Red Hat Enterprise Linux 4 と Red Hat Enterprise
Linux 5) での glib の違いは以下の通りです。
GOption (コマンドラインオプション解析)
GKeyFile (key/ini ファイル解析)
GObject トグルリファレンス
GMappedFile (マップラッパー)
GSlice (高速メモリアロケータ)
GBookmarkFile (ブックマークファイル解析)
Base64 エンコーディングサポート
s390 上のネイティブアトミックオプション
5 へのユニコードサポートの更新
GObject 用のアトミックな参照カウント
バージョン 2.12 からバージョン 2.22
バージョン 2.12 とバージョン 2.22 間 (もしくは Red Hat Enterprise Linux 5 と Red Hat Enterprise
Linux 6) での glib の違いは以下の通りです。
57
開発者ガイド
GSequence (バランスツリーとして実装されたリストデータ構造)
GRegex (PCRE regex ラッパー)
単調クロックのサポート
XD G ユーザーディレクトリのサポート
GIO (gnome-vfs の代わりとなる VFS ライブラリ)
GChecksum (MD 5 や SHA-256 などのハッシュアルゴリズムのサポート)
GTest (テストフレームワーク)
GIO におけるソケットおよびネットワーク IO のサポート
GHashTable パフォーマンスの改善
GMarkup パフォーマンスの改善
新規および廃止予定の API のインデックスを含む glib のドキュメンテーションは、glib2-devel パッケージ
に同梱されています。
3.3.6 .3. GTK+での API 変更
バージョン間では多くの GTK+ 向け API 変更があります。
バージョン 2.4 からバージョン 2.10
バージョン 2.4 とバージョン 2.10 間 (もしくは Red Hat Enterprise Linux 4 と Red Hat Enterprise
Linux 5) での GTK+ の違いは以下の通りです。
GtkIconView
GtkAboutD ialog
GtkCellView
GtkFileChooserButton
GtkMenuToolButton
GtkAssistant
GtkLinkButton
GtkRecentChooser
GtkCellRendererCombo
GtkCellRendererProgress
GtkCellRendererAccel
GtkCellRendererSpin
GtkStatusIcon
印刷のサポート
メモ帳タブ D ND サポート
58
⁠第3章 ライブラリおよびランタイムのサポート
ラベル、進捗状況バー、ツリービューでの Ellipsisation サポート
回転したテキストのサポート
Themability の改善
バージョン 2.10 からバージョン 2.18
バージョン 2.10 とバージョン 2.18 間 (もしくは Red Hat Enterprise Linux 4 と Red Hat Enterprise
Linux 5) での GTK+ の違いは以下の通りです。
GtkScaleButton
GtkVolumeButton
GtkInfoBar
libglade に代わる GtkBuilder
新たなツールヒント API
GtkMountOperation
gtk_show_uri
スケールマーク
ラベルのリンク
ランタイムフォント設定変更のサポート
GIO の使用
新規および廃止予定の API のインデックスを含む GTK+ のドキュメンテーションは、gtk2-devel パッケー
ジに同梱されています。
3.3.7. NSS 共有データベース
NSS 3.12 で導入された NSS 共有データベース形式は、Red Hat Enterprise 6 で利用可能となりました。
これには、アクセスおよびユーザビリティを改善する数多くの機能とコンポーネントが含まれています。
これには NSS 認証およびキーデータベースが含まれており、これらは SQLite ベースで同時アクセスを可
能にします。レガシーの key3. d b と cert8. d b も key4 . d b と cert9 . d b と呼ばれる新たな SQL
データベースで置換されています。これらの新規データベースは PKCS #11 トークンオブジェクトを保存
します。これらは、現在 cert8. d b および key3. d b に保存されているものと同一のものです。
共有データベースのサポートがあることで、システムワイドの NSS データベースが可能になります。これ
は /etc/pki /nssd b に配置されており、ここではグローバルに信頼された CA 認証がすべてのアプリ
ケーションでアクセス可能になります。rv = NSS_Ini tR ead Wri te("sq l : /etc/pki /nssd b"); コ
マンドは、アプリケーション用に NSS を初期化します。アプリケーションを root 権限で実行中の場合
は、システムワイドのデータベースが読み込みおよび書き込みで利用可能になります。しかし、アプリケー
ションが通常のユーザー権限で実行中の場合は、読み込み可能のみとなります。
また、NSS 用の PEM PKCS #11 モジュールは、PEM 形式ファイルに保存されているメモリ認証書および
キーへのアプリケーションのロードを可能にします (例えば、openssl 作成のものなど)。
3.3.7 .1 . 後方互換性
NSS アップストリームで生成された バイナリ互換性の保証は、Red Hat Enterprise Linux 6 では NSS で
59
開発者ガイド
保持されます。この保証は、NSS 3.12 はすべての古い NSS 3.x の共有ライブラリと後方互換性があるとし
ています。このため、古い NSS 3.x の共有ライブラリとリンクしているプログラムは再コンパイルや再リ
ンクなしで機能します。また、NSS API の使用を NSS 公開機能に限定するアプリケーションは、NSS 共
有ライブラリの今後のバージョンと互換性を保ちます。
Red Hat Enterprise Linux 5 および 4 は、Red Hat Enterprise Linux 6 と同様のバージョンの NSS で稼働
します。このため、ABI や API の変更はありません。しかし、Red Hat Enterprise Linux 6 では内部の暗号
化モジュールは NSS 3.12 からのものであるのに対し、Red Hat Enterprise Linux 5 と 4 では未だに NSS
3.15 からの古いものを使用しているため、違いは存在します。つまり、共有データベースなどの NSS 3.12
で導入された新たな機能は、Red Hat Enterprise Linux 6 のバージョンの NSS で利用可能となります。
3.3.7 .2 . NSS 共有データベース のドキュメンテーション
Mozilla の wiki ページでは、システムワイドのデータベースの原理を詳細にわたって説明しています。『こ
ちら』 からアクセスできます。
3.3.8. Pyt hon
pytho n パッケージは、Python プログラミング言語のサポートを追加します。このパッケージは、基本的
な Python プログラムのランタイムサポートの有効化に必要なオブジェクトとキャッシュバイトコード
ファイルを提供します。また、pytho n インタープリターと pyd o c ドキュメンテーションツールも含まれ
ています。pytho n-d evel パッケージには、Python 拡張の開発に必要なライブラリおよびヘッダーファ
イルが含まれています。
Red Hat Enterprise Linux には多くの pytho n 関連パッケージも同梱されています。慣習として、これら
パッケージの名前には、pytho n 接頭辞もしくは接尾辞が付いています。このようなパッケージは、ライブ
ラリの拡張機能か既存ライブラリへの Python バインディングのどちらかです。例えば、d bus-pytho n
は D -Bus用の Python 言語バインディングです。
キャッシュされたバイトコード (*. pyc/*. pyo ファイル) と コンパイルされた拡張モジュール (*. so
files) の両方が Python 2.4 (Red Hat Enterprise Linux 5 で使用)、Python 2.6 (Red Hat Enterprise Linux
6 で使用)、および Python 2.7 (Red Hat Enterprise Linux 7 で使用) の間で互換性がないことに注意してく
ださい。このため、Red Hat Enterprise Linux の一部でない拡張モジュールはユーザーが再構築する必要が
あります。
3.3.8 .1 . Pyt ho n 更新
Red Hat Enterprise Linux 7 は Python 2.7 と出荷されています。この変更に関する情報は、以下のプロ
ジェクトリソースを参照してください。
What's New in Python 2.7: http://docs.python.org/dev/whatsnew/2.7.html
どちらのサイトにも、Python の以前のバージョンを使用して開発したコードのポートに関するアドバイス
が含まれています。
60
⁠第3章 ライブラリおよびランタイムのサポート
重要
Python は、C 拡張モジュールで使用するさまざまな API を提供します。この 1 つであった
PyCObject は、Python 2.7 では非推奨となっています。デフォルトでは非推奨の警告が無視される
ため、通常は問題が発生しません。
ただし、標準の警告設定が上書きされると、PyCObject を使用するモジュールでインポートが成功
するとみなされて、問題が発生する場合があります。特に、警告が「エラー」に設定されている場合
は、そのようなモジュールをインポートする際に NULL ポインターで読み込むため、Python インタ
プリターが中止したり、さらにはセグメンテーション違反となる可能性もあります。
errors-for-warnings を有効にしてこれらのモジュールを使用するには、上書きを追加して、例外を
発生する代わりに P end i i ng D eprecati o nWarni ng をログ記録するようにします。
>>> import warnings
>>> warnings.simplefilter('error')
>>> warnings.simplefilter('default', PendingDeprecationWarning)
3.3.8 .2 . Pyt ho n デバッグビルド
Red Hat Enterprise Linux 7 では、python-debug パッケージに Python インタプリターのデバッグビルド
が含まれています。
デバッグインタプリター (/usr/bi n/pytho n-d ebug にある) は 最適化インタプリター
(/usr/bi n/pytho n にある) のおよそ半分の速度で実行し、再構築する拡張モデルを必要としますが、
Python C 拡張モジュールの書き込みおよびデバッグ時にはまだ使用されます。デバッグビルド内では、最
適化レベルは下げられており、デバッガー内でのコードのステップが容易になっています。
デバッグビルドは、以下の新たなデバッグ設定で構成されています。
--wi th-pyd ebug
sys. g etto tal refco unt() や sys. g eto bjects() などのように、sys に各種の便利なメ
ソッドを追加します。
--wi th-co unt-al l o cs
C O UNT _ALLO C S 設定を有効にして sys. g etco unts() メソッドを追加し、すべての型の情報
を提供します。プロセスが存在するときは、デフォルトのアップストリーム動作は常にこの情報
を std o ut にダンプします。これはダウンストリームに更新されるので、情報は
P Y T HO ND UMP C O UNT S が環境で設定されていれば、終了時にのみダンプされます。
--wi th-cal l -pro fi l e
C ALL_P R O FILE 設定を有効にします。これは実行される関数呼び出し数と、インタプリターに
よるこれらの呼び出しの処理方法をカウントします。
--wi th-tsc ( x86 _6 4 および p p c6 4 のみ)
sys. settscd ump() メソッドを追加し、インタプリターの非常に低レベルのプロファイリング
を追加します。
61
開発者ガイド
デバッグビルドは通常の最適化ビルドと同様のバイトコードファイルを使用しますが、拡張モジュール
(. so files) は互換性がありません。これは、Python オブジェクトのメモリー内レイアウトが外部インスト
ルメントを理由に異なるためです。最適化拡張モデルの foo. so が与えられると、デバッグビルドは
foo_d . so を探すように更新されます。
デバッグビルドおよびその設定についての詳細は、アップストリームの注意書き
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt を参照してください。
3.3.8 .3. Pyt ho n ドキュメンテーション
Python に関する詳細情報は、man pytho n を参照してください。また、pytho n-d o cs をインストール
することもできます。これは、以下の場所で HTML マニュアルとリファレンスを提供します。
fi l e: ///usr/share/d o c/pytho n-d o cs-version/html /i nd ex. html
ライブラリおよび言語コンポーネントについては、pyd o c component_name を使用してください。例え
ば、pyd o c math は math Python モジュールについて以下の情報を表示します。
Help on module math:
NAME
math
FILE
/usr/lib64/python2.6/lib-dynload/mathmodule.so
DESCRIPTION
This module is always available. It provides access to the
mathematical functions defined by the C standard.
FUNCTIONS
acos[...]
acos(x)
Return the arc cosine (measured in radians) of x.
acosh[...]
acosh(x)
Return the hyperbolic arc cosine (measured in radians) of x.
asin(...)
asin(x)
Return the arc sine (measured in radians) of x.
asinh[...]
asinh(x)
Return the hyperbolic arc sine (measured in radians) of x.
Python 開発プロジェクトのメインサイトは、python.org になります。
3.3.9. Java
Red Hat Enterprise Linux 7 は最新バージョンの JD K と出荷されるように常に更新されています。
62
⁠第3章 ライブラリおよびランタイムのサポート
java-version_number-o penjd k パッケージは、Java プログラミング言語のサポートを追加しま
す。このパッケージは java インタープリターを提供します。java-version_number-o penjd kd evel パッケージには、Java 拡張の開発に必要なライブラリーおよびヘッダーファイルのほか、javac
コンパイラーが含まれています。
Red Hat Enterprise Linux には多くの java 関連パッケージも同梱されています。慣習として、これら
パッケージの名前には、java 接頭辞もしくは接尾辞が付いています。
3.3.9 .1 . Java の機能
Red Hat Enterprise Linux 7 では、Java に以下のような多くの新機能が備わっています。
動的型付け言語のサポート ( In vo keD yn amic)
Hotspot、Open JD K の Java Virtual Machine (JVM) に機能強化がなされました。これは、静的
型付け言語および Java そのものと比較して最小限のパフォーマンスコストで動的型付け言語を
サポートするように設計されています。具体的には、invokedynamic 命令が Java バイトコード
仕様に追加され、JVM で実装されています。
小規模の言語機能強化 ( Pro ject C o in )
プログラマーに利便性とより洗練されたコードを提供し、いくつかの一般的なプログラミングエ
ラーを削減する、多くの Java 言語レベルの改善。
swit ch の文字列
以前のバージョンの Java では、switch ステートメントは byte、short、char、および int のプ
リミティブ型とそれらに対応するオブジェクト型、さらには列挙型を許可していました。Java 7
の switch ステートメントでは、文字列値も使用できます。
バイナリ整数リテラルおよび数値リテラルにおけるアンダースコア
プログラマーはバイナリ形式で整数リテラルを表示するか、アンダースコアで数値リテラルの桁
のグループを分けることで、コードの読みやすさが改善されています。
マルチ cat ch
Java の catch 構文が改善され、単一の catch 節に 1 つ以上の例外タイプをキャッチして、重複
コードを減らすことができます。
より正確な再スロー
Java 7 コンパイラーが改善され、例外をキャッチ、再スローするメソッドがいくつかの状況では
メソッド宣言のスロー節でより正確にすることができます。
ジェネリックインスタンス作成の型の推論における改善 ( d iamo n d )
この構文上の改善により、プログラマーはジェネリック型の変数をインストルメント化する際
に、完全なジェネリック型 (たとえば、<ClassName>) ではなく、ダイヤモンド演算子 (つま
り、<>) を使用することができます。型は、代わりにその変数の宣言から推定されます。
T ry- wit h - reso u rces ステートメント
これは、ストリームやファイルなどの closeable リソースと使用するための try ステートメント
の新しい形式です。この機能を使うことで、プログラマーはこれらのリソースを明示的に閉じる
必要がなくなりました。
簡素化された varag s メソッドの起動
これまでは、non-reifiable 引数で vararg メソッドを呼び出す際に、コンパイラー警告が発行さ
63
開発者ガイド
れていました。これが削除され、vararg メソッドの宣言時に non-reifiable 引数を受け入れる警
告で置き換えられます。注釈を使ってこの警告を止めることもできますが、その場合は引数の正
確性については開発者が責任を持ちます。これは主に、ジェネリック引数を受け付ける vararg
メソッドに適用されます。
C o n cu rren cy およびコレクションの更新
除算用の fork/join フレームワークや conquer 型アルゴリズムを含む数多くの新しいクラスやイ
ンターフェースが java. uti l . co ncurrency パッケージに追加されました。これらは、マル
チスレッドプログラムのパフォーマンスや正確性の改善に役立ちます。
Java プラットフォーム用の新しい I/O API
これには、開発者による正常な失敗処理を容易にする一方でプラットフォームにまたがる互換性
を改善する新たなファイルシステム API が含まれます。これは、java. ni o . channel s パッ
ケージのソケット/チャンネル API を改善し、java. net パッケージへの非直感的な依存関係を
取り除きます。また、新たな非同期 I/O API も提供します。
swin g 用の N imb u s のルックアンドフィール
co m. sun. java. swi ng パッケージの名前空間の下で Java 6 で非公式に導入された Nimbus
には、swing 用にベクトルグラフィックスベースのルックアンドフィールがありました。Java 7
では、公式 API となっており、javax. swi ng パッケージに移動しました。
3.3.9 .2 . Java ドキュメンテーション
Java についての詳細情報は、man java を参照してください。関連のユーティリティにはそれぞれ、man
ページがあるものもあります。
特定の Java ユーティリティについての詳細情報のために他の Java ドキュメンテーションをインストール
することもできます。慣習として、これらパッケージの名前には、javad o c 接尾辞が付いています (例え
ば、d bus-java-javad o c)。
Java 開発のメインサイトは http://openjdk.java.net/ です。Java のライブラリランタイムのメインサイト
は http://icedtea.classpath.org です。
3.3.10. Ruby
ruby パッケージは、Ruby インタープリターを提供し、Ruby プログラミング言語のサポートを追加しま
す。ruby-d evel パッケージには、Ruby 拡張開発に必要なライブラリおよびヘッダーファイルが含まれ
ています。
Red Hat Enterprise Linux には多くの ruby 関連パッケージも同梱されています。慣習として、これらパッ
ケージの名前には、ruby もしくは rubyg em の接頭辞または接尾辞が付いています。このようなパッケー
ジは、ライブラリの拡張機能か既存ライブラリへの Ruby バインディングのどちらかです。
ruby 関連パッケージの例は以下のとおりです。
ruby-irb
ruby-libguestfs
ruby-libs
ruby-qpid
ruby-rdoc
ruby-ri
64
⁠第3章 ライブラリおよびランタイムのサポート
ruby-tcltk
rubygems
rubygem-bigdecimal
rubygem-devel
rubygem-io-console
rubygem-json
rubygem-minitest
rubygem-rake
注記
アプリケーションの依存関係の管理に Bundler を使用する場合は、rubyg em-bund l er パッケー
ジが提供するBundler を常に使用してください。アップストリームパッケージは、Red Hat
Enterprise Linux 7 で使用する RubyGems レイアウトと互換性がありません。
3.3.1 0 .1 . Ruby の更新
Red Hat Enterprise Linux 7 の Ruby 言語の更新についての情報は、以下の資料を参照してください。
fi l e: ///usr/share/d o c/ruby-version/NEWS
fi l e: ///usr/share/d o c/ruby-version/NEWS-version
Ruby ではファイルシステムレイアウトにおいて大幅は変更がされており、FHS との適合性が高まってい
ます。バイナリライブラリーと Gems の拡張は /usr/l i b (64 ビットシステムの場合は /usr/l i b6 4 )
に置かれており、純粋な Ruby ライブラリーおよび Gems は /usr/share に置かれています。Gems は選
択されたインストール方法によって、以下の 3 つの場所に置かれます。
/usr
/usr/l o cal
~ /. g em
3.3.1 0 .2 . Ruby ドキュメンテーション
Ruby についての詳細情報は、man ruby を参照してください。また、ri コマンドの使用も可能です。こ
れは、Ruby API 参照のフロントエンドです。gem ドキュメンテーションについては、g em server コマ
ンドを使用してください。これは、システム上にインストールされている gems についての HTML マニュ
アルとリファレンスをブラウザで利用可能にします。
注記
ri および g em server コマンドを使って -doc サブパッケージをインストールする必要がある場合
があります。
65
開発者ガイド
Ruby 開発のメインサイトは、http://www.ruby-lang.org です。http://www.ruby-doc.org こちらのサイト
にも Ruby ドキュメンテーションが含まれています。gems のオンラインドキュメンテーション
は、http://rdoc.info でご覧になれます。
ri コマンドのドキュメンテーションは、/usr/share/ri /system にあります。
3.3.11. Perl
perl パッケージは、Perl プログラミング言語のサポートを追加します。このパッケージは、いくつかの
Perl コアモジュール、Perl Language Interpreter (Perl 言語インタープリター)、および p erld o c ツール
を提供します。Red Hat Enterprise Linux 7 では、perl-5.16 が同梱されています。コアモジュールのすべて
をインストールするには、yum i nstal l perl -co re コマンドを使用してください。
Red Hat は、パッケージ形式でも多くの perl モジュールを提供します。これらパッケージの名前に
は、perl -* 接頭辞が付いています。これらのモジュールは、スタンドアロンのアプリケーションや言語拡
張、Perl ライブラリ、外部ライブラリバインディングを提供します。
RPM パッケージに追加の perl モジュールが含まれる場合があります。公開使用の各モジュールはパッケー
ジが提供し、perl(The::Module) という形式になっています。この式は yum に渡され、適切なパッケージの
インストールが可能になります。
例3.1 Perl モジュールのインストール
# yum install 'perl(LWP::UserAgent)'
これで RPM パッケージ perl-libwww-perl がインストールされます。これにはLWP::U serAg en t モ
ジュールが含まれており、プログラマーは use LWP : : UserAg ent; コマンドが使えるようになりま
す。
3.3.1 1 .1 . Pe rl 更新
Red Hat Enterprise Linux 7 では perl 5.16 が同梱されており、Red Hat Enterprise Linux 6 で同梱の 5.10
バージョンから以下のような多くの変更点があります。
Perl 5.12 更新
Perl 5.12 には以下の更新があります。
Perl はユニコード標準により適合します。
実験的な API により、Perl を「プラグ可能」なキーワードおよび構文で拡張することができ
ます。
Perl は 「2038 年」の問題以降も正確な時間を維持できます。
パッケージのバージョン番号は、直接「パッケージ」ステートメントに指定することができ
ます。
Perl はデフォルトで、廃止予定の機能の使用をユーザーに警告します。
Perl 5.12 delta は、http://perldoc.perl.org/perl5120delta.html でアクセス可能です。
Perl 5.14 更新
Perl 5.14 には以下の更新があります。
66
⁠第3章 ライブラリおよびランタイムのサポート
ユニコード 6.0 をサポート
IPv6 のサポートが改善
CPAN クライアントの自動設定の容易化
新たな /r フラグが s/// 置換を非破壊的なものにします。
新規の正規表現フラグが、マッチしたストリングを ASCII またはユニコードとして扱うかを
管理します。
新たな packag e Foo { } 構文
以前のリリースに比べてメモリおよび CPU 使用量が少ない。
多くのバグを修正
Perl 5.14 delta は http://perldoc.perl.org/perl5140delta.html でアクセスできます。
Perl 5.16 更新
Perl 5.16 には以下の更新があります。
Unicode 6.1 のサポート
$$ 変数が書き込み可能。
デバッガーの改善
Unicode データベースファイルへの直接アクセスは廃止予定。代わりに Unicode::UCD を使
用。
Version::Requirements が廃止予定で、代わりに CPAN::Meta::Requirements が使用されます。
多くの perl4 ライブラリを削除:
abbrev.pl
assert.pl
bigfloat.pl
bigint.pl
bigrat.pl
cacheout.pl
complete.pl
ctime.pl
dotsh.pl
exceptions.pl
fastcwd.pl
flush.pl
getcwd.pl
getopt.pl
67
開発者ガイド
getopts.pl
hostname.pl
importenv.pl
lib/find.pl
lib/finddepth.pl
look.pl
newgetopt.pl
open2.pl
open3.pl
pwd.pl
hellwords.pl
stat.pl
tainted.pl
termcap.pl
timelocal.pl
Perl 5.16 delta は http://perldoc.perl.org/perl5160delta.html でアクセス可能です。
3.3.1 1 .2 . インストール
Perl の機能は追加モジュールをインストールすることで拡張されます。モジュールは以下の形式になりま
す。
O f f icial R ed H at R PM
公式モジュールパッケージは、Red Hat Enterprise Linux リポジトリーから yum または rpm で
インストールできます。これらは /usr/share/perl 5 と、32 ビットアーキテクチャーの場合
は /usr/l i b/perl 5 に、64 ビットアーキテクチャーの場合は /usr/l i b6 4 /perl 5 にイン
ストールされます。また、vend o r_perl サブディレクトリーにもインストールされます。
C PAN からのモジュール
perl-CPAN パッケージが提供する cpan ツールを使用して CPAN Web サイトから直接モジュー
ルをインストールします。これは /usr/l o cal /share/perl 5 と、32 ビットアーキテク
チャーの場合は /usr/l o cal /l i b/perl 5 に、64 ビットアーキテクチャーの場合は
/usr/l o cal /l i b6 4 /perl 5 ディレクトリーが存在し、現行ユーザーによる書き込みが可能
な場合にこれらのディレクトリーにインストールされます。
これらのディレクトリーが存在しない場合、cpan ツールは別の解決法を提案します。
Warning: You do not have write permission for Perl library
directories.
To install modules, you need to configure a local Perl library
directory or escalate your privileges. CPAN can help you by
bootstrapping the local::lib module or by configuring itself to
68
⁠第3章 ライブラリおよびランタイムのサポート
use 'sudo' (if available). You may also resolve this problem
manually if you need to customize your setup.
What approach do you want? (Choose 'local::lib', 'sudo' or
'manual')
[local::lib]
たとえば、「manual」 を選択した場合、CPAN からモジュールをインストールする前に、ディ
レクトリーが存在し、書き込み可能であることをユーザーが確認しているとみなされます。
サードパーティーおよびカスタムのモジュールパッケージ
これらのモジュールは /usr/share/perl 5/vend o r_perl と、32 ビットアーキテクチャー
の場合は /usr/l i b/perl 5/vend o r_perl に、64 ビットアーキテクチャーの場合は
/usr/l i b6 4 /perl 5/vend o r_perl にインストールされます。ファイル名が Red Hat
Enterprise Linux のパッケージと競合する場合は、ファイル名を変更するか、Red Hat
Enterprise Linux のパッケージを提供されるパッケージで適正に置き換えてください。
警告
モジュールの公式バージョンが既にインストールされている場合は、非公式バージョンをインス
トールすると、/usr/share/man ディレクトリーで競合が発生する場合があります。
新たな Perl モジュール検索パスが必要な場合、/usr/l o cal /share/perl 5/si tecusto mi ze. pl ス
クリプトをシステム全体の修正に使うか (perl run(1) man を参照)、または perl-homedir パッケージを
ユーザー固有の修正に使うことができます (perl-homedir パッケージの説明を参照)。
3.3.1 1 .3. Pe rl のドキュメンテーション
perl d o c ツールは、言語およびコアモジュールに関するドキュメンテーションを提供します。モジュール
についてのさらなる情報は、perl d o c mo d ul e_name を使用してください。例えば、perl d o c C G I
は CGI コアモジュールについて以下の情報を表示します。
NAME
CGI - Handle Common Gateway Interface requests and responses
SYNOPSIS
use CGI;
my $q = CGI->new;
[...]
DESCRIPTION
CGI.pm is a stable, complete and mature solution for processing and
preparing HTTP requests and responses. Major features including
processing form submissions, file uploads, reading and writing cookies,
query string generation and manipulation, and processing and preparing
HTTP headers. Some HTML generation utilities are included as well.
[...]
PROGRAMMING STYLE
There are two styles of programming with CGI.pm, an object-oriented style
69
開発者ガイド
and a function-oriented style. In the object-oriented style you create
one or more CGI objects and then use object methods to create the various
elements of the page. Each CGI object starts out with the list of named
parameters that were passed to your CGI script by the server.
[...]
Perl 関数の詳細については、perl d o c -f function_name を使用してください。たとえば、perldoc f split は split 関数について以下の情報を表示します。
split /PATTERN/,EXPR,LIMIT
split /PATTERN/,EXPR
split /PATTERN/
split
Splits the string EXPR into a list of strings and returns that
list. By default, empty leading fields are preserved, and empty trailing
ones are deleted. (If all fields are empty, they are considered to be
trailing.)
In scalar context, returns the number of fields found. In scalar and void
context it splits into the @ _ array. Use of split in scalar and void
context is deprecated, however, because it clobbers your subroutine
arguments.
If EXPR is omitted, splits the $_ string. If PATTERN is also omitted,
splits on whitespace (after skipping any leading whitespace). Anything
matching PATTERN is taken to be a delimiter separating the fields. (Note
that the delimiter may be longer than one character.)
[...]
最新の perldoc ドキュメンテーションは perldoc.perl.org で提供されています。
コアおよび外部モジュールは Comprehensive Perl Archive Network で提供されています。
3.3.12. l i bSto rag eMg mt プラグイン
Red Hat Enterprise Linux 7 は l i bSto rag eMg mt と呼ばれる新たなライブラリーと出荷されています。
これは、安定しかつ一貫性のある API を提供する個別の Application Programming Interface (API) のスト
レージアレイです。これにより開発者はプログラムで異なるストレージアレイを管理でき、提供されている
ハードウェア高速機能を活用できます。
l i bSto rag eMg mt ライブラリーの詳細情報については、Red Hat の『Storage Administration Guide』
を参照してください。本セクションでは、ライブラリー用のプラグインの作成方法を詳述します。
l i bSto rag eMg mt ライブラリーでは、プラグインはやや異なる機能の仕方をします。このプラグイン
は、クライアントとプラグインの間のプロセス間通信 (IPC) でスタンドアロンの実行可能ファイルとして自
身のアドレス領域内で実行します。クライアントアプリケーションもしくは l i bSto rag eMg mt コマンド
ライン (l smcl i ) がライブラリーを使用すると、以下が発生します。
1. ライブラリーは uniform resource identifier (URI) を使ってどのプラグインが指定されているかを
解析します。たとえば、LSMC LI_UR I= si m: // シミュレータープラグインを参照します。
2. ライブラリーはプラグイン名 si m を使って、ソケットディレクトリー内の unix ドメインソケット
を探します。デフォルトのディレクトリーは /var/run/l sm/i pc ですが、これはランタイム時
に LSM_UD S_P AT H 環境変数を指定することで変更できます。
70
⁠第3章 ライブラリおよびランタイムのサポート
3. クライアントライブラリーが unix ドメインソケットを開き、l smd デーモンがクライアントから
の接続を受け入れるようにします。デーモンがプラグインを分岐、実行し、コマンドラインのソ
ケット記述子をプラグインに渡します。これでクライアントプロセスがプラグインに直接接続され
たことになります。
4. l smd はすでにパスには存在せず、スリープに戻ってソケットを開く別のプロセスを待機します。
この異なる設計には、以下のような多くの利点があります。
デーモンが停止したり、強制終了した場合、既存のクライアントプラグインセッションはアクティブの
ままになります。
プラグインがクラッシュした場合、クライアントプロセスは操作可能なままです。
デーモンが IPC プロトコルを知る必要がなく、シンプルさを保てます。
ベンダーが必要とする場合、プラグインはクローズソースとすることができます。
3.3.1 2 .1 . l i bSto rag eMg mt ライブラリー用のプラグイン作成
l i bSto rag eMg mt ライブラリーには C および Python 用のプラグイン API があります。ソケットおよび
テキストをサポートする言語はすべてプラグインの作成に使用できますが、ライブラリーはこの複雑性を隠
す抽象化を提供します。
以下では、プログラム言語に関係なくプラグインの設計に関する一般的なガイドラインを示しています。
スレッドまたはマルチプロセス
ライブラリーはロックを提供しません。また、グローバル状態を保持することもしません。このため、クラ
イアントが各スレッドやプロセス用に使用中の個別のプラグインインスタンスを持つことは有効です。プラ
グインは、プラグインの複数インスタンスが異なるアレイに同時に稼働可能であること、また場合によって
は稼働するであろうことを予測することができます。ライブラリーが長時間オペレーションのメカニズムを
提供するので、同一アレイ用の複数プラグインインスタンスは不要です。
プラグインは ro o t 以外の権限で実行
ローカルの不正使用の可能性を減らすため、プラグインには低い権限が付けられています。プラグインの作
成と設計の際には、この点を考慮する必要があります。
プラグインのライフタイム
クライアント API は、各プラグインインスタンスで開閉されるハンドルを提供します。この間、プラグイン
は、正常な操作を提供するために必要なデータを自由にキャッシュすることができます。l smcl i ツール
を使用の際は、ライフタイムは 1 つのコマンドのみになります。
ログ機能
プラグインは、エラーを sysl o g にログ記録します。ライブラリーにはこの動作を促進するためのヘル
パー機能があります。
エラー
ライブラリーは、言語に依存しない状態を継続するために、明確に定義されたエラーコードを使用します。
エラー発生時にプラグインもしくはアレイそのものからテキストのエラーメッセージおよびオプションでデ
バッグデータを提供するために、追加のエラーデータは取得できます。エラー発生後および別のコマンド発
行前にこの新たな情報を取得するのは、ライブラリー呼び出し元の責任です。新たなエラーデータが存在し
71
開発者ガイド
てかつ他の関数が呼び出された場合、新たなエラーの情報は失われます。C は例外をサポートしません。例
外をサポートする言語については、エラーコードおよび追加情報を含むカスタムの例外クラスが提供されま
す。
場所および命名
プラグインは /usr/bi n ディレクトリー内に配置されます。名前は _l smpl ug i n にする必要がありま
す。これは、デーモン開始時にディレクトリー内で列挙を繰り返すためです。
ジョブコントロール
タイムアウトを取得して設定する方法は、プラグインがアレイからの反応を待機する時間を指定するために
使われています。操作がタイムアウト内に安全に完了できない場合は、コールがジョブ ID を返すことでク
ライアントが操作の状況を確認できます。ジョブ ID は自由形式の文字列で、プラグイン定義です。プラグ
インの実装は、プラグインの発動の間にこの文字列からの非同期操作についてのすべてを決定する必要があ
ります。
プラグインを作成するには、以下のベース機能もしくは方法が、使用する言語に関わらずすべて必要になり
ます。
タイムアウトの取得および設定
スタートアップおよびシャットダウン
ジョブステータス
job free
ケイパビリティ
プラグイン情報
プール
システム
メインの実行可能ファイルにフォーム name_l smpl ug i n があるようにするために、一意の名前を選択す
る必要もあります。
以下のセクションでは、python および C 用のプラグインの作成方法を詳述します。
3.3.12.1.1. Pyt h o n でのプラグインの作成方法
最初に提供する機能レベルをサポートするインターフェースを実装します (i pl ug i n. py を参照)。ほとん
どのインターフェースは、lStorageAreaNetwork または INfs から継承するか、プラグインがブロックおよ
びネットワークファイルシステムをサポートする場合は、両方を継承します。
次に、プラグイン runner を呼び出し、run メソッドを処理、実行するためのクラス名およびコマンドライ
ン引数を渡します。
#!/usr/bin/env python
import sys
from lsm.pluginrunner import PluginRunner
from lsm.simulator import StorageSimulator
if __name__ == '__main__':
PluginRunner(StorageSimulator, sys.argv).run()
72
⁠第3章 ライブラリおよびランタイムのサポート
注記
開発中にデバッグを容易にするため、プラグインをコマンドライン上で直接呼び出すことが可能で
す。
3.3.12.1.2. C でのプラグインの作成方法
最初に必要なヘッダーファイル #i ncl ud e
<l i bsto rag emg mt/l i bsto rag emg mt_pl ug _i nterface. h> をインクルードします。
次に、必要なものと合わせてサポートされるコールバック関数を実装します。
最後に、ロードおよびアンロード関数でコマンドラインカウントおよび引数をライブラリーに渡します。
#include <libstoragemgmt/libstoragemgmt_plug_interface.h>
#include <stdlib.h>
#include <stdint.h>
static char name[] = "Simple limited plug-in example";
static char version [] = "0.01";
struct plugin_data {
uint32_t tmo;
/* All your other variables as needed */
};
/* Create the functions you plan on implementing that
match the callback signatures */
static int tmoSet(lsm_plugin_ptr c, uint32_t timeout, lsm_flag flags )
{
int rc = LSM_ERR_OK;
struct plugin_data *pd = (struct
plugin_data*)lsm_private_data_get(c);
/* Do something with state to set timeout */
pd->tmo = timeout;
return rc;
}
static int tmoGet(lsm_plugin_ptr c, uint32_t *timeout, lsm_flag flags )
{
int rc = LSM_ERR_OK;
struct plugin_data *pd = (struct
plugin_data*)lsm_private_data_get(c);
/* Do something with state to get timeout */
*timeout = pd->tmo;
return rc;
}
/* Setup the function addresses in the appropriate
required callback structure */
static struct lsm_mgmt_ops_v1 mgmOps = {
tmoSet,
tmoGet,
NULL,
73
開発者ガイド
NULL,
NULL,
NULL,
NULL
};
int load( lsm_plugin_ptr c, const char *uri, const char *password,
uint32_t timeout, lsm_flag flags )
{
/* Do plug-in specific init. and setup callback structures */
struct plugin_data *data = (struct plugin_data *)
malloc(sizeof(struct plugin_data));
if (!data) {
return LSM_ERR_NO_MEMORY;
}
/* Call back into the framework */
int rc = lsm_register_plugin_v1( c, data, & mgmOps, NULL, NULL, NULL);
return rc;
}
int unload( lsm_plugin_ptr c, lsm_flag flags)
{
/* Get a handle to your private data and do clean-up */
struct plugin_data *pd = (struct
plugin_data*)lsm_private_data_get(c);
free(pd);
return LSM_ERR_OK;
}
int main(int argc, char *argv[] )
{
return lsm_plugin_init_v1(argc, argv, load, unload, name, version);
}
3.3.1 2 .2 . プラグイン作成方法に関する参照資料
The libStorageMgmt Writing Plug-ins wiki
https://sourceforge.net/p/libstoragemgmt/wiki/WritingPlugins/
[1] MPI サポートは、IBM Sys tem Z マシン (ここでは O p en MPI が利用不可) では利用できません
74
⁠第4 章 コンパイルおよびビルド
第4章 コンパイルおよびビルド
Red Hat Enterprise Linux には、ソースコードのコンパイルおよびビルド用のツールを含む、ソフトウェア
開発に使用する多くのパッケージが含まれています。本章では、ソースコードのコンパイルに使用するパッ
ケージおよびツールのいくつかを説明します。
4 .1. GNU コンパイラーコレクション (GCC)
GNU コンパイラーコレクション (GCC) は、様々なプログラミング言語 (C、C++、ObjectiveC、
ObjectiveC++、Fortran、Ada を含む) を非常に最適化されたマシンコードにコンパイルするツールセット
です。これらのツールには、様々なコンパイラー (g cc や g + + など)、ランタイムライブラリ
(l i bg cc、l i bstd c+ + 、l i bg fo rtran、l i bg o mp など)、その他のユーティリティが含まれます。
Red Hat Enterprise Linux 7 は PPC64 アーキテクチャー上にあります。つまり、GCC はデフォルトで
POWER7 用にチューニングされた POWER7 プラットフォーム用のコードを生成します。以下の表では、
各プラットフォーム用のデフォルトのコードを示しています。
表4 .1 i?86 のデフォルトコード
オプション
デフォルトコード
mtune
march
generic
x86-64
パッケージの構築に使用される red hat-rpm-co nfi g には、-mfpmath= sse オプションも含まれてい
ます。
表4 .2 x86 _6 4 のデフォルトコード
オプション
デフォルトコード
mtune
march
generic
x86-64
表4 .3 s39 0 および s39 0x のデフォルトコード
オプション
デフォルトコード
mtune
march
zEC12
z196
表4 .4 p p c、p p c6 4 、および p p c6 4 p 7 のデフォルトコード
オプション
デフォルトコード
mtune
mcpu
power7
power7
上記の表は、32 ビットと 64 ビットの両方のコンパイル用です。
-march= C P U オプションは、他のターゲット用のコード生成に使用することができます。特定のチップ用
にコードをチューニングするには、-mtune= C P U オプションを使用します。-march オプションは、mtune オプションを含みます。-march= nati ve オプションは、コンパイラーにコンパイルマシンのプロ
セッサータイプ用にコードを生成するよう指示します。
75
開発者ガイド
注記
-march オプションは、PPC64 アーキテクチャー上には存在しません。代わりに-mcpu オプショ
ンを使用してください。
4 .1.1. GCC の変更
Red Hat D eveloper Toolset 2.0 は G C C 4 .8 とともに配布されています。これは、Red Hat Enterprise
Linux のシステムバージョンおよび Red Hat D eveloper Toolset 1.1 に含まれているバージョンにおける多
くのバグ修正と機能強化を提供するものです。以下では、今回のリリースにおける新機能および互換性の変
更の完全なリストを示しています。
4 .1 .1 .1 . Re d Hat De ve lo pe r T o o lse t 1 .1 以降の変更
以下の機能は、Red Hat D eveloper Toolset 1.1 に含まれる GCC のリリース以降に追加されたものです。
4 .1.1.1.1. 警告
アグレッシブなループの最適化
GCC のループオプティマイザーは、ループの反復数の範囲をもたらすために言語の制約を使用するよう改
善されました。この範囲は、ループ展開、ループピーリング、およびループ終了テストの最適化の目安とし
て使用されています。
最適化では、たとえば符号付き整数のオーバーフローを引き起こしたり範囲外のアレイアクセスを発生させ
たりすることで未定義の動作をループコードが引き起こさないことを想定しています。たとえば、以下の
コードの一部を考えてみます。
unsigned int foo()
{
unsigned int data_data[128];
for (int fd = 0; fd < 128; ++fd)
data_data[fd] = fd * (0x02000001); // error
return data_data[0];
}
fd 変数の値が 64 以上の場合、fd * 0 x0 20 0 0 0 0 1 オペレーションがオーバーフローします。これは、
C と C++ の両方の符号付き整数で無効なものです。上記の例では、GCC が間違ったコードを生成するか、
無限ループに入る可能性があります。
このエラーを修正するには、符号付きと符号なしのタイプ間でオーバーフローを避けるために変換する際に
適切なキャストを使用します。例を示します。
data_data[fd] = (uint32_t) fd * (0x02000001U); // ok
必要であれば、この最適化は新しいコマンドオプションの -fno -ag g ressi ve-l o o po pti mi zati o ns を使ってオフにすることができます。
4 .1.1.1.2. 全般的な改善点と変更点
新たな Lo cal R eg ist er Allo cat o r
76
⁠第4 章 コンパイルおよびビルド
GCC 4.8 には、新たな Local Register Allocator (LRA) 機能があります。これは、26 年前からあるリロード
パスに代わるもので、生成コードの質を高めます。この新たな local register allocator ではデバッグがシ
ンプルかつ容易になり、レジスタ割り付けが改善されます
Ad d ressSan it iz er
AddressSanitizer という高速メモリーエラー検出機能が追加されており、-fsani ti ze= ad d ress コマン
ドラインオプションを使用することでこれを有効にできます。これは、ヒープ上のオブジェクトへの useafter-free (メモリー解放後の使用) アクセスおよび範囲外のアクセスを検出するためにメモリーアクセス命
令を増やします。
T h read San it iz er
GCC 4.8 では、ThreadSanitizer という高速データレース検出機能が追加されています。この機能は、fsani ti ze= thread オプションで有効になります。
超大型関数のコンパイル
GCC 最適化パスからは多くのスケーラビリティーに関する障害が取り除かれました。その結果、より少な
いメモリー消費量で短時間に非常に大型の関数をコンパイルすることが可能になっています。
新たな - O g 最適化レベル
新たな全般的最適化レベルである -O g が導入されました。この最適化レベルは、高速コンパイルとすぐれ
たデバッグエクスペリエンスのニーズに対応し、妥当なレベルのランタイムパフォーマンスを提供します。
全体としては、開発体験はデフォルトの最適化レベルである -O 0 よりも改善されるはずです。
キャレット診断メッセージ
GCC の診断メッセージはソースコードの行を表示しますが、問題が検出されてコラムを指すキャレットも
表示するようになりました。例を示します。
fred.cc:4:15: fatal error: foo: No such file or directory
#include <foo>
^
compilation terminated.
新たな - f ira- h o ist - p ressu re オプション
コマンドラインオプション -fi ra-ho i st-pressure が新たに追加されました。このオプションは、
register allocator を使っていつ式をループ外に移動したらよいかを判断する手助けをします。これはコン
パイラーコードのサイズを縮小できますが、コンパイラーを遅らせることになります。このオプションはデ
フォルトで -O s で有効になります。
新たな - f o p t - in f o オプション
コマンドラインオプション -fo pt-i nfo が新たに追加されました。このオプションは、特定の最適化パス
の効果についての情報の印刷を制御します。以下の形式になります。
-fo pt-i nfo [-info][= file_name]
オプションの info の部分が印刷されるものを制御します。これをo pti mi zed に置き換えると最適化の際
に情報が印刷され、mi ssed に置き換えると最適化が行われない時に情報が印刷されます。no te に置き換
えるとより詳細な情報が印刷され、o ptal l にするとすべてが印刷されます。
77
開発者ガイド
file_name は、情報の書き込み先とするファイル名に置き換えます。オプションのこの部分を省略すると、
GCC は情報を標準のエラー出力ストリームに書き込みます。
たとえば、-O 2 オプションで有効にしたものの、fo o . c という名前のファイルをコンパイルする際に効果
のなかった最適化のリストを表示するには、以下を入力します。
g cc -O 2 -fo pt-i nfo -mi ssed fo o . c
新たな - f lo o p - n est - o p t imiz e オプション
コマンドラインオプション -fl o o p-nest-o pti mi ze が新たに追加されました。このオプションは、実
験段階にある ISL ベースのループネストオプティマイザーを有効にします。これは一般的なループネストオ
プティマイザーで、Pluto 最適化アルゴリズムに基づき、データローカリティおよび並列処理用に最適化さ
れたループ構造を計算します。このオプティマイザーについての詳細は、http://plutocompiler.sourceforge.net を参照してください。
ラベルのホットおよびコールド属性
ホットおよびコールドの関数属性がラベルにも適用できるようになりました。ホットラベルは、ラベルに続
く実行パスが他の実行パスよりも可能性が高いことをコンパイラーに通知します。コールドラベルは、逆の
ことを意味します。これらの属性は、__bui l ti n_expect がたとえば計算された g o to や asm g o to
と使用できない場合に使用可能です。
4 .1.1.1.3. デバッグ機能の強化
D WAR F4
デバッグ情報生成時に、D WAR F4 がデフォルトのデバッグデータ形式として使用されるようになりまし
た。この新たなデバッグ表示法を最大限活用するには、本リリースに含まれている最新バージョンの
Valg rin d 、elf u t ils、および G D B を使用します。
新たな - g sp lit - d warf オプション
コマンドラインオプション -g spl i t-d warf が新たに追加されました。このオプションは、できるだけ多
くの D WARF デバッグ情報を . d wo ファイル拡張子の付いた別の出力ファイルに分けるようコンパイラー
ドライバーに指示します。そうすることで、ビルドシステムがデバッグ情報のあるファイルのリンクを回避
することが可能になります。
このオプションを活用にするには、Red Hat D eveloper Toolset 2.0 に含まれている G D B のバージョンの
ように . d wo ファイルを読み取ることのできるデバッガーが必要になります。
注記
elf u t ils、Syst emT ap 、および Valg rin d は、. d wo ファイルをサポート しません。
4 .1.1.1.4 . C + + の変更点
リリース予定の標準からの実験段階の C + + 機能
g + + は、新たなコマンドラインオプション -std = c+ + 1y をサポートするようになりました。このオプ
ションは、2014年頃にリリース予定の次期改訂版の標準に計画されている機能と使用することができま
す。現時点での -std = c+ + 11 との唯一の違いは、通常機能における戻り値の型の控除で、これはN3386
で提案されています。
78
⁠第4 章 コンパイルおよびビルド
新たな t h read _lo cal キーワード
g + + は、C++11 thread _l o cal キーワードを実装するようになりました。GNU__thread キーワード
と比較すると、thread _l o cal では動的な初期化と破壊セマンティクスが可能になっています。
thread _l o cal キーワードの使用に関しては、現在重要な制限が 1 つあります。d l cl o se() 関数を
使って thread _l o cal オブジェクトの定義を含む動的に読み込まれた D SO をアンロードする際
に、thread _l o cal オブジェクトが破壊され、そのデストラクターが呼び出され、D SO がプロセスのア
ドレス領域からマッピング解除されます。プロセスのスレッドがこの後に thread _l o cal オブジェクト
にアクセスを試みると、プログラムが予期せず終了する場合があります。その結果、プログラマーは D SO
内の thread _l o cal オブジェクトがアンロード後に確実に参照されないように非常な注意を払う必要が
ある可能性があります。
動的な初期化については、次の項目も参照してください。
T h read - lo cal 変数の動的な初期化
C++11 および OpenMP 標準は、thread-local および thread-private の変数が動的な (つまり、ランタイム
の) 初期化を行えるようにします。これをサポートするために、このような変数の使用は必要な初期化を実
行するラッパー関数を通過します。
変数の使用および定義が同一の変換ユニット内にある場合は、このオーバーヘッドは最適化することが可能
ですが、使用が異なる変換ユニットにある場合は、変数が実際には動的な初期化を必要としない場合でも、
かなりのオーバーヘッドがあります。定義していない変換ユニット内の変数使用が不要であることをプログ
ラマーが確実に分かっている場合 (変数が静的に初期化されるか、定義している変換ユニット内の変数使用
が別の変換ユニット内での使用前に実行されるため)、新たな -fno -extern-tl s-i ni t オプションを使
用することでこのオーバーヘッドを回避することができます。
デフォルトでは、g + + は -fextern-tl s-i ni t オプションを使用します。
C + + 11 属性構文
g + + は、C++11 属性構文を実装するようになりました。例を示します。
[[noreturn]] void f();
C + + 11 アライメント指定子
g + + は、C++11 アライメント指定子を実装するようになりました。例を示します。
alignas(double) int i;
4 .1.1.1.5. Fo rt ran の変更点
4 .1.1.1.5.1. 警告
モジュールファイルのバージョン (. mo d ファイル) が上げられました。以前のバージョンの GCC でコン
パイルされた Fortran モジュールは、GCC 4.8 でコンパイルされたファイルで使用する場合は再コンパイ
ルする必要があります。これは、このバージョンの GCC は、以前のバージョンで作成された . mo d ファ
イルを読み込めないためです。これを試みると、エラーメッセージが出て失敗します。
79
開発者ガイド
注記
生成されたアセンブラーデータの ABI 自体は変更されていません。オブジェクトファイルおよびラ
イブラリーは、「ABI の互換性」 に記載の分以外は完全に以前のバージョンと互換性があります。
4 .1.1.1.5.2. AB I の互換性
アセンブラーもしくはオブジェクトファイル内で使用される内部名のいくつかは、モジュールの仕様部分で
宣言される記号用に変更されました。影響のあるモジュールもしくはそのモジュールを使用関連経由で使用
しているファイルが再コンパイルされると、そのモジュールおよびそのような記号を直接使用しているすべ
てのファイルも再コンパイルする必要があります。この変更が影響するのは、以下のモジュール記号のみで
す。
プロシージャーポインター。 C-interoperable 関数ポインター (type(c_funptr)) およびプロシー
ジャーポインターコンポーネントには影響ないことに注意してください。
D ef erred - len g t h 文字列。
4 .1.1.1.5.3. その他の変更点
BACKTRACE 組み込み
新たな組み込みサブルーチンである BAC KT R AC E が追加されました。このサブルーチンはユーザーコード
の任意の場所でバックトレースを表示し、その後はプログラムの実行が正常に継続されます。
指数関数として 「q」 を使用する浮動少数点数
指数関数に (4 . 0 q 0 などの)q を使用する浮動少数点数の読み込みは、以前のファイルとの互換性を高める
ためにベンダー拡張としてサポートされるようになりました。I/O 用の (4 . 0 e0 などの) e に適合する標準
を除いて、同等のものを使用することが強く推奨されます。
Fortran ソースコードに関しては、浮動少数点のリテラルの q を (適合する q p などをともなう
4 . 0 e0 _q p といった) パラメーターで置き換えます。Fortran ソースコードでは、q を単なる e で置き換
えることは同等ではないことに注意してください。
GFORTRAN_TMPD IR 環境変数
ST AT US= "SC R AT C H" で開かれたファイル用のデフォルト以外のディレクトリーを特定する
G FO R T R AN_T MP D IR 環境変数は、使用されなくなりました。その代わりにg fo rtran が POSIX/GNU
標準の T MP D IR 環境変数をチェックし、T MP D IR が定義されていない場合は、g fo rtran が他の方法に
フォールバックしてユーザーマニュアルに記載されているように一時ファイル用のディレクトリーを決定
します。
Fortran 2003
無制限のポリモーフィック変数 (C LASS(*)) のサポートが追加されました。非定型の文字数はまだサポー
トされていません。
TS 29113
仮定タイプ (T Y P E(*)) がサポートされるようになりました。
仮定ランクアレイ (d i mensi o n(. . )) に対する実験的なサポートが追加されました。現時点では
g fo rtran アレイ記述子が使用されており、これは『TS 29113』 で定義されているアレイ記述子とは異
なることに注意してください。詳細情報は、g fo rtran のヘッダーファイルを参照するか、C h asm 言語
相互運用性ツールを使用してください。
80
⁠第4 章 コンパイルおよびビルド
4 .1.1.1.6 . x86 特有の改善点
新たな命令
GCC 4.8 では、Intel FXSR 、XSAVE、および XSAVEO P T 命令のサポートが追加されました。対応する組み
込みおよびビルトイン機能は、それぞれ -mfxsr、-mxsave、および -mxsaveo pt のコマンドラインオ
プションを使用することで有効にできます。
また、R D SEED 、AD C X、AD O X、および P R EFET C HW 命令のサポートも追加されており、-mrd seed 、mad x、および -mprfchw コマンドラインオプションで有効にできます。
ランタイム C PU タイプおよび ISA を検出する新たなビルトイン機能
ビルトイン関数 __bui l ti n_cpu_i s() が新たに追加され、ランタイム CPU が特定のタイプかどうかを
検出します。この機能は CPU 名をともなう 1 つの文字列リテラル引数を受け取り、マッチする場合は正の
整数を、そうでない場合はゼロを返します。たとえば、ランタイム CPU が Intel Core i7 Westmere プロ
セッサーの場合、__bui l ti n_cpu_i s("westmere") は正の整数を返します。有効な CPU 名の完全な
一覧は、ユーザーマニュアルを参照してください。
ビルトイン関数である __bui l ti n_cpu_suppo rts() が新たに追加され、ランタイム CPU が特定の
ISA 機能をサポートするかどうかを検出します。この機能は、ISA 機能をともなう 1 つの文字列リテラル引
数を受け取り、マッチする場合は正の整数を、そうでない場合はゼロを返します。たとえば、ランタイム
CPU が SSSE3 命令をサポートする場合、__bui l ti n_cpu_suppo rts("ssse3") は正の整数を返しま
す。有効な ISA 名の完全なリストは、ユーザーマニュアルを参照してください。
重要
これらのビルトイン関数は、IFUNC 初期化などの静的コンストラクターが起動する前に呼び出さ
れ、その後に CPU 検出初期化が新たに提供されたビルトイン関数である
__bui l ti n_cpu_i ni t() を使って明示的に実行される必要があります。初期化が必要なのは 1
回のみです。たとえば、以下は IFUNC 初期化子内部の呼び出し例になります。
static void (*some_ifunc_resolver(void))(void)
{
__builtin_cpu_init();
if (__builtin_cpu_is("amdfam10h") ...
if (__builtin_cpu_supports("popcnt") ...
}
関数のマルチバージョン
関数のマルチバージョンでは、プログラマーが同一関数の複数バージョンを指定できるようになり、これら
の各バージョンは特定のターゲットのあるバリアントに特化したものになります。ランタイム時には、実行
される場所のターゲットしだいで適切なバージョンが自動的に実行されます。たとえば、以下のコードの一
部を考えてみます。
__attribute__ ((target ("default"))) int foo () { return 0; }
__attribute__ ((target ("sse4.2"))) int foo () { return 1; }
__attribute__ ((target ("arch=atom"))) int foo () { return 2; }
関数 fo o () が実行されると、返される結果は、プログラムがコンパイルされたアーキテクチャーではな
く、プログラムが実行されるアーキテクチャーに左右されます。詳細は、GCC Wiki を参照してください。
81
開発者ガイド
新たな R T M および H LE 組み込み
Intel RTM および HLE 組み込み、ビルトイン関数、およびコード生成のサポートが追加され、-mrtm およ
び -mhl e のコマンドラインオプションで有効にできます。これは、Restricted Transactional Memory
(RTM) および Hardware Lock Elision (HLE) 用のメモリーモデル拡張の組み込み経由で実行されます。
HLE では、2 つの新たなフラグを使ってロックを使用するハードウェア省略としてマークできます。
__AT O MIC _H LE_AC Q U IR E
ロック変数上のロック省略を開始します。使用するメモリーモデルは、__AT O MIC _AC Q UIR E
またはそれ以上とします。
__AT O MIC _H LE_R ELEASE
ロック変数上のロック省略を終了します。メモリーモデルは、__AT O MIC _R ELEASE またはそ
れ以上とします。
たとえば、以下のコードの一部を考えてみます。
while (__atomic_exchange_n (& lockvar, 1, __ATOMIC_ACQUIRE
| __ATOMIC_HLE_ACQUIRE))
_mm_pause ();
// work with the acquired lock
__atomic_clear (& lockvar, __ATOMIC_RELEASE | __ATOMIC_HLE_RELEASE);
Restricted Transactional Memory をサポートする新たな組み込みは以下の通りです。
unsi g ned _xbeg i n (vo i d )
トランザクションの開始を試みます。成功するとこの関数は _XBEG IN_ST AR T ED を返します。
そうでない場合は、トランザクションが開始できなかった理由を示すステータス値を返します。
vo i d _xend (vo i d )
現在のトランザクションをコミットします。アクティブなトランザクションがない場合、この関
数は障害を引き起こします。このトランザクションのメモリーに関するすべての副作用は、アト
ミックな方法で他のスレッドに見えるようになります。
i nt _xtest (vo i d )
トランザクションが現在アクティブである場合はゼロ以外の値を、そうでない場合はゼロを返し
ます。
vo i d _xabo rt (unsi g ned char status)
現在のトランザクションを中止します。アクティブなトランザクションがない場合、これはノー
オペレーションになります。この関数により中止された _xbeg i n() コールの戻り値に パラ
メーター status が含まれます。
これらの組み立ての使用例を以下で示します。
if ((status = _xbegin ()) == _XBEGIN_STARTED)
{
// some code
_xend ();
}
82
⁠第4 章 コンパイルおよびビルド
else
{
// examine the status to see why the transaction failed and possibly
retry
}
T ran sact io n al Syn ch ro n iz at io n Ext en sio n s ( T SX) を使用したトランザクション
GCC のトランザクションメモリー機能 (-fg nu-tm オプション) 内にあるトランザクションは、x86 ハー
ドウェア上に Transactional Synchronization Extensions (TSX) がある場合は、これを使って実行可能となり
ました。
AMD Family 15h プロセッサーのサポート
GCC の x86 バックエンドは、64-bit x86 命令セットのサポートを使って AMD Family 15h コアをベース
とした CPU をサポートするようになりました。これは、-march= bd ver3 オプションを使って有効にする
ことができます。
AMD Family 16 h プロセッサーのサポート
GCC の x86 バックエンドは、64-bit x86 命令セットのサポートを使って AMD Family 16h コアをベース
とした CPU をサポートするようになりました。これは、-march= btver2 オプションを使って有効にする
ことができます。
4 .1 .1 .2 . Re d Hat Ent e rprise Linux 6 .4 および 5 .9 以降の変更点
以下の機能は、 Red Hat Enterprise Linux 6.4 および 5.9 に含まれる GCC のリリース以降に追加されたも
のです。
4 .1.1.2.1. ステータスおよび機能
4 .1.1.2.1.1. C + + 11
GCC 4.7 およびそれ以降のバージョンでは、-std = c+ + 11 または -std = g nu+ + 11 を使って C++11 に
準拠したビルディングアプリケーションに実験的なサポートを提供しています。しかし、異なるバージョン
のコンパイラーでコンパイルされた C++11 コード間での互換性は保証されていません。詳細は、「C++
ABI」 を参照してください。
C++ ランタイムライブラリーである l i bstd c+ + は、C++11 機能のほとんどをサポートしています。しか
し、タイプの特性に関する特定のプロパティや正規表現などのいくつかの機能については、サポートされて
いないか、サポートが限定されています。詳細は、l i bstd c+ + documentation を参照してください。こ
こでは、実装定義された動作も一覧表示されています。
C++11 excepti o n_ptr および future のサポートは、システム libstdc++ パッケージでの例外処理ラン
タイムの変更を必要とします。この変更は、通常の Z -stream チャンネルで配布されます。これらの機能の
使用時には、すべての Red Hat Enterprise Linux エラータの適用が正常なランタイム機能を確認する必要
がある可能性があります。
4 .1.1.2.1.2. C 11
GCC 4.7 およびそれ以降のバージョンでは、ISO C 標準の C11 改訂からのいくつかの機能に対する実験的
なサポートを提供しています。また、以前の (現在は非推奨) -std = c1x および -std = g nu1x コマンドラ
インオプションに加えて、gcc は -std = c11 および -std = g nu11 を受け取るようになっています。この
サポートは実験段階であるため、今後のリリースでは互換性がなくなる可能性があることに注意してくださ
い。
83
開発者ガイド
サポート対象となる機能としては、Unicode 文字列 (事前定義のマクロ __ST D C _UT F_16 __ および
__ST D C _UT F_32__ を含む)、戻り値のない関数 (_No return および <stdnoreturn.h>)、アライメントサ
ポート (_Al i g nas、_Al i g no f、max_al i g n_t、および <stdalign.h>) が挙げられます。
4 .1.1.2.1.3. 並列処理および同時実行
G C C 4 .7 およびそれ以降のバージョン では、並列アプリケーションのプログラミングのサポートが改善さ
れています。
1. GCC コンパイラーは、並列プログラミングの OpenMP API 仕様バージョン 3.1 をサポートしま
す。この仕様に関する詳細情報については、OpenMP ウェブサイトを参照してください。
2. C++11 および C11 標準は、マルチスレッドプログラム用のプログラミング抽象化を提供します。
それぞれの標準ライブラリーには、スレッドおよびロックや条件変数、future などのスレッド関連
の機能用のプログラミング抽象化が含まれます。新たなバージョンの標準は、コンパイラーが提供
する保証やプログラマーがマルチスレッドプログラムを作成する際に注意を必要とする制限などの
マルチスレッドプログラムのランタイム動作を正確に特定するメモリーモデルも定義します。
メモリーモデルのサポートは、まだ実験段階であることに注意してください (詳細は下記を参照)。
C++11 および C11 のサポートステータスについての詳細情報は、それぞれ 「C++11」 と 「C11」
を参照してください。
このセクションの残りの部分では、2 つの GCC 新機能について詳述しています。これらの機能では、プロ
グラマーによる同時実行の処理 (マルチスレッドが本当に並列処理されておらず、共有状態への同時アクセ
スを同期させる必要がある場合など) が容易になります。また、どちらもメモリーへのアクセスの原子性を
提供しますが、ランタイムサポートのスコープや適用性、複雑性は異なります。
アトミックメモリーアクセス用の C++11 タイプおよび GCC ビルトイン機能
C++11 には、 アトミックタイプ のサポートがあります。このタイプのメモリーロケーションへのアクセス
はアトミックで、他のスレッドが同一メモリーのロケーションに同時にアクセスする場合でも、1 つの不可
分なアクセスに見えます。この原子性は単一の読み取りもしくは書き込みアクセス、またはそれらのタイプ
にサポートされた他のアトミック操作の 1 つ (たとえば、種々のアトミックタイプ上で実行された 2 つの連
続する操作はそれぞれ別個にアトミックになりますが、1 つの結合アトミック操作を形成するわけではあり
ません) に限られています。
アトミックタイプは ato mi c<T> として宣言されます。ここでの T は、非アトミックベースタイプで、普
通にコピー可能である必要があります。(たとえば、ato mi c<i nt> はアトミック整数)。GCC は、ター
ゲットのアーキテクチャーが提供するアトミック命令でアトミックにアクセスできるもの以外は、いかな
るベースタイプ T をもサポートしていません。アトミックは一義的にはアーキテクチャーに依存しない形
でハードウェアのプリミティブを公開するように設計されていることから、これは実際には重大な制限では
ありません。ターゲット上でマシンワードよりも大きくないポインターおよび整数は、ベースタイプとして
サポートされています。まだサポートされていないベースタイプを使用すると、リンク時のエラーになりま
す。
メモリーオーダーを含むアトミックタイプ上での操作用に生成されたコードは、C++11 標準で指定された
セマンティクスを実装します。しかし、C++11 メモリーモデルのサポートはまだ実験段階であり、たとえ
ばコードの最適化を行う際に、GCC が常にデータ競合の自由度を保持するとは限りません。
GCC はまた、アトミックメモリーアクセス用の新たなビルトイン機能をサポートします。これは、メモ
リーモデルと新たなアトミック操作の設計にしたがうものです。以前の同期ビルトイン機能のセット (つま
り、__sync の接頭辞が付いたもの) もまだサポートされています。
トランザクションメモリー
トランザクションメモリー (TM) は、コードの要素が仮想的にアトミックにかつ他のトランザクションから
孤立して実行されることを仮定しているとプログラムが宣言できるようにします。すると、GCC のトラン
ザクションメモリーのランタイムライブラリーである l i bi tm が、コンパイルされたプログラムの実行時
にこの原子性を確実に保証します。アトミックメモリーアクセスと比較すると、高レベルのプログラミング
84
⁠第4 章 コンパイルおよびビルド
抽出になります。これは、単一メモリーロケーションに限定されておらず、修正するデータ用の特別なデー
タタイプを必要としないためです。また、トランザクションに任意のコードを含み、他のトランザクション
内にネスト化することが可能なためです (制限のいくつかは後で説明)。
GCC は、D raft Specification for Transactional Language Constructs for C++, version 1.1 で指定され
たとおりにトランザクションを実行します。このドラフトでは C の言語コンストラクトが指定されていま
せんが、C ソースコードをコンパイルする際に GCC は既に C 互換のコンストラクトのサブセットをサポー
トしています。
主な言語コンストラクトはトランザクションステートメントと式で、これらに __transacti o n_ato mi c
もしくは __transacti o n_rel axed キーワードと複合ステートメントもしくは式がそれぞれ続くことで
宣言されます。以下の例では、変数 x が 10 未満の場合に グローバル変数 y を増加させる方法を示してし
ます。
__transaction_atomic { if (x < 10) y++; }
これは、プログラムのマルチスレッド実行においてもアトミックに発生します。特に、トランザクションが
x と y を読み込み、y に保存できても、これらすべてのメモリーアクセスは仮想的に 1 つの不可分なステッ
プとして実行されます。
C++11 メモリーモデルと一致するよう、トランザクションを使用するプログラムにはデータ競合を含んで
はいけないことに注意してください。トランザクションは仮想的にグローバルの総合順序で実行されるよう
保証されています。この順序はトランザクションのメモリー実装で決定されており、プログラムの残りの部
分が強制する前に発生した順序と一致し、これに投稿するものです (つまり、トランザクションセマンティ
クスは C++11 メモリーモデルに基づいて指定されます。上記のドラフト仕様のリンクを参照してくださ
い)。しかしながら、プログラムにデータ競合がある場合、未定義の動作があることになります。たとえ
ば、スレッドが最初にあるデータを初期化し、その後に以下のようなコードで公的にアクセス可能とするこ
とができます。
init(data);
__transaction_atomic { data_public = true;}
false
// data_public is initially
すると、以下のように別のスレッドが安全にこのデータを使用できるようになります。
__transaction_atomic { if (data_public) use(data); }
しかし、下記のコードにはデータ競合があり、このため未定義の動作に終わります。
__transaction_atomic { temp = copy(data); if (data_public) use(temp); }
ここでは、co py(d ata) は初期化スレッドの i ni t(d ata) と競合します。これは、d ata_publ i c が正
しくない場合でも実行可能なためです。データ競合の別な例は、あるスレッドがトランザクションで変数 x
にアクセスしており、別のスレッドが潜在的に同時にトランザクション以外でこれにアクセスしている場合
です。データは以下のようにコードを使って安全に回収できることに注意してください (1 つのスレッドが
これを行なっていることが前提)。
__transaction_atomic { data_public = false; }
destruct(data);
ここでは、d estruct() はデータの潜在的な同時使用とは競合しません。トランザクション完了後に
d ata_publ i c が false でデータがプライベートであることが保証されるためです。バックグラウンド情
報については、仕様および C++11 メモリーモデルを参照してください。
85
開発者ガイド
トランザクションが仮想的に総合順序で実行する必要がある場合でも、時間において相互排他的に実行する
わけではありません。トランザクションメモリー実装はできる限り並列でトランザクション実行を試みてス
ケーラブルなパフォーマンスを提供します。
トランザクションには、atomic transactions (__transacti o n_ato mi c) と relaxed transactions
(__transacti o n_rel axed ) の 2 つのバリアントがあります。1 つ目は、他のすべてのコードに関する
原子性を保証しますが、アトミックや揮発性メモリーアクセスなどのトランザクションではない同期を含ま
ないことが分かっているコードのみを許可します。対称的に 2 つ目はすべてのコード (たとえば、I/O 関数
へのコール) を許可しますが、他のトランザクションに関する原子性のみを提供します。このため、アト
ミックトランザクションは他のアトミックトランザクションと relaxed トランザクション内でネスト化が
可能ですが、relaxed トランザクションは他の relaxed トランザクション内でしかネスト化ができません。
更に、relaxed トランザクションはより低いパフォーマンスで実行される可能性が高いものの、これは、実
装および利用可能なハードウェアによります。
GCC はコンパイル時にこれらの制限を静的に検証します (たとえば、アトミックトランザクション内から
呼び出しが許可されるコードに関する要件)。これは、他のコンパイルユニット内 (ソースファイル) もしく
はライブラリー内で定義される関数をトランザクションがいつ呼び出すかに影響してきます。トランザク
ションコードに関するこのようなコンパイルユニットにまたがる呼び出しを有効にするには、アトミックト
ランザクション内からの仕様が安全なコードを含むようにそれぞれの式をマークする必要があります。プロ
グラマーは、transacti o n_safe 関数属性をこれらの関数の宣言に追加し、この宣言を関数の定義時に
含めることで、これが可能になります。すると、GCC はこれらの関数内のコードがアトミックトランザク
ションに安全であることを確認し、それに応じてコードを生成します。プログラマーがこれらの制限やス
テップにしたがわないと、コンパイル時またはリンク時のエラーが発生します。コンパイルユニット内で
は、GCC は関数がトランザクション内での使用で安全かどうかを自動的に検出します。このため、通常は
属性を追加する必要はありません。詳細は、上記のドラフト使用のリンクを参照してください。
GCC のトランザクションメモリーサポートは、該当トランザクションを使用しないプログラムのパフォー
マンスとトランザクション以外のコードのパフォーマンスを低下させない設計になっています。ただし、
CPU といった同一リソースを使用する同時スレッドによる通常の妨害を除きます。
GCC および l i bi tm におけるトランザクションメモリーサポートはまだ実験段階です。言語コンストラク
トの仕様が進化したり要件の実装が理由で ABI と API の両方が必要になった場合は、今後これらが変更さ
れる可能性があります。-fg nu-tm コマンドラインオプションで構築されたアプリケーションを実行する
際には、適切なバージョンの l i bi tm. so . 1 共有ライブラリーもインストールされていることが現時点で
の必要条件となっていることに注意してください。
4 .1.1.2.1.4 . アーキテクチャー固有のオプション
Red Hat D eveloper Toolset 2.0 は、Red Hat Enterprise Linux 5 および 6 のみで利用可能で、32 ビット
と 64 ビットの Intel および AMD アーキテクチャーの両方に対応しています。このため、以下のオプショ
ンはこれらのアーキテクチャーにのみ関連するものです。
プロセッサーのいくつかに対する最適化は、表4.5「プロセッサー最適化オプション」 で記載されているコ
マンドラインオプションで利用可能となっています。
表4 .5 プロセッサー最適化オプション
オプション
説明
-march= co re2 および -mtune= co re2
-march= co rei 7 および -mtune= co rei 7
Intel Core 2 プロセッサー用の最適化。
Intel Core i3、i5、および i7 プロセッサー用の最適
化。
AVX をともなう Intel Core i3、i5、および i7 プロ
セッサー用の最適化。
RD RND 、FSGSBASE、および F16C のあるコー
ド名 Ivy Bridge の Intel プロセッサー用の最適化。
-march= co rei 7-avx および mtune= co rei 7-avx
-march= co re-avx-i
86
⁠第4 章 コンパイルおよびビルド
オプション
説明
-march= co re-avx2
AVX2、FMA、BMI、BMI2、および LZ CNT のある
Intel からの次世代プロセッサー用の最適化。
コード名 Piledriver の AMD Opteron プロセッサー
用 の最適化。
コード名 Bobcat の AMD family 14h プロセッサー
用 の最適化。
コード名 Bulldozer の AMD family 15h プロセッ
サー用の最適化。
-march= bd ver2 および -mtune= bd ver2
-march= btver1 および -mtune= btver1
-march= bd ver1 および -mtune= bd ver1
プロセッサー固有の各組み込みおよび命令は、表4.6「プロセッサー固有の組み込みおよび命令のサポー
ト」 で記載されているコマンドラインオプションで利用可能となっています。
表4 .6 プロセッサー固有の組み込みおよび命令のサポート
オプション
説明
-mavx2
-mbmi 2
-ml zcnt
-mfma
-mfsg sbase
Intel AVX2 組み込み、ビルトイン関数、およびコード生成のサポート。
Intel BMI2 組み込み、ビルトイン関数、およびコード生成のサポート。
l zcnt 命令を使った __bui l ti n_cl z* の実装および自動生成。
Intel FMA3 組み込みおよびコード生成のサポート。
専用のビルトイン機能で新たなセグメントレジスタ読み込みおよび書き込み命
令の生成を有効にします。
Intel rd rnd 命令のサポート。
新たな 2 つの AVX ベクトル変換命令に対するサポート。
TBM (Trailing Bit Manipulation) ビルトイン関数およびコード生成に対する
サポート。
AMD の BMI (Bit Manipulation) ビルトイン関数およびコード生成に対するサ
ポート。
crc32 組み込みのサポート。
__bui l ti n_bswap32 および __bui l ti n_bswap6 4 を実装するための
mo vbe 命令の使用を有効にします。
AMD Orochi プロセッサー用の XOP、FMA4、および LWP 命令セットのサ
ポート。
AMD プロセッサーでの po pcnt および l zcnt 命令の使用を有効にします。
AMD および Intel プロセッサーでの po pcnt 命令の使用を有効にします。
-mrd rnd
-mf16 c
-mtbm
-mbmi
-mcrc32
-mmo vbe
-mxo p、-mfma4 、お
よび -ml wp
-mabm
-mpo pcnt
x87 浮動少数点ユニットを使用する際には、GCC は浮動少数点の過剰な精度の処理において ISO C99 に準
ずるコードを生成するようになっています。これは -fexcess-preci si o n= stand ard で有効にな
り、-fexcess-preci si o n= fast で無効にできます。-std = c9 9 などの標準に準ずるオプション使用
時には、この機能はデフォルトで有効となります。
ベクトルタイプの vecto r l o ng l o ng もしくは vecto r l o ng は、他の VSX 命令セットのベクトル
と同じ方法で渡され、返されます。これまで GCC は、64-bit 整数ベースタイプの 128-bit ベクトル用の
ABI に準拠していませんでした。
-mreci p コマンドラインオプションが追加されました。これは、逆数および逆数平方根命令を使うべきか
どうかを示します。
-mvecl i babi = mass コマンドラインオプションが追加されました。これを使うと、Mathematical
Acceleration Subsystem ライブラリーを使ってコンパイルが数学関数を自動的にベクトル化できるように
なります。
87
開発者ガイド
-msi ng l e-pi c-base コマンドラインオプションが追加されました。これは、コンパイラーに関数プロ
ローグで P IC ベースレジスタを読み込まないように命令します。PIC ベースレジスタは、ランタイムシス
テムが初期化する必要があります。
-mbl o ck-mo ve-i nl i ne-l i mi t コマンドラインオプションが追加されました。これは、ユーザーがイ
ンライン inlined memcpy 呼び出しおよび同様の最大サイズを制御できるようにするものです。
4 .1.1.2.1.5. リンク時の最適化
リンク時の最適化 (LTO) はコンパイル技術で、GCC がネイティブコードに加えてコンパイル済みの各入力
ファイルの内部表現を生成し、この両方を出力オブジェクトファイルに書き込むものです。その後、いくつ
かのオブジェクトファイルが一緒にリンクされると、GCC はこのコンパイル済みコードの内部表現を使っ
てすべてのコンパイルユニットにまたがって手順間を最適化します。これは生成済みコードのパフォーマン
スを改善する可能性があります (たとえば、あるファイル内で定義された関数が別のファイルで呼び出され
た場合にインライン化できる可能性があります)。
LTO を有効にするには、コンパイル時とリンク時の両方で -fl to オプションを指定する必要があります。
リンカーとの相互運用性および LTO の並列実行を含む詳細については、GCC 4.7.0 Manual 内の -fl to
ドキュメンテーションを参照してください。また、この内部表現は安定したインターフェースではないた
め、LTO は同一バージョンの GCC が生成したコードにのみ適用されることに注意してください。
注記
デバッグ生成におけるリンク時の最適化は、gcc 4.7 および 4.8 ではまだサポートされていません。
このため、-fl to と -g オプションを合わせた使用は、Red Hat D eveloper Toolset ではサポート
対象外となります。
4 .1.1.2.1.6 . その他
-O fast が全般的な最適化レベルとしてサポートされるようになりました。これは-O 3 と同様に作動し、
より最適化されたコードを生成することが可能なオプションを追加しますが、一方で標準コンプライアンス
を無効にする可能性があります (たとえば、-ffast-math は -O fast で有効になります)。
GCC は、co nst、pure、および no return といった属性をヘッダーファイルで宣言された関数に追加す
ることで改善する可能性のあるコードについてケースをユーザーに知らせることができます。これを有効に
するには、-Wsug g est-attri bute= [co nst| pure| no return] コマンドラインオプションを使用しま
す。
アセンブラーコードは、C コードでのラベルへのジャンプを可能にする goto 機能を利用できます。
4 .1.1.2.2. 言語の互換性
本セクションでは、Red Hat D eveloper Toolset コンパイラーと Red Hat Enterprise Linux システムコン
パイラーのプログラム言語レベルでの互換性について説明します (たとえば、C99 などの言語標準の実装に
おける違いや -Wal l が生成する警告の変更点など)。
バグ修正による変更点もあれば、新標準をサポートするために意図的にこれまでの動作を変更したものもあ
ります。また、コンパイルやランタイムパフォーマンスを促進するために標準に適合する方法で緩和したも
のもあります。これらの変更点には、一見しただけではわからず、以前のバージョンの更新時に問題を引き
起こさないものもあります。しかし、いくつかものは目に見えるもので、Red Hat D eveloper Toolset バー
ジョンの GCC に移ったユーザーを悩ませる可能性もあります。以下では、主な問題点の特定を試み、解決
法を示します。
4 .1.1.2.2.1. C
88
⁠第4 章 コンパイルおよびビルド
GCC は、定数式を C90 および C99 に準拠する方法で処理するようになっています。コンパイラーで定数
に変換可能なコード式で、実際には ISO C が定義する定数式でないものについては、警告またはエラーが
出る可能性があります。
ライブラリー関数の不適格な再定義は、コンパイラーが受け取らないようになりました。特に、ライブラ
リー関数のビルトイン宣言に類似したシグネチャーがある関数 (たとえば、abo rt() や memcpy()) が再
定義とみなされるには、extern "C " で宣言される必要があります。そうでないと、不適格なものとなり
ます。
重複メンバー
以下の struct 宣言を見てみましょう。
struct A { int *a; union { struct { int *a; }; }; };
これまでは、この宣言は C++ コンパイラーのみが診断していましたが、C コンパイラーも診断するように
なっています。共用体と構造体が匿名なため、. a が実際に参照するものがあいまいで、フィールドの 1 つ
は名前を変更する必要があります。
4 .1.1.2.2.2. C + +
ヘッダー依存関係の変更点
これまでは <uni std . h> に実装詳細として (g thr*. h に機能マクロを獲得する目的で) 含まれていた
<i o stream>、<stri ng >、およびその他の STL ヘッダーは、含まれていません。これは、C++ 標準違反
であるためです。診断結果の出力は、以下のようになります。
error: ‘truncate’ was not declared in this scope
error: ‘sleep’ was not declared in this scope
error: ‘pipe’ was not declared in this scope
error: there are no arguments to 'offsetof' that depend on a template
parameter, so a declaration of 'offsetof' must be available
これを修正するには、該当するソースまたはヘッダーファイルの最初の方に以下の行を追加します。
#include <unistd.h>
標準 C++ ライブラリーインクルードファイルの多くは、si ze_t および ptrd i ff_t の
namespace-std -scoped バージョンを獲得する <cstd d ef> を含めないように編集されました。このた
め、<cstd d ef> 含まずにマクロ NULL または o ffseto f を使用する C++ プログラムは、コンパイルを
行わなくなります。診断結果の出力は、以下のようになります。
error: 'ptrdiff_t' does not name a type
error: 'size_t' has not been declared
error: 'NULL' was not declared in this scope
error: there are no arguments to 'offsetof' that depend on a template
parameter, so a declaration of 'offsetof' must be available
この問題を修正するには、以下の行を追加します。
#include <cstddef>
名前検索の変更点
89
開発者ガイド
G++ はこれまで間違って実行してきた余分な無条件検索を行わなくなりました。その代わり、2 段階の検索
ルールを正常に実装し、テンプレートに使用されている非修飾名は以下のどちらかを満たす適切な宣言があ
る必要があります。
1. テンプレートの定義時にスコープ内であること。
2. インスタンス化の際に変数に依存する検索で見つけられること。
インスタンス化の際に 2 番目の無条件検索に不適当に依存するコード (テンプレート後もしくは依存ベース
内で宣言される関数の発見など) は、コンパイル時のエラーにつながります。
ケースによっては、G++ が提供する診断結果にバグ修正のヒントが含まれている場合もあります。以下の
コードを見てみましょう。
template<typename T>
int t(T i)
{
return f(i);
}
int f(int i)
{
return i;
}
int main()
{
return t(1);
}
以下の診断結果が出力されます。
In instantiation of ‘int t(T) [with T = int]’
required from here
error: ‘f’ was not declared in this scope, and no declarations were found
by argument-dependent lookup at the point of instantiation [-fpermissive]
note: ‘int f(int)’ declared here, later in the translation unit
この例でエラーを修正するには、テンプレート関数 t() の定義前に関数f() の宣言を移動します。fpermi ssi ve コンパイラーフラグがコンパイル時のエラーを警告に変え、一時的な回避策として使用す
ることができます。
初期化していない const
以下の宣言を見てみましょう。
struct A { int a; A (); };
struct B : public A { };
const B b;
このコードをコンパイルする試みは、以下のエラーが出て失敗します。
error: uninitialized const ‘b’ [-fpermissive]
note: ‘const struct B’ has no user-provided default constructor
90
⁠第4 章 コンパイルおよびビルド
これは B にユーザーが提供するデフォルトのコンストラクターがないために発生します。イニシャライ
ザーを提供するか、デフォルトのコンストラクターを追加する必要があります。
テンプレートのインスタンス化の視認性
テンプレートのインスタンス化における ELF 記号の視認性は、テンプレート引数の視認性で適切に制限さ
れるようになりました。たとえば、struct my_hi d d en_struct といった非表示のユーザー定義タイプ
で std : : vecto r のような標準ライブラリーコンポーネントをインスタンス化するユーザー
は、std : : vecto r<my_hi d d en_struct> 記号で非表示の視認性を求めることが可能です。その結
果、-fvi si bi l i ty= hi d d en コマンドラインオプションでコンパイルを行うユーザーは、使用するライ
ブラリーヘッダーから含まれるタイプの視認性を認識することになります。ヘッダーが明示的に記号の視認
性を制御しない場合は、これらのヘッダーからのタイプは、これらのタイプを使用するインスタンス化とと
もに非表示となります。たとえば、以下のコードを見てみましょう。
#include <vector>
// template std::vector has default
visibility
#include <ctime>
// struct tm has hidden visibility
template class std::vector<tm>; // instantiation has hidden visibility
ライブラリーヘッダー <fo o . h> の視認性を調整する方法の 1 つは、以下のもので構成される転送ヘッ
ダーを -I インクルードパス上に作成することです。
#pragma GCC visibility push(default)
#include_next <foo.h>
#pragma GCC visibility push
ユーザー定義のリテラルサポート
C++ を -std = {c+ + 11,c+ + 0 x,g nu+ + 11,g nu+ + 0 x} コマンドラインオプションでコンパイルする際
には、GCC 4.7.0 およびそれ以降ではそれ以前のバージョンとは違い、有効な ISO C++03 コードのいくつ
かと互換性のないユーザー定義のリテラルがサポートされています。特に、文字列の後に有効なユーザー定
義のリテラルとなるものの前に空白が必要となります。以下のコードを見てみましょう。
const char *p = "foobar"__TIME__;
C++03 では、__T IME__ マクロは文字列リテラルまで拡大し、別のものと連結されます。C++11 で
は、__T IME__ 拡大されず、代わりに演算子 "" __T IME__ が検索され、その結果、以下のような警告が
出されます。
error: unable to find string literal operator ‘operator"" __TIME__’
これは、空白のないマクロが続く文字列リテラルに適用されます。これを修正するには、文字列リテラルと
マクロ名の間に空白を加えます。
Temporary アドレスの除去
以下のコードを見てみましょう。
struct S { S (); int i; };
void bar (S *);
void foo () { bar (& S ()); }
91
開発者ガイド
これまでは、このコードをコンパイルしようとすると警告メッセージが出ましたが、今ではエラーが出て失
敗するようになりました。これは、変数を追加し、temporary ではなくこの変数のアドレスを渡すことで修
正可能です。-fpermi ssi ve コンパイラーフラグが、コンパイル時のエラーを警告に変え、一時的な回避
策として使用することができます。
その他
G++ は事前定義されたマクロの __cpl uspl us を C++98/03 には19 9 711L に、C++11 には 20 110 3L
という正しい値に設定するようになっています。
G++ は、一時オブジェクトのライフタイムが終了する際に、これらのオブジェクトに割り当てられていた
スタック領域を適切に再利用するようになりました。これは、いくつかの C++ 関数ではスタック消費を大
幅に削減可能とします。その結果、未定義の動作のあるコードの中には中断するものもあります。
関数内の外部宣言が括弧内のコンテキストの宣言と適合しない場合、G++ は関数定義のすぐ前で開かれて
いる名前領域ではなく、関数の名前領域内の名前を適切に宣言します。
G++ には、C++ 標準のコア問題についての解決案が実装されています。すべてのサブオブジェクトを初期
化する場合はデフォルトの初期化が許可され、コンパイルに失敗したコードは以下のようなイニシャライ
ザーを提供することで修正できます。
struct A { A(); };
struct B : A { int i; };
const B b = B();
テンプレートで使用される typed ef 名にアクセス制御が適用されるようになりました。これにより、以前
のリリースでは受け付けられた間違ったコードのいくつかが G++ に拒否される場合があります。このコー
ドが訂正されるまでは、-fno -access-co ntro l オプションを一時的な回避策として使用できます。
G++ では、C++ 標準のコア問題 176 が実装されています。これまでは、G++ ではテンプレートベースクラ
スの injected-class-name の使用はサポートされていませんでした。このため、この名前の検索は、囲まれ
たスコープ内のテンプレートの宣言を見つけていましたが、injected-class-name を見つけるようになりま
した。これは、名前の後にテンプレート引数リストが続くかどうかにより、タイプまたはテンプレートとし
て使用できるものです。この変更の結果、以前は受け付けられていたコードが間違ったものになる場合があ
ります。その理由は、
1. injected-class-name がプライベートベースからのものであることからアクセスできないため。
2. または、injected-class-name をテンプレートのパラメーター用に引数として使用できないため。
どちらの場合でも、nested-name-specifier を明示的にテンプレート命名に加えることで修正可能です。前
者の場合は -fno -access-co ntro l を追加し、後者は -ped anti c でのみ拒否されます。
4 .1.1.2.2.3. C /C + + 警告
GCC 4.7.0 およびそれ以前では、デフォルトで有効になっているもしくは -Wal l オプションを使うことで
有効になる多くの新たな警告が追加されています。これらの警告だけではコンパイル失敗につながりません
が、多くの場合 -Wal l は -Werro r と合わせて使われ、これらの警告がエラーのように作動することを引
き起こします。本セクションでは、これらの新たな警告および新たに有効となった警告の一覧を紹介しま
す。特に記載がない限り、これらの警告は C と C++ の両方に適用されます。
-Wal l コマンドラインオプションの動作が変更され、新たな警告フラグ-Wunused -but-setvari abl e および -Wal l -Wextra の場合は -Wunused -but-set-parameter が含まれます。これに
より、以前のバージョンの GCC で正常にコンパイルされたコード内に新たな警告が出る場合があります。
たとえば、以下のコードを見てみましょう。
void fn (void)
{
92
⁠第4 章 コンパイルおよびビルド
int foo;
foo = bar ();
/* foo is never used.
*/
}
以下の診断結果が出力されます。
warning: variable "foo" set but not used [-Wunused-but-set-variable]
この問題を修正するには、まず未使用の変数もしくはパラメーターを結果や周りのコードの論理を変更せず
に削除できるかどうかを検討します。これが可能でなければ、__attri bute__((__unused __)) の注釈
を付けます。回避策として、-Wno -erro r= unused -but-set-vari abl e または -Wno erro r= unused -but-set-parameter コマンドラインオプションを使用することができます。
-Wenum-co mpare オプションを使うと、異なる enum タイプの値を比較している際に、GCC が警告を出
すようになります。これまでは、このオプションは C++ プログラムのみで作動しましたが、C でも作動す
るようになりました。この警告は -Wal l で有効になり、タイプキャストを使用することで回避可能となり
ます。
整数をより大きいポインタータイプにキャストすると、GCC はデフォルトで警告を表示します。この警告
を表示させないようにするには、-Wno -i nt-to -po i nter-cast オプションを使用します。これは、C
と C++ の両方で使用できます。
NULL と非ポインタータイプ間での変換を行うと、GCC はデフォルトで警告をレポートするようになって
います。これまでは、-Wco nversi o n を明示的に使用した場合にのみ、これらの警告が表示されていまし
た。この警告を表示させないようにするには、新しい -Wno -co nversi o n-nul l コマンドラインオプ
ションを使用します。
GCC は、仮想関数および非仮想デストラクターを持つクラスを d el ete を使って破棄する際に警告を発す
ることができます。ポインターは仮想デストラクターのないベースクラスを参照する可能性があるので、こ
れは安全ではありません。警告は -Wal l と新しいコマンドラインオプションである-Wd el ete-no nvi rtual -d to r で有効にします。
-Wc+ + 11-co mpat と -Wc+ + 0 x-co mpat オプションが新たに利用可能になりました。これらのオプショ
ンを使うと、GCC は ISO C++ 1998 と ISO C++ 2011 の間で意味が異なる C++ コンストラクト (ISO
C++ 2011 ではキーワードだが ISO C++ 1998 では識別子、など) についての警告を表示するようになりま
す。この警告は -Wal l で有効になり、-Wnarro wi ng オプションを有効にします。
4 .1.1.2.2.4 . Fo rt ran
4 .1.1.2.2.4 .1. 新しい機能
新たなコンパイルフラグ -fstack-arrays が追加されました。このフラグは、すべてのローカルアレ
イをスタックメモリー上に置くことで、いくつかのプログラムのパフォーマンスを飛躍的に改善しま
す。非常に大型のローカルアレイを使用するプログラムの場合、ユーザーがスタックメモリー用のラン
タイム制限を拡大する必要がある場合があることに注意してください。
コンパイル時間が大幅に改善されました。たとえば、大型のアレイコンストラクターを使用するプログ
ラムで作業すると、この改善点を認識できるはずです。
コード生成と診断を改善するために、-fwho l e-fi l e コンパイルフラグがデフォルトで有効になって
おり、新たにサポートされている -fwho l e-pro g ram フラグと合わせて使うことができます。これを
無効にするには、非推奨の -fno -who l e-fi l e フラグを使用します。
新たなコマンドラインオプションの -M がサポートされるようになりました。g cc と同様に、このオプ
ションを使うと、Makefile 依存関係が生成できます。-cpp オプションも必要となる場合があることに
注意してください。
93
開発者ガイド
-fi ni t-real = コマンドラインオプションが snan を有効な値としてサポートするようになりまし
た。これにより、signaling NaN ( 非数) をともなう REAL および COMPLEX 変数の初期化が可能にな
り、トラッピングを有効にすることが必要になります (たとえば、-ffpe-trap= コマンドラインオプ
ションの使用で)。コンパイル時の最適化は、NaN のシグナル化を quiet NaN に変える場合があること
に注意してください。
新たなコマンドラインオプション -fcheck= が追加されました。これは、以下の引数を受け取りま
す。
-fcheck= bo und s オプションは、-fbo und s-check コマンドラインオプションと同等のもので
す。
-fcheck= array-temps オプションは、-fcheck-array-tempo rari es コマンドラインオプ
ションと同等のものです。
-fcheck= d o オプションは、ループ反復変数の無効な修正をチェックします。
-fcheck= recursi ve オプションは、再帰的とマークされていないサブルーチンや関数への再帰呼
び出しをチェックします。
-fcheck= po i nter オプションは呼び出しのポインター関連チェックを実行しますが、未定義のポ
インターや式内のポインターは処理しません。
-fcheck= al l オプションが上記のオプションすべてを有効にします。
新たなコマンドラインオプション -fno -pro tect-parens が追加されました。このオプションは、コ
ンパイラーが括弧に関係なく REAL および COMPLEX の式を並び替えることを可能にします。
OpenMP の WO R KSHAR E を使用すると、アレイの割り当ておよびWHER E が並行して実行されます。
より多くの Fortran 2003 および Fortran 2008 数学関数が初期化式として使用可能となっています。
G C C $ コンパイラー指示文が ST D C ALL などの拡張属性をサポートできるようになりました。
4 .1.1.2.2.4 .2. 互換性の変更点
-O fast コマンドラインオプションが自動的に -fno -pro tect-parens および -fstack-arrays
フラグを有効にします。
フロントエンドの最適化が -fno -fro ntend -o pti mi ze オプションで無効にでき、-ffro ntend o pti mi ze オプションで選択可能になっています。前者の使用は、無効な Fortran ソースコードをコ
ンパイルする必要がある場合 (たとえば、サブルーチンと比較した場合に関数に副作用がある場合) やコ
ンパイラーバグを回避する場合に限定することをお勧めします。
G FO R T R AN_USE_ST D ER R 環境変数が削除され、GNU Fortran が常に標準エラーにエラーメッセージ
を表示します。
-fd ump-co re コマンドラインオプションと G FO R T R AN_ER R O R _D UMP C O R E 環境変数が削除され
ました。重大なエラーが発生した場合は、GNU Fortran は常にプログラムの実行を中止します。
-fbacktrace コマンドラインオプションはデフォルトで有効になっています。致命的なエラーが発生
すると、GNU Fortran はプログラムの実行を中止する前にバックトレースを標準エラーに表示しようと
します。この動作を無効にするには、-fno -backtrace オプションを使用します。
GNU Fortran は、モジュールパス用に Makefile 依存関係を生成する -M コマンドラインオプションを
サポートしなくなりました。この操作を実行するには、代わりに -J オプションを使用してください。
94
⁠第4 章 コンパイルおよびビルド
警告の数を大幅に減らすために、-Wco nversi o n コマンドラインオプションは変換で情報が失われる
場合にのみ警告を表示するようになっており、他の変換についての警告を表示するために新たなコマン
ドラインオプション -Wco nversi o n-extra が追加されました。-Wco nversi o n オプションは Wal l に有効にします。
新たなコマンドラインオプション -Wunused -d ummy-arg ument が追加されました。このオプション
を使うと未使用ダミー引数についての警告が表示でき、-Wal l で有効にできるようになっています。Wunused -vari abl e オプションは以前に未使用ダミー引数についても警告をしていたことに注意して
ください。
C O MMO N のデフォルトのパディングが変更されました。これまでは、変数の前にパディングが追加され
ていました。変更後は変数の後にパディングを追加して他のベンダーとの互換性を高めています。ま
た、ケースによっては、正確な出力の獲得向上にもつながります。この動作は -fal i g n-co mmo ns オ
プションと対照的であることに注意してください。
GNU Fortran は l i bg fo rtranbeg i n ライブラリーに対してリンクしないようになりまし
た。MAIN__ アセンブラー記号が実際の Fortran メインプログラムで、mai n 機能により起動します。
これは MAIN__ と同じオブジェクトファイルで生成され、置かれます。l i bg fo rtranbeg i n ライブ
ラリーは、後方互換性のためにまだ存在していることに注意してください。
4 .1.1.2.2.4 .3. Fo rt ran 2003 の機能
ライブラリーおよびプログラム間のポリモーフィズムのサポートと、複雑な継承パターンのサポートは
改善されましたが、まだ実験段階です。
派生型と同じ名前のジェネリックインターフェース名がサポートされるようになり、これによりコンス
トラクター関数の作成が可能になりました。Fortran は静的コンストラクター関数をサポートしないこ
とに注意してください。利用可能なのは、デフォルトの初期化か明示的な構造-コンストラクター初期化
のみです。
自動 (再) 割り当て。割り当て可能な変数への組み込み割り当てでは、左側が自動的に割り当て (割り当
てられていない場合) られるか、再割り当て (シェイプもしくは型パラメーターが異なる場合) されま
す。小型のパフォーマンスペナルティーを避けるには、アレイおよび文字列に a = . . . の代わりに
a(: ) = . . . を使うことができます。もしくは、-std = f9 5 または -fno -real l o c-l hs を使って
この機能を無効にできます。
ASSO C IAT E コンストラクトの実験段階のサポートが追加されました。
ポインターの割り当てでは、ポインターの下限を指定することが可能になり、ランク 1 または単純な連
続データ-ターゲットでは範囲を再マッピングすることが可能になっています。
遅延の型パラメーター。スカラー割り当て可能な変数およびポインター変数では、文字の長さを保留で
きるようになっています。
割り当て可能な属性、ポインター属性、および非定型の長さ型パラメーターのある名前リスト変数がサ
ポートされるようになりました。
プロシージャーポインター関数結果およびプロシージャーポインターコンポーネントのサポートが追加
されました (PASS を含む)。
割り当て可能なスカラー (実験段階)、 D EFER R ED 型にバインドされたプロシージャー、ALLO C AT E お
よび D EALLO C AT E ステートメントの ER R MSG = 引数が新たにサポートされるようになりました。
ALLO C AT E ステートメントが型の定義、および SO UR C E= 引数をサポートするようになりました。
出力の丸め (R O UND = , R Z, ...) がサポートされるようになりました。
ISO _C _BIND ING 組み込みモジュール型パラメーターの INT _FAST {8,16 ,32,6 4 ,128}_T フォー
マットがサポートされるようになりました。
95
開発者ガイド
O P ER AT O R (*) と ASSIG NMENT (= ) が、G ENER IC 型にバインドされたプロシージャーとして (つま
り、型にバインドされた演算子として) 許可されています。
4 .1.1.2.2.4 .4 . Fo rt ran 2003 の互換性
型にバインドされたプロシージャーまたはプロシージャーポインターをともなう拡張可能な派生型で P ASS
属性のあるものは、Fortran 2003 標準にしたがって C LASS を使用する必要があります。T Y P E を使用す
る回避策は、サポート対象外となりました。
4 .1.1.2.2.4 .5. Fo rt ran 2008 の機能
新たなコマンドラインオプション -std = f20 0 8ts が追加されました。このオプションは、Fortran
2008 標準および Fortran の C とのさらなる互換性に関する技術的仕様 (TS) 29113 に準拠するプログ
ラムのサポートを有効にします。詳細は、Chart of Fortran TS 29113 Features supported by GNU
Fortran を参照してください。
D O C O NC UR R ENT コンストラクトがサポートされています。このコンストラクトを使用して、個別の
ループ反復が相互依存性を持たないように指定することが可能です。
ポリモ−フィック coarray を除く完全な単一イメージのサポートが追加され、-fco array= si ng l e コ
マンドラインオプションを使うことで有効にできます。また、GNU Fortran は MPI ベースの coarray
コミュニケーションライブラリー経由で複数イメージの予備サポートも提供します。リモートの
coarray アクセスがまだ可能でないため、ライブラリーバージョンが不安定であることに注意してくだ
さい。
ST O P および ER R O R ST O P ステートメントが更新され、すべての定数式をサポートするようになりま
した。
C O NT IG UO US 属性がサポートされています。
MO LD 引数をともなう ALLO C AT E がサポートされています。
ST O R AG E_SIZE 組み込み問い合わせ関数がサポートされています。
NO R M2 および P AR IT Y 組み込み関数がサポートされています。
以下のビット組み込みが追加されました。
1 ビットの数をカウントし、パリティを返す P O P C NT および P O P P AR ビット組み込み。
ビット単位の比較用に BG E、BG T 、BLE、および BLT ビット組み込み。
左および右シフトの組み合わせ用に D SHIFT L および D SHIFT R ビット組み込み。
単純な左および右揃えマスク用の MASKL および MASKR ビット組み込み。
マスクを使ったビット単位のマージ用に MER G E_BIT S ビット組み込み。
シフト演算用の SHIFT A、SHIFT L、および SHIFT R ビット組み込み。
変換ビット組み込みの IALL、IANY 、および IP AR IT Y 。
EXEC UT E_C O MMAND _LINE 組み込みサブルーチンがサポートされています。
プロシージャー用の IMP UR E 属性がサポートされています。これにより、P UR E の制限なしで
ELEMENT AL プロシージャーの使用が可能になっています。
Null ポインター (NULL() を含む) および未割り当て変数を使って、オプションの非ポインター、割り当
て可能でない仮引数、不完全引数の表示を実際の引数として 使用できます。
96
⁠第4 章 コンパイルおよびビルド
T AR G ET 属性をともなう非ポインター変数を、INT ENT (IN) をともなう P O INT ER ダミーへの実際の
引数として使用できるようになっています。
プロシージャーポインターおよび派生型タイプのプロシージャーポインター (ポインターコンポーネン
ト) を含むポインターが NULL のみではなく、ターゲットでも初期化できるようになりました。
(コンストラクト名のある) EXIT ステートメントを使って D O に加
え、ASSO C IAT E、BLO C K、IF、SELEC T C ASE、および SELEC T T Y P E コンストラクトを解除で
きるようになっています。
内部プロシージャーを実際の引数として使用できます。
組み込みモジュール ISO _FO R T R AN_ENV の名前付き定数値
INT EG ER _KIND S、LO G IC AL_KIND S、R EAL_KIND S、および C HAR AC T ER _KIND S が追加されま
した。これらのアレイには、各タイプのサポートされた「有益な」値が含まれています。
ISO _C _BIND ING S 組み込みモジュールの C _SIZEO F モジュールプロシージャーおよび
ISO _FO R T R AN_ENV 組み込みモジュールの C O MP ILER _VER SIO N および C O MP ILER _O P T IO NS
モジュールプロシージャーが実装されました。
O P EN ステートメントが NEWUNIT = オプションをサポートしています。このオプションは、一意の
ファイルユニットを返すので、プログラムの異なる部分で同一ユニットが間違って使用されることを防
止します。
無制限のフォーマットアイテムがサポートされています。
ISO _FO R T R AN_ENV 組み込みモジュール型パラメーターの INT {8,16 ,32} および
R EAL{32,6 4 ,128} フォーマットがサポートされています。
T AN、SINH、C O SH、T ANH、ASIN、AC O S、および AT AN 関数での複素引数の使用が可能になりまし
た。また、新たな関数 ASINH、AC O SH、および AT ANH が実引数および複素引数用に追加さ
れ、AT AN(Y ,X) が AT AN2(Y ,X) のエイリアスとして機能します。
BLO C K コンストラクトが実装されました。
4 .1.1.2.2.4 .6 . Fo rt ran 2008 の互換性
GCC での ASY NC HR O NO US 属性の実装は、『TS 29113: Technical Specification on Further
Interoperability with C』 のドラフト候補と互換性があります。
4 .1.1.2.2.4 .7. Fo rt ran 77 の互換性
GNU Fortran コンパイラーが -fno -si g n-zero オプションと発行されると、ゼロが常にプラスであるか
のように SIG N 組み込みが動作します。
4 .1.1.2.3. AB I の互換性
本セクションでは、 アプリケーションバイナリインターフェース (ABI) レベルでの Red Hat D eveloper
Toolset コンパイラーとシステムコンパイラーの互換性について説明します。
4 .1.1.2.3.1. C + + AB I
アップストリームの GCC コミュニティーの開発では、GCC のメジャーバージョンにまたがる C++11 ABI
の互換性を保証していないため、Red Hat D eveloper Toolset での C++11 の使用においても同じ状況と
なっています。このため、Red Hat D eveloper Toolset 2.0 における-std = c+ + 11 オプションの使用は、
そのフラグでコンパイルされたすべての C++ オブジェクトが同じメジャーバージョンの Red Hat
D eveloper Toolset を使って構築された場合にのみサポートされます。-std = c+ + 0 x または -
97
開発者ガイド
std = g nu+ + 0 x フラグを使って Red Hat Enterprise Linux 5 もしくは 6 のシステムツールチェーン GCC
で構築されたオブジェクト、バイナリ、およびライブラリーを -std = c+ + 11 または -std = g nu+ + 11 フ
ラグを使って Red Hat D eveloper Toolset の GCC で構築されたものと混ぜても、明示的にはサポートされ
ません。
Red Hat D eveloper Toolset の最近のメジャーバージョンでは、より新しい GCC のメジャーリリースを使
用している可能性が高いため、-std = c+ + 11 または -std = g nu+ + 11 オプションで構築されたオブジェ
クト、バイナリ、およびライブラリーの前方互換性は保証、サポートがされていません。
Red Hat D eveloper Toolset の言語標準のデフォルト設定は C++98 です。このデフォルトモードで構築さ
れた (または -std = c+ + 9 8 で明示的に) C++98 準拠のバイナリもしくはライブラリーはいかなるもので
も、Red Hat Enterprise Linux 5 または 6 システムツールチェーン GCC で構築されたバイナリおよび共有
ライブラリーと自由に混ぜ合わせることができます。Red Hat では、本番ソフトウェア開発にこのデフォル
トの -std = c+ + 9 8 モードを使用することを推奨しています。
重要
アプリケーションで C++11 機能を使用するには、上記の ABI 互換性に関する情報を慎重に考慮して
ください。
上記の C++11 ABI の説明のほかは、Red Hat D eveloper Toolset では the Red Hat Enterprise Linux
Application Compatibility Specification に変更はありません。Red Hat D eveloper Toolset で構築された
オブジェクトと Red Hat Enterprise Linux v5.x/v6.x ツールチェーン (特に .o/.a ファイル) で構築されたオ
ブジェクトを混ぜると、Red Hat D eveloper Toolset ツールチェーンがリンケージに使用されます。これに
より、Red Hat D eveloper Toolset のみが提供するより新しいライブラリー機能がリンク時に確実に解決す
るようになります。
さまざまな長さのベクトルとのシステム上での名前競合を避けるために、SIMD ベクトル型の新たな標準マ
ングル化が追加されました。デフォルトではコンパイラーは旧型のマングル化を使用しますが、新型のマン
グル化では強力なエイリアスをサポートするターゲットにエイリアスを発信します。-Wabi が、旧型マン
グル化を使用するコードについての警告を表示するようになります。
4 .1.1.2.3.2. その他
GCC は、strl en()、strchr()、strcpy()、strcat() および stpcpy() (これらの
_FO R T IFY _SO UR C E バリアントも) などのさまざまな標準 C 文字列関数への呼び出しを、カスタマイズ
された、より速いコードにこれらを変換することで最適化します。つまり、これらの関数への呼び出しは、
元のソースコードのものよりも少ないもしくは別のものになる可能性があります。この最適化はデフォルト
で、-O 2 もしくはそれ以上の最適化レベルで有効になります。-fno -o pti mi ze-strl en を使用する
か、サイズの最適化を実行すると無効になります。
32-bit GNU/Linux でコンパイルを実行し、サイズの最適化を行なっていない場合、-fo mi t-framepo i nter がデフォルトで有効になります。デフォルト設定を事前に選択するには、-fno -o mi t-framepo i nter コマンドラインオプションを使用します。
x86 ターゲット上で厳密な C99 モードでの浮動少数点の計算は、より厳密な標準準拠の GCC でコンパイ
ルされます。このため計算の実行が非常に遅くなる場合があります。これは、-fexcesspreci si o n= fast を使って無効にできます。
4 .1.1.2.4 . デバッグ機能の互換性
GCC は、以前よりも多くのまたはより新しい D WARF 機能を使用する D WARF デバッグ情報を生成しま
す。Red Hat D eveloper Toolset に含まれる GD B はこれらの機能の取り扱いが可能ですが、7.0 よりも古
いバージョンの GD B は処理できません。GCC は、-g d warf-2 -g stri ct-d warf または -g d warf-3
-g stri ct-d warf オプション (後者は GD B 7.0 よりも古いバージョンが一部処理) を使用することで古い
98
⁠第4 章 コンパイルおよびビルド
D WARF 機能でのデバッグ情報のみを生成するように制限することができます。
Valg rin d 、Syst emT ap 、またはサードパーティーのデバッガーといった多くのツールは、デバッグ情報
を使用します。これらのツールでは、-g d warf-2 -g stri ct-d warf オプションの使用が推奨されます。
注記
デバッグ生成におけるリンク時の最適化は、gcc 4.7 および 4.8 ではまだサポートされていません。
このため、-fl to と -g オプションを合わせた使用は、Red Hat D eveloper Toolset ではサポート
対象外となります。
4 .1.1.2.5. 他の互換性
GCC はコマンドラインオプションを解析する際により厳密になっており、無効なコマンドラインオプショ
ンが使用されると、g cc と g + + がエラーを報告します。特に、リンクするだけでコードをコンパイルしな
い場合、GCC の以前のバージョンは -- で始まるすべてのオプションを無視します。たとえば、--asneed ed や --expo rt-d ynami c といったリンカーが受け付けるオプションを g cc と g + + はもう受け
付けず、-Wl ,--as-need ed もしくは -Wl ,--expo rt-d ynami c が意図されている場合はこれを使っ
たリンカーに向けられることになります。
新たなリンク時最適化機能 (「リンク時の最適化」 を参照) が理由で、旧型のモジュール間最適化フレーム
ワークのサポートが廃止され、-co mbi ne コマンドラインオプションは受け付けられなくなりました。
4 .2. 分散コンパイル
Red Hat Enterprise Linux は 分散コンパイル もサポートします。これは、1 つのコンパイルジョブをいく
つもの小さいジョブに変換することです。これらのジョブがマシン群に分配されるので、ビルド時間が早ま
ります (大型のコードベースのプログラムでは特に)。d i stcc パッケージがこの機能を提供します。
分散コンパイルを設定するには、以下のパッケージをインストールします。
d i stcc
d i stcc-server
分散コンパイルの詳細情報は、d i stcc および d i stccd の man ページを参照してください。以下のリン
クでも d i stcc の開発についての詳細情報を提供しています。
http://code.google.com/p/distcc
4 .3. Aut ot ools
GNU Autotools はコマンドラインツールのスイートで、開発者はこれを使うことでインストール済みパッ
ケージや Linux ディストリビューションに関係なく異なるシステム上でアプリケーションをビルドできま
す。このツールは、開発者が co nfi g ure スクリプトを作成する際の手助けとなります。このスクリプト
はビルド前に実行され、アプリケーションのビルドに必要なトップレベルの Makefi l e を作成しま
す。co nfi g ure スクリプトは、現行システム上でテストを実行し、追加ファイルを作成し、ビルダーが提
供するパラメーターのように他のディレクティブを実行することができます。
Autotools スイートの中で最も一般的に使用されるものは、以下のとおりです。
au t o co n f
入力ファイル (例: co nfi g ure. ac) から co nfi g ure スクリプトを生成します。
99
開発者ガイド
au t o make
特定システム上でプロジェクト用の Makefi l e を作成します。
au t o scan
予備入力ファイル (つまり、co nfi g ure. scan) を作成します。これは、auto co nf が使用す
る最終的な co nfi g ure. ac を作成するために編集可能なものです。
Autotools スイートの全ツールは、D evel o pment T o o l s グループパッケージの一部です。このグルー
プパッケージをインストールして Autotools スイート全体をインストールすることも可能ですし、または
yum を使用してスイートの好みのツールのみをインストールすることもできます。
4 .3.1. Eclipse 用の Aut ot ools プラグイン
Autotools スイートは、Autotools プラグインで Eclipse ID E にも統合されます。このプラグインは、
Autotools 用の Eclipse グラフィカルユーザーインターフェイスを提供し、これはほとんどの C/C++ プロ
ジェクトに適したものです。
Red Hat Enterprise Linux 6 では、このプラグインは 以下の 2 つの新規 C/C++ プロジェクト用テンプレー
トのみをサポートします。
空のプロジェクト
" hello world" アプリケーション
空のプロジェクトのテンプレートは、すでに Autotools をサポートしている C/C++ 開発ツールキットにプ
ロジェクトをインポートする際に使用します。Autotools プラグインへの将来的な更新には、共有ライブラ
リや他の複雑なシナリオを作成するための新たなグラフィカルユーザーインターフェイス (例えば、ウィ
ザード) が含まれます。
Autotools プラグインの Red Hat Enterprise Linux 6 バージョンは、g i t や mercuri al を Eclipse に統
合することもしません。このため、g i t リポジトリを使用する Autotools プロジェクトは、Eclipse のワー
クスペース 外 でチェックアウトする必要があります。その後に Eclipse 内のそのようなプロジェクトの
ソースの場所を特定することができます。すべてのリポジトリ操作 (コミット、更新など) は、コマンドラ
インで行います。
4 .3.2. 設定スクリプト
Autotools の最も重要な機能は、co nfi g ure スクリプトの作成です。このスクリプトは、ツールや入力
ファイル、プロジェクトのビルドのために使用可能なその他の機能についてシステムのテストを行います
[2] 。co nfi g ure スクリプトは Makefi l e を生成します。これは、システム設定に基づいてmake ツー
ルがプロジェクトをビルドできるようにします。
co nfi g ure スクリプトを作成するには、ます入力ファイルを作成します。そして、それを Autotools
ユーティリティにフィードして co nfi g ure スクリプトを作成します。この入力ファイルは通常
co nfi g ure. ac または Makefi l e. am です。前者は通常 auto co nf が処理を行い、後者は auto make
にフィードされます。
Makefi l e. am 入力ファイルが利用可能な場合は、auto make ユーティリティが Makefi l e テンプレー
ト (つまり、Makefi l e. i n) を作成します。これは、設定時に収集された情報を参照する場合がありま
す。例えば、Makefi l e は特定のライブラリにリンクする必要がある場合がありますが、これはそのライ
ブラリがすでにインストールされている 場合のみ です。co nfi g ure スクリプトが実行される
と、auto make が Makefi l e. i n テンプレートを使用して Makefi l e を作成します。
代わりに co nfi g ure. ac ファイルが利用可能な場合は、co nfi g ure. ac が起動したマクロに基づいて
auto co nf が自動的に co nfi g ure スクリプトを作成します。予備の co nfi g ure. ac を作成するに
は、auto scan ユーティリティを使用してファイルを適時編集します。
100
⁠第4 章 コンパイルおよびビルド
4 .3.3. Aut ot ools のドキュメンテーション
Red Hat Enterprise Linux には、auto co nf、auto make、auto scan および Autotools スイートに含ま
れるほとんどのツールの man ページが含まれています。また、Autotools コミュニティーは auto co nf お
よび auto make に関する幅広いドキュメンテーションを以下の Web サイトで提供しています。
http://www.gnu.org/software/autoconf/manual/autoconf.html
http://www.gnu.org/software/autoconf/manual/automake.html
以下のサイトは Autotools の使用方法を説明しているオンラインブックです。上記のオンラインドキュメン
テーションは Autotools に関する最新情報で推奨されますが、このオンラインブックもすぐれた代替手段で
入門書となります。
http://sourceware.org/autobook/
Autotools 入力ファイルの作成方法に関する情報は、以下のサイトを参照してください。
http://www.gnu.org/software/autoconf/manual/autoconf.html#Making-configure-Scripts
http://www.gnu.org/software/autoconf/manual/automake.html#Invoking-Automake
以下のアップストリームの例も簡単な hel l o プログラムでの Autotools の使用を説明しています。
http://www.gnu.org/software/hello/manual/hello.html
4 .4 . Eclipse Built -in Specfile Edit or
Eclipse 用の Specfile Editor プラグインは、開発者が . spec ファイルを管理する際に役立つ機能を提供し
ます。このプラグインを使うと、ユーザーは . spec ファイルの編集の際に、オートコンプリート機能やハ
イライト、ファイルのハイパーリンク、折り曲げなどのいくつかの Eclipse GUI 機能を活用することができ
ます。
また、Specfile Editor プラグインは rpml i nt ツールを Eclipse インターフェイスに統合しま
す。rpml i nt はコマンドラインツールで、開発者が一般的な RPM パッケージエラーを検出する際に役立
ちます。Eclipse インターフェイスが提供する豊富な仮想化は、rpml i nt がレポートするミスを開発者が
迅速に検出、表示、訂正する際に役立ちます。
Eclipse 用の Specfile Editor は、ecl i pse-rpm-ed i to r パッケージで提供されます。このプラグインに
ついての詳細は、Eclipse ヘルプコンテンツ の 『Specfile Editor User Guide』 を参照してください。
4 .5. Eclipse の CDT
CDT (C/C++ 開発ツール) は、Eclipse で C および C++ プロジェクトを開発する際のサポートを追加する
Eclipse プロジェクトです。ユーザーは以下の 3 つの形式のプロジェクトを作成できます。
1. Managed Make プロジェクト
2. Standard Make プロジェクト
3. Autotools プロジェクト
4 .5.1. Managed Make プロジェクト
101
開発者ガイド
managed make CD T プロジェクトは管理プロジェクトとも呼ばれるもので、プロジェクトのビルド方法
に関する詳細がエンドユーザーのために自動化されているものです。これは、別のタイプの CD T C/C++ プ
ロジェクトである standard make プロジェクトとは異なるものです。standard make プロジェクトで
は、ビルドの詳細が指定されている Makefile をユーザーが提供します。
管理プロジェクトでは、管理プロジェクトのタイプと必要なツールチェーンを選択して開始します。プロ
ジェクトのタイプは、実行可能ファイルや共有ライブラリ、静的ライブラリといったプロジェクトの最終
的なターゲットを基にカテゴリ分けされます。これらのカテゴリ内には、ベースソースファイルが既に提供
されているより特定されたプロジェクト (例えば、hello world サンプルの実行可能プロジェクト) 用のテン
プレートがある場合があります。これらはさらにカスタマイズが可能です。
ツールチェーンは、ターゲット生成に使用されるツールセットです。通常、Red Hat Enterprise Linux の
C/C++ 開発者は、コンパイルやリンク、アセンブリに GCC を使用する Linux GCC ツールチェーンを選択
します。ツールチェーンの各ツールは、通常ファイル接尾辞 (例えば、. c や . h、. S) やファイル名で指定
されている 1 つ以上の入力タイプに関連付けられています。このツールには開発者がカスタマイズできるパ
ラメーター設定があり、各ツールには作成される出力タイプがあります。また、関連付けられるコマンドも
しくはバイナリ実行可能ファイルがあり、これは複数のツールで重複する場合があります。例えば、C コン
パイラーとリンカーは両方とも GCC を使用できますが、コンパイラーとリンカーのツールではそれぞれ出
入力タイプが異なり、開発者に提示される設定も異なります。ツール設定をカスタマイズするに
は、Pro p ert ies > C /C + + B u ild > Set t in g s に移動します。ツールチェーン自体のカスタマイズ
は、Pro p ert ies > C /C + + B u ild > T o o lch ain Ed it o r で使用ツールを追加、削除、置き換えることで
可能です。
ソースファイルやヘッダーファイルなどの新規ファイルは、作成後にプロジェクトに追加できます。新規
ファイルは、入力タイプとツール設定に基づいて自動的にビルドに追加されます。管理プロジェクトがプロ
ジェクトと共に配布可能な Makefile を生成するには、B u ild er Set t in g s タブにある Pro ject > C /C + +
B u ild に移動します。これで、Eclipse 外での Makefile の使用が容易になります。
managed make C/C++ プロジェクトの詳細情報については、『C/C++ D evelopment User Guide』 を参
照してください。C o n cep t s > Pro ject T yp es, T asks > C reat in g a Pro ject か R ef eren ce >
C /C + + Pro p ert ies > C /C + + Pro ject Pro p ert ies > C /C + + B u ild > Set t in g s Pag e に移動しま
す。
4 .5.2. St andard Make プロジェクト
standard make CD T プロジェクトは、開発者が手動で管理する Makefile による従来の C プロジェクトで
す。managed make プロジェクトとは違い、Makefile における規則決定で使用するツール設定はありませ
ん。ビルドの一部として処理される新規ソースファイルがプロジェクトに追加される際は、Makefile を手
動で追加する必要があります。新規ファイル名が一致するパターン規則が存在する場合 (例えば、. c: . o 。
これは、接尾辞 . c の付いたファイルを接尾辞 . o の付いたファイルに処理する方法を提示)、これは必要
ありません。
プロジェクトのビルドにおけるデフォルトの make ターゲットは al l で、プロジェクト消去用のデフォル
トの make ターゲットは cl ean です。また、ユーザーが Makefile で見つかった他のターゲットをビルド
することもできます。これを行うには、Makefile Target ダイアログを使用して既存のものを実行もしくは
ビルドするためのターゲットを作成します。Makefile Target ダイアログでは、makefile で見つかった複数
のターゲットをグループ化する仮のターゲットを特定の順番で作成することもできます。特定の作成および
ビルドダイアログにアクセスするにはそれぞれ、Pro ject > Make T arg et > C reat e... もしくは
Pro ject > Make T arg et > B u ild ... に移動します。別の方法では、プロジェクトの reso urces で 右ク
リック をして Make T arg et s オプションを選択し、C reat e... または B u ild ... にアクセスします。
standard make C/C++ プロジェクトに関する詳細情報は、C/C++ D evelopment ユーザーガイドを参照し
てください。 C o n cep t s > Pro ject T yp es, T asks > C reat in g a p ro ject か R ef eren ce > C /C + +
Pro p ert ies > C /C + + Pro ject Pro p ert ies > C /C + + B u ild > Set t in g s Pag e に移動します。
4 .5.3. Aut ot ools プロジェクト
102
⁠第4 章 コンパイルおよびビルド
autotools プロジェクトは standard make プロジェクトに非常に似ていますが、Makefile は通常、ビルド
前に発生する設定手順の一部として生成されます。このタイプのプロジェクトに対するサポートを追加する
Autotools および Autotools プラグインの詳細に関しては、「Autotools」 を参照してください。standard
make プロジェクトのように、make ターゲットは Make Target ダイアログで実行できます。
4 .6. build-id バイナリの一意の ID
Red Hat Enterprise Linux Server 6 およびそれ以降でビルドされた実行可能ファイルや共有ライブラリに
はそれぞれ、160 ビットの SHA-1 文字列である一意の ID が割り当てられます。これは、バイナリの選択
部分のチェックサムとして生成されたものです。これにより、同一ホスト上の同一プログラムの 2 つのビル
ドが常に一貫性のある build-id とバイナリコンテンツを作成できるようになります。
以下のコマンドで、バイナリの build-id を表示します。
$ eu-readelf -n usr/bin/bash
[...]
Note section [ 3] '.note.gnu.build-id' of 36 bytes at offset 0x274:
Owner Data size
Type
GNU
20
GNU_BUILD_ID
Build ID: efdd0b5e69b0742fa5e5bad0771df4d1df2459d1
バイナリの一意の ID は、「コアファイル解析用の D ebuginfo パッケージのインストール」 にあるよう
に、コアファイルの分析などの場合に便利です。
4 .7. Soft ware Collect ions および scl -uti l s
Software Collections を使うと、システム上で複数バージョンの同一 RPM パッケージをビルドして、同時
にインストールすることが可能になります。Software Collections は、従来の RPM パッケージマネジャー
がインストールするパッケージのシステムバージョンに影響を与えません。
システム上で Software Collections のサポートを有効にするには、シェルプロンプトで以下を入力して
scl-utils および scl-utils-build をインストールします。
# yum i nstal l -y scl -uti l s scl -uti l s-bui l d
scl-utils パッケージは scl ツールを提供します。これは Software Collection を有効にし、Software
Collection 環境でアプリケーションを実行します。
scl ツールの一般的な使用方法は、以下の構文の使用で説明できます。
scl action software_collection_1 software_collection_2 command
例4 .1 アプリケーションを直接実行する
so f t ware_co llect io n _1 と呼ばれる Software Collection --versi o n オプションで Perl を直接実
行するには、以下のコマンドを実行します。
scl enabl e so ftware_co l l ecti o n_1 ' perl --versi o n'
例4 .2 複数の So f t ware C o llect io n を有効にして、シェルを実行する
103
開発者ガイド
複数の Software Collection を有効にした環境で B ash シェルを実行するには、以下のコマンドを実行
します。
scl enabl e so ftware_co l l ecti o n_1 so ftware_co l l ecti o n_2 bash
上記のコマンドは、so f t ware_co llect io n _1 および so f t ware_co llect io n _2 と呼ばれる 2 つの
Software Collection を有効にします。
例4 .3 ファイルに保存されたコマンドを実行する
ファイルに保存された多くのコマンドを Software Collection 環境で実行するには、以下のコマンドを実
行します。
cat cmd | scl enabl e so ftware_co l l ecti o n_1 上記のコマンドは、so f t ware_co llect io n _1 と呼ばれる Software Collection 環境の cmd ファイルに
保存されているコマンドを実行します。
Software Collections および scl -uti l s に関する詳細情報は、『Red Hat D eveloper Toolset』 の
『Software Collections Guide』 の部分を参照してください。
[2] co nfi g ure が実行可能なテストについての詳細情報は以下のリンクを参照してください
http ://www.g nu.o rg /s o ftware/auto c o nf/manual/auto c o nf.html#Exis ting -Tes ts
104
⁠第5章 デバッグ
第5章 デバッグ
通常、有用で質の高いソフトウェアは、アプリケーション開発の複数フェーズを経て作成されるため、その
間にミスについての十分な機会が設けられます。一部のフェーズには、エラーを検出する一連のメカニズム
がそれぞれ設定されています。例えば、変数や関数などのオブジェクトが適切に記述されていることを確認
するために、コンパイル時に基本的なセマンティクス解析が行われます。
アプリケーション開発の各フェーズで実行されるエラーチェックのメカニズムは、コード内の単純で明らか
な誤りを見つけることを目的としています。一方、デバッグフェーズは、所定のコード検査で見過ごされる
より見つけにくいエラーを明らかにする際に役に立ちます。
5.1. ELF の実行可能バイナリ
Red Hat Enterprise Linux は、実行可能バイナリ、共有ライブラリまたは debuginfo ファイルに ELF を使
用します。これらの debuginfo ELF ファイル内では、D WARF フォーマットが使用されます。D WARF の
バージョン 3 が ELF ファイルで使用されます (g cc -g は g cc -g d warf-3 と同等です)。D WARF
debuginfo には以下が含まれます。
バイナリのターゲットアドレスを含む、コンパイルされた関数および変数すべての名前
ソース行番号を含む、コンパイルに使用されるソースファイル
ローカル変数の場所
重要
STABS はたまに UNIX で使用されますが、より古く、機能性に乏しいフォーマットです。Red Hat
ではこの使用を奨励していません。GCC および GD B での STABS の作成と使用のサポートは可能
な範囲でのみ行なわれます。
これらの ELF ファイルでは、GCC debuginfo のレベルも使用されます。デフォルトはレベル 2 であり、
ここではマクロ情報が表示されません。レベル 3 には C/C++ マクロ定義が含まれますが、この設定ではデ
バッグ情報が非常に大きくなる可能性があります。デフォルト g cc -g のコマンドは g cc -g 2 と同一で
す。マクロ情報をレベル 3 に変更するには、g cc -g 3 を使用します。
利用可能な debuginfo のレベルは複数あります。ファイルでどのセクションが使用されているかを確認す
るには、コマンド read el f -WS file を使用します。
表5.1 d eb u g in f o のレベル
バイナリの状態
コマンド
注意事項
Stripped (削除)
stri p file
共有ライブラリとのランタイムリ
ンクに必要なシンボルのみが表示
されます。
または
g cc -s -o file
使用される ELF セクション:
. d ynsym
105
開発者ガイド
バイナリの状態
コマンド
注意事項
ELF シンボル
g cc -o file
関数および変数の名前のみが表示
され、ソースファイルのバイン
ディングおよびタイプはありませ
ん。
使用される ELF セクション:
. symtab
D WARF debuginfo (マクロあり) g cc -g -o file
タイプも含め、ソースファイル名
および行番号は認識されます。
使用される ELF セクション:
. d ebug _*
D WARF debuginfo (マクロあり) g cc -g 3 -o file
g cc -g と似ていますが、マク
ロが GD B に認識されます。
使用される ELF セクション:
. d ebug _macro
注記
GD B はソースファイルを解釈することはなく、テキストとしてそれらを表示するのみです。情報を
D WARF に保存するには g cc -g とその変数を使用します。
g cc -rd ynami c を使用してプログラムやライブラリをコンパイルすることは奨励されません。特定のシ
ンボルについては、g cc -Wl , --d ynami c-l i st= . . . を代わりに使用してください。g cc rd ynami c が使用される場合、stri p コマンドや -s gcc オプションの効果は一切ありません。それは、
共有ライブラリとのランタイムリンケージについてのすべての ELF シンボルがバイナリで保持されるため
です。
ELF シンボルは、read el f -s file コマンドによって読み取られます。
D WARF シンボルは、read el f -w file コマンドによって読み取られます。
コマンド read el f -wi file は、プログラム内でコンパイルされた debuginfo の優れた検証コマンド
です。コマンド stri p file または g cc -s は、プログラムのコンパイルのさまざまなステージの出力で
誤って実行されます。
read el f -w file コマンドは、フォーマットを持つ . eh_frame と呼ばれる特殊セクションを表示す
るために使用でき、その目的は D WARF セクションの . d ebug _frame と類似しています。. eh_frame
セクションは、ランタイム C++ 例外の解決に使用され、-g gcc オプションが使用されない場合であって
も存在します。これはプライマリ RPM に保存され、debuginfo RPM には存在しません。
D ebuginfo RPM には、. symtab および . d ebug _* セクションが含まれま
す。. eh_frame、. eh_frame_hd r、または . d ynsym のいずれのセクションもプログラムのランタイム
時に必要になるため、debuginfo RPM には移行されず、またこの中には存在しません。
5.2. Debuginfo パッケージのインストール
Red Hat Enterprise Linux は、オペレーティングシステムに含まれるアーキテクチャーに依存するすべての
RPM 用の -d ebug i nfo パッケージも提供します。packagename-
106
⁠第5章 デバッグ
d ebug i nfo -version-release. architecture. rpm パッケージには、パッケージソースファイル
と最終的なインストール済みバイナリの関係についての詳細情報が含まれます。debuginfo パッケージには
両方の . d ebug ファイルが含まれ、これらには D WARF debuginfo とバイナリパッケージのコンパイルに
使用されるソースファイルが含まれます。
注記
デバッガー機能のほとんどは、debuginfo と同等の情報がインストールされていないと、パッケー
ジをデバッグしようとする場合に失敗します。例えば、エクスポートされた共有ライブラリの関数の
名前は使用できますが、これらに一致するソースファイル行は debuginfo パッケージがインストー
ルされていないと使用できません。
お使いのプログラムに g cc コンパイルオプション -g を使用してください。デバッグのエクスペリエンス
は、最適化 (-O 2 などの gcc オプション -O ) が -g と一緒に適用される場合に向上します。
Red Hat Enterprise Linux 6 の debuginfo パッケージは Red Hat Network の新規チャネルで利用できるよ
うになりました。パッケージの -d ebug i nfo パッケージ (通常は packagename-d ebug i nfo ) をイン
ストールするには、まずマシンを対応する D ebuginfo チャネルにサブスクライブさせる必要があります。
例えば、Red Hat Enterprise Server 6 の場合、対応するチャネルは R ed Hat Enterpri se Li nux
Server D ebug i nfo (v. 6 ) になります。
Red Hat Enterprise Linux システムパッケージは、最適化 (gcc オプション -O 2) を使ってコンパイルされ
ています。これは、いくつかの変数が <o pti mi zed o ut> として表示されることを意味します。コード
のステップスルーによる多少の「ジャンプ」がありますが、クラッシュを分析することができます。最適
化のために一部の情報が欠落する場合、コードを逆アセンブルし、ソースに手動で一致させることにより、
正しい変数情報を得ることができます。ただし、これは例外ケースにのみ適用され、通常のデバッグには適
していません。
システムパッケージの場合、GD B はその機能を制限する debuginfo パッケージの欠落があるかどうかを
ユーザーに通知します。
gdb ls
[...]
Reading symbols from /usr/bin/ls...(no debugging symbols found)...done.
Missing separate debuginfos, use: debuginfo-install coreutils-8.416.el6.x86_64
(gdb) q
デバッグされるシステムパッケージが既知である場合、上記の GD B で提案されるコマンドを使用します。
これにより、packagename が依存するすべてのデバッグパッケージが自動的にインストールされます。
# debuginfo-install packagename
5.2.1. コアファイル解析用の Debuginfo パッケージのインストール
コアファイルは、プロセスのクラッシュ時のメモリイメージの表現です。システムプログラムのクラッ
シュをバグ報告する場合、Red Hat では 『Red Hat 導入ガイド』の『自動バグ報告ツール』の章で説明さ
れている ABRT ツールの使用を推奨しています。ABRT が目的に合わない場合のために、ABRT で自動化さ
れるステップを以下に説明します。
プロセスのクラッシュ時に ul i mi t -c unl i mi ted 設定が使用される場合、コアファイルは現在の
ディレクトリにダンプされます。コアファイルには、プロセスによってディスクファイルの元の状態から
修正されたメモリ領域のみが含まれます。クラッシュの完全な解析を実行するには、コアファイルに以下が
含まれている必要があります。
107
開発者ガイド
コアファイル自体
/usr/sbi n/send mai l などのクラッシュした実行可能バイナリ
クラッシュ時にバイナリでロードされたすべての共有ライブラリ
実行可能ファイルおよびそのロードされたすべてのライブラリ用の .debug ファイルおよびソースファ
イル (どちらも debuginfo RPM に保存されている)
適切な解析を行うには、関係するすべての RPM 用の正確な version-release.architecture か、ま
たは独自にコンパイルしたバイナリの同じビルドが必要になります。クラッシュ時に、アプリケーションが
すでにディスク上の yum によって再コンパイルされているか、または更新されている場合、コアファイル
の解析に適してないファイルのレンダリングが行われます。
コアファイルには、関連するすべてのバイナリの build-id が含まれます。build-id についての詳細
は、「build-id バイナリの一意の ID 」 を参照してください。コアファイルのコンテンツは以下のように表
示されます。
$ eu-unstrip -n --core=./core.9814
0x400000+0x207000 2818b2009547f780a5639c904cded443e564973e@ 0x400284
usr/bin/sleep /usr/lib/debug/bin/sleep.debug [exe]
0x7fff26fff000+0x1000
1e2a683b7d877576970e4275d41a6aaec280795e@ 0x7fff26fff340 . - linux-vdso.so.1
0x35e7e00000+0x3b6000
374add1ead31ccb449779bc7ee7877de3377e5ad@ 0x35e7e00280 /usr/lib64/libc2.14.90.so /usr/lib/debug/lib64/libc-2.14.90.so.debug libc.so.6
0x35e7a00000+0x224000
3ed9e61c2b7e707ce244816335776afa2ad0307d@ 0x35e7a001d8 /usr/lib64/ld2.14.90.so /usr/lib/debug/lib64/ld-2.14.90.so.debug ld-linux-x86-64.so.2
各行に含まれるそれぞれの列の意味は以下のようになります。
特定のバイナリがマップされるメモリー内アドレス (例えば、最初の行の 0 x4 0 0 0 0 0 )。
バイナリのサイズ (例えば、最初の行の + 0 x20 70 0 0 )。
バイナリの 160-bit SHA-1 build-id (例えば、最初の行の
2818b20 0 9 54 7f780 a56 39 c9 0 4 cd ed 4 4 3e56 4 9 73e)。
build-id バイトが保存されていたメモリ内アドレス (例えば、最初の行の @ 0 x4 0 0 284 )。
ディスク上のバイナリファイル (ある場合)(例えば、最初の行の usr/bi n/sl eep)。これは、このモ
ジュールの eu-unstri p で検索されました。
ディスク上の debuginfo ファイル (ある場合)(例えば、/usr/l i b/d ebug /bi n/sl eep. d ebug )。
ただし、バイナリファイル参照を代わりに使用するのがベストプラクティスになります。
コアファイルの共有ライブラリリストに保存される共有ライブラリ名 (例えば、3 行目の
l i bc. so . 6 )。
それぞれの build-id (例えば、 ab/cd ef0 1234 56 789 0 1234 56 789 0 1234 56 789 0 123) について、シ
ンボリックリンクがその debuginfo RPM に組み込まれます。上記の /usr/bi n/sl eep 実行可能ファイ
ルを例とすると、co reuti l s-d ebug i nfo RPM には、他のファイルのほかに以下が含まれます。
lrwxrwxrwx 1 root root 24 Nov 29 17:07 /usr/lib/debug/.buildid/28/18b2009547f780a5639c904cded443e564973e -> ../../../../../bin/sleep*
lrwxrwxrwx 1 root root 21 Nov 29 17:07 /usr/lib/debug/.buildid/28/18b2009547f780a5639c904cded443e564973e.debug ->
108
⁠第5章 デバッグ
../../bin/sleep.debug
ケースによっては (コアファイルのロードなど)、GD B は、name-d ebug i nfo -versionrelease. rpm パッケージ の名前、バージョンまたはリリースを認識しません。このような場合に、GD B
は異なるコマンドを提案します。
gdb -c ./core
[...]
Missing separate debuginfo for the main executable filename
Try: yum --disablerepo='*' --enablerepo='*debug*' install
/usr/lib/debug/.build-id/ef/dd0b5e69b0742fa5e5bad0771df4d1df2459d1
バイナリパッケージ packagename-debuginfo-version-release.architecture.rpm の versionrelease.architecture は完全一致である必要があります。それが異なる場合、GD B は debuginfo パッケージ
を使用することができません。異なるビルドの同じ version-release.architecture であっても、debuginfo
パッケージの互換性がなくなる可能性があります。GD B が debuginfo が不足していることを報告する場合
は、以下を必ず再チェックしてください。
rpm -q packagename packagename-d ebug i nfo
version-release.architecture 定義が一致する必要があります。
rpm -V packagename packagename-d ebug i nfo
このコマンドは、packagename などの修正された可能性のある設定ファイルを除いて一切の出力
を行いません。
rpm -q i packagename packagename-d ebug i nfo
version-release.architecture は、Vendor、Build D ate、および Build Host の一致する情報を表
示する必要があります。Red Hat Enterprise Linux RPM パッケージ用に CentOS debuginfo
RPM を使用しても機能しません。
必要な build-id が既知である場合、以下のコマンドはどの RPM にそれが含まれるかを照会します。
$ repoquery --disablerepo='*' --enablerepo='*-debug*' -qf
/usr/lib/debug/.build-id/ef/dd0b5e69b0742fa5e5bad0771df4d1df2459d1
例えば、コアファイルに一致する実行可能ファイルのバージョンは、以下でインストールできます。
# yum --enablerepo='*-debug*' install $(eu-unstrip -n --core=./core.9814
| sed -e 's#^[^ ]* \(..\)\([^@ ]*\).*$#/usr/lib/debug/.build-id/\1/\2#p'
-e 's/$/.debug/')
バイナリが RPM にパッケージされておらず、yum リポジトリに保存されていない場合は同様のメソッドを
使用することができます。/usr/bi n/createrepo を使用し、カスタムアプリケーションビルドでローカ
ルリポジトリを作成することができます。
5.3. GDB
基本的に、大半のデバッガーのように、GD B は非常に厳密に制御された環境でコンパイルされたコードの
実行を管理します。この環境は、GD B の操作に必要な以下の基本的なメカニズムを可能にします。
デバッグされるコード内のメモリの検査および修正 (例えば、変数の読み取りおよび設定)。
主に実行中かまたは停止しているかなどの、デバッグされるコードの実行状態の制御。
109
開発者ガイド
コードの特定セクションの実行の検出 (プログラマーの関心のある特定エリアに達した際にコードの実行
を停止するなど)。
メモリの特定領域へのアクセスの検出 (指定された変数にアクセスした際にコードの実行を停止するな
ど)。
制御された方法による (それ以外の停止されたプログラムから) のコードの複数部分の実行。
シグナルなどのプログラミングによる非同期イベントの検出。
これらのメカニズムの操作は、コンパイラーが生成する情報にほぼ依存します。例えば、変数の値を表示す
るには、GBD は以下を認識する必要があります。
メモリ内の変数の場所
変数の性質
つまり、倍精度の浮動小数点値を表示するには、文字ストリングを表示する場合とは非常に異なるプロセス
が必要であることを意味しています。構造などの複雑なケースでは、GD B は構造内の個々のエレメントの
特徴だけでなく、構造の形態も認識する必要があります。
GD B が完全に機能するには以下のアイテムが必要です。
デバッグ情報
GD B の操作の多くは、プログラムの デバッグ情報に依存します。この情報は通常コンパイラーか
ら発生するものですが、これらの多くは、プログラムのデバッグ中にのみ必要になります。つま
り、プログラムの通常の実行時には使用されません。この理由により、コンパイラーは常にデ
フォルトでこの情報を利用可能にする訳ではありません。例えば、GCC は -g フラグを使ってこ
のデバッグ情報を提供するために明示的に指示される必要があります。
GD B の機能を完全に利用するには、GD B でデバッグ情報を利用できるようにすることを強くお
勧めします。GD B は、利用可能なデバッグ情報がない状態でコードに対して実行される場合にそ
の使用が非常に限られます。
ソースコード
GD B (またはそれ以外のデバッガー) の最も役に立つ機能の 1 つに、プログラム実行内のイベン
トと状況を、ソースコードのこれらに対応するロケーションに関連付ける機能があります。この
ロケーションは、通常はソースファイルの特定の行または一連の行を参照します。当然これを行
うには、プログラムのソースコードがデバッグ時に GD B で利用可能であることが必要です。
5.3.1. 単純な GDB
GD B には文字通り数十のコマンドが含まれます。このセクションでは、最も基本的なコマンドを説明しま
す。
br ( b reakp o in t )
breakpoint コマンドは、GD B に対し実行内の指定ポイントに達すると実行を一時停止するよう
に指定します。このポイントは数多くの方法で指定することができますが、最も一般的な方法
は、単にソースファイルの行番号か、または関数の名前になります。任意の数のブレークポイン
トを同時に有効にすることができます。これは、しばしば GD B の開始後に発行される最初のコ
マンドになります。
r ( ru n )
run コマンドはプログラムの実行を開始します。run を任意の引数を使って実行すると、それら
の引数は、プログラムが正常に開始されているかのように実行可能ファイルに渡されます。通
常、ユーザーはブレークポイントを設定した後にこのコマンドを発行します。
110
⁠第5章 デバッグ
実行可能ファイルを開始する前か、または実行可能ファイルが例えばブレークポイントで停止する場合、プ
ログラムの状態を多くの面から検査することができます。以下のコマンドは、検査に使用できるより一般的
な方法です。
p ( p rin t )
pri nt コマンドは、指定された引数の値を表示し、この引数にはプログラムに関連するほぼすべ
てのものを使用できます。通常引数は、単純な単一値から構造に至る、様々な複雑度を持つ変数
の名前です。また引数は、プログラム変数やライブラリ関数、またはテスト中のプログラムで定
義される関数の使用を含む、現在の言語で有効な式として使用することもできます。
bt ( b ackt race)
backtrace は、実行が停止されるまで使用される関数呼び出しのチェーンを表示します。これ
は、定義することが難しい原因を持つ重大なバグ (セグメント化障害など) を調査する際に役に立
ちます。
l ( list )
実行が停止すると、l i st コマンドは、プログラムが停止した場所に対応するソースコードの行
を表示します。
停止したプログラムの実行は、数多くの方法で再開することができます。以下は最も一般的なものです。
c ( co n t in u e)
co nti nue コマンドは、プログラムの実行を再開し、プログラムがブレークポイントが検出する
か、特定または緊急の条件 (エラーなど) を検出するか、または停止するまで継続して実行されま
す。
n ( n ext )
co nti nue のように、next コマンドも実行を再開しますが、 co nti nue コマンドの暗黙的な
停止条件のほかに、next は、現在のソースファイル内のコードの次のシーケンシャル行でも実
行を停止します。
s ( st ep )
next のように、step コマンドも、現在のソースファイル内のコードのそれぞれのシーケンシャ
ル行で実行を停止します。ただし、実行が 関数呼び出しを含むソース行で現在停止している場
合、GD B は関数呼び出しを入力した後に (それを実行するのではなく) 実行を停止します。
fi ni ( f in ish )
前述のコマンドのように、fi ni sh コマンドは実行を再開しますが、実行が関数から返されると
停止します。
最後に、以下は 2 つの基本的なコマンドになります。
q ( q u it )
これは実行を終了させます。
h ( h elp )
hel p コマンドは、大規模な内部ドキュメンテーションへのアクセスを提供します。このコマン
ドは引数を取ります。例えば、hel p breakpo i nt (または h br) は、 breakpo i nt コマンド
の詳細な説明を表示します。さらに詳しい情報は、各コマンドの hel p 出力を参照してくださ
い。
111
開発者ガイド
5.3.2. GDB の実行
このセクションでは、以下の単純なプログラムを使った GD B の基本的な実行について説明します。
h ello .c
#include <stdio.h>
char hello[] = { "Hello, World!" };
int
main()
{
fprintf (stdout, "%s\n", hello);
return (0);
}
以下の手順は、最も基本的な形式でデバッグプロセスを説明しています。
手順5.1 ' H ello Wo rld ' プログラムのデバッグ
1. 以下のように、デバッグフラグを使った実行可能ファイルに hello.c をコンパイルします。
g cc -g -o hel l o hel l o . c
生成されるバイナリ hel l o が hel l o . c と同じディレクトリにあることを確認します。
2. hel l o バイナリで g d b を実行します (つまり g d b hel l o )。
3. いくつかの導入部のコメントの後に、g d b はデフォルトの GD B プロンプトを表示します。
(gdb)
4. 変数 hel l o はグローバルであるため、メインの 手順が開始する前に表示することができます。
gdb) p hello
$1 = "Hello, World!"
(gdb) p hello[0]
$2 = 72 'H'
(gdb) p *hello
$3 = 72 'H'
(gdb)
pri nt は hel l o [0 ] をターゲットとしており、 *hel l o には *(hel l o + 1) などのような式
の評価が必要になることに注意してください。
(gdb) p *(hello + 1)
$4 = 101 'e'
5. 次に、ソースをリストします。
(gdb) l
1
#include <stdio.h>
112
⁠第5章 デバッグ
2
3
4
5
6
7
8
9
10
char hello[] = { "Hello, World!" };
int
main()
{
fprintf (stdout, "%s\n", hello);
return (0);
}
l i st は、fpri ntf 呼び出しが 8 行目にあることを示しています。その行にブレークポイントを
適用して、コードを再開します。
(gdb) br 8
Breakpoint 1 at 0x80483ed: file hello.c, line 8.
(gdb) r
Starting program: /home/moller/tinkering/gdb-manual/hello
Breakpoint 1, main () at hello.c:8
8
fprintf (stdout, "%s\n", hello);
6. 最後に、next コマンドを使用して、fpri ntf 呼び出しの後に進んでこれを実行します。
(gdb) n
Hello, World!
9
return (0);
以下のセクションでは、GD B のより複雑なアプリケーションについて説明します。
5.3.3. 条件付きブレークポイント
現実の多くの場面で、プログラムは最初の数千回はタスクを適切に実行するものの、タスクの反復回数が
8,000 回に達するとクラッシュし始めたり、エラーが検出される場合があります。プログラマーがクラッ
シュした反復に達するためだけに co nti nue コマンドを数千回も辛抱強く実行するとは想像し難いため、
このようなデバッグプログラムは困難なものです。
このような状況は現実ではよくあります。そのため、GD B はプログラマーが条件をブレークポイントに付
加できるようにします。例えば、以下のプログラムを見てみましょう。
simp le.c
#include <stdio.h>
main()
{
int i;
for (i = 0;; i++) {
fprintf (stdout, "i = %d\n", i);
}
}
GD B プロンプトで条件付きブレークポイントを設定するには、以下のようにします。
113
開発者ガイド
(gdb) br 8 if i == 8936
Breakpoint 1 at 0x80483f5: file iterations.c, line 8.
(gdb) r
この条件により、プログラムは次の出力を表示して停止します。
i
i
i
i
i
=
=
=
=
=
8931
8932
8933
8934
8935
Breakpoint 1, main () at iterations.c:8
8
fprintf (stdout, "i = %d\n", i);
ブレークポイントの状況を確認するためにブレークポイントの情報を検査します (i nfo br を使用する)。
(gdb) info br
Num
Type
Disp Enb Address
What
1
breakpoint
keep y
0x080483f5 in main at iterations.c:8
stop only if i == 8936
breakpoint already hit 1 time
5.3.4 . フォークされる実行
プログラマーが直面するバグの中でも、1 つのプログラム (親) がそれ自体の独立したコピー (フォーク ) を
作成するケースに関連するバグがとりわけ困難になります。そのフォークは子プロセスを作成し、その結果
失敗してしまいます。親プロセスのデバッグは役に立つ場合とそうでない場合があります。バグに辿り着く
唯一の方法は子プロセスのデバッグである場合がよくありますが、これは常に可能とは限りません。
set fo l l o w-fo rk-mo d e 機能は、この障害を克服するために使用され、プログラマーが親プロセスの
代わりに子プロセスに従うことを可能にします。
set fo l l o w-fo rk-mo d e parent
元のプロセスがフォークの後にデバッグされます。子プロセスは問題なく実行されます。これは
デフォルトです。
set fo l l o w-fo rk-mo d e chi l d
新規プロセスがフォークの後にデバッグされます。親プロセスは問題なく実行されます。
sho w fo l l o w-fo rk-mo d e
フォーク呼び出しに対する現在のデバッガー応答を表示します。
set d etach-o n-fo rk コマンドを使用して、フォーク後に親プロセスと子プロセスの両方をデバッグす
るか、またはそれらの両方に対してデバッガー制御を保持します。
set d etach-o n-fo rk o n
子プロセス (または fo l l o w-fo rk-mo d e の値によっては親プロセス) が切り離され、別個に実
行できるようになります。これはデフォルトです。
set d etach-o n-fo rk o ff
114
⁠第5章 デバッグ
両方のプロセスが GD B の制御下に保持されます。1 つのプロセス (fo l l o w-fo rk-mo d e の値
に応じて子または親のどちらか) のデバッグが、他方が一時停止している間に通常どおり実行され
ます。
sho w d etach-o n-fo rk
d etach-o n-fo rk モードがオンであるか、またはオフであるかどうかを表示します。
以下のプログラムを見てみましょう。
f o rk.c
#include <unistd.h>
int main()
{
pid_t pid;
const char *name;
pid = fork();
if (pid == 0)
{
name = "I am the child";
}
else
{
name = "I am the parent";
}
return 0;
}
このプログラムは、コマンド g cc -g fo rk. c -o fo rk -l pthread でコンパイルされ、GD B で検査
された後に、以下を表示します。
gdb ./fork
[...]
(gdb) break main
Breakpoint 1 at 0x4005dc: file fork.c, line 8.
(gdb) run
[...]
Breakpoint 1, main () at fork.c:8
8
pid = fork();
(gdb) next
Detaching after fork from child process 3840.
9
if (pid == 0)
(gdb) next
15
name = "I am the parent";
(gdb) next
17
return 0;
(gdb) print name
$1 = 0x400717 "I am the parent"
GD B は親プロセスに従い、子プロセス (プロセス 3840) の実行継続を許可します。
以下は、set fo l l o w-fo rk-mo d e chi l d を使用した同じテストです。
115
開発者ガイド
(gdb) set follow-fork-mode child
(gdb) break main
Breakpoint 1 at 0x4005dc: file fork.c, line 8.
(gdb) run
[...]
Breakpoint 1, main () at fork.c:8
8
pid = fork();
(gdb) next
[New process 3875]
[Thread debugging using libthread_db enabled]
[Switching to Thread 0x7ffff7fd5720 (LWP 3875)]
9
if (pid == 0)
(gdb) next
11
name = "I am the child";
(gdb) next
17
return 0;
(gdb) print name
$2 = 0x400708 "I am the child"
(gdb)
GD B は、ここで子プロセスに切り替えました。
この設定を適切な . g d bi ni t に追加すると、永続的な設定にすることができます。
例えば、set fo l l o w-fo rk-mo d e ask が ~ /. g d bi ni t に追加されると、 ask モードがデフォルト
モードになります。
5.3.5. 個別スレッドのデバッグ
GD B には、個別のスレッドをデバッグし、それらを個別に操作および検査する機能があります。この機能
はデフォルトでは有効ではありません。これを実行するには、set no n-sto p o n および set
targ et-async o n を使用します。これらは . g d bi ni t に追加できます。この機能がオンになると、
GD B はスレッドデバッグを実行する準備ができます。
例えば、以下のプログラムは 2 つのスレッドを作成します。これらの 2 つのスレッドとメインを実行する
元のスレッドと合わせると、合計 3 つのスレッドになります。
t h ree- t h read s.c
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
pthread_t thread;
void* thread3 (void* d)
{
int count3 = 0;
while(count3 < 1000){
sleep(10);
printf("Thread 3: %d\n", count3++);
}
return NULL;
}
116
⁠第5章 デバッグ
void* thread2 (void* d)
{
int count2 = 0;
while(count2 < 1000){
printf("Thread 2: %d\n", count2++);
}
return NULL;
}
int main (){
pthread_create (& thread, NULL, thread2, NULL);
pthread_create (& thread, NULL, thread3, NULL);
//Thread 1
int count1 = 0;
while(count1 < 1000){
printf("Thread 1: %d\n", count1++);
}
pthread_join(thread,NULL);
return 0;
}
これを GD B で検査するためにこのプログラムをコンパイルします。
gcc -g three-threads.c -o three-threads
gdb ./three-threads
-lpthread
まず、すべてのスレッド関数 thread1、thread2、およびメインにブレークポイントを設定します。
(gdb) break thread3
Breakpoint 1 at 0x4006c0: file three-threads.c, line 9.
(gdb) break thread2
Breakpoint 2 at 0x40070c: file three-threads.c, line 20.
(gdb) break main
Breakpoint 3 at 0x40074a: file three-threads.c, line 30.
次に、プログラムを実行します。
(gdb) run
[...]
Breakpoint 3, main () at three-threads.c:30
30
pthread_create (& thread, NULL, thread2, NULL);
[...]
(gdb) info threads
* 1 Thread 0x7ffff7fd5720 (LWP 4620) main () at three-threads.c:30
(gdb)
コマンド i nfo thread s がプログラムのスレッド要約と現在の状態についての詳細情報の一部を提供す
ることに注意してください。この場合、作成されているのは 1 つのスレッドのみになります。
117
開発者ガイド
さらに実行を継続します。
(gdb) next
[New Thread 0x7ffff7fd3710 (LWP 4687)]
31
pthread_create (& thread, NULL, thread3, NULL);
(gdb)
Breakpoint 2, thread2 (d=0x0) at three-threads.c:20
20
int count2 = 0;
next
[New Thread 0x7ffff75d2710 (LWP 4688)]
34
int count1 = 0;
(gdb)
Breakpoint 1, thread3 (d=0x0) at three-threads.c:9
9
int count3 = 0;
info threads
3 Thread 0x7ffff75d2710 (LWP 4688) thread3 (d=0x0) at threethreads.c:9
2 Thread 0x7ffff7fd3710 (LWP 4687) thread2 (d=0x0) at threethreads.c:20
* 1 Thread 0x7ffff7fd5720 (LWP 4620) main () at three-threads.c:34
ここで、2 つのスレッドがさらに作成されました。スターマークの付いたスレッドは、現在フォーカスされ
ているスレッドであることを示しています。また、新たに作成されたスレッドの thread2() と thread3()
は、初期化関数でそれらに対して設定されたブレークポイントにヒットしました。
実際のスレッドデバッグを開始するには、thread <thread number> コマンドを使用してフォーカスを
別のスレッドに切り替えます。
(gdb) thread 2
[Switching to thread 2 (Thread 0x7ffff7fd3710 (LWP 4687))]#0
(d=0x0)
at three-threads.c:20
20
int count2 = 0;
(gdb) list
15
return NULL;
16 }
17
18 void* thread2 (void* d)
19 {
20
int count2 = 0;
21
22
while(count2 < 1000){
23
printf("Thread 2: %d\n", count2++);
24
}
Thread 2 は、その関数 thread2() の 20 行目で停止しました。
(gdb) next
22
while(count2 < 1000){
(gdb) print count2
$1 = 0
(gdb) next
23
printf("Thread 2: %d\n", count2++);
(gdb) next
118
thread2
⁠第5章 デバッグ
Thread 2: 0
22
while(count2 < 1000){
(gdb) next
23
printf("Thread 2: %d\n", count2++);
(gdb) print count2
$2 = 1
(gdb) info threads
3 Thread 0x7ffff75d2710 (LWP 4688) thread3 (d=0x0) at threethreads.c:9
* 2 Thread 0x7ffff7fd3710 (LWP 4687) thread2 (d=0x0) at threethreads.c:23
1 Thread 0x7ffff7fd5720 (LWP 4620) main () at three-threads.c:34
(gdb)
上記では、thread2 の数行がカウンターの count2 を出力しており、'info threads' の出力に表示されるよ
うに thread 2 が 23 行目に置かれています。
次は thread3 です。
(gdb) thread 3
[Switching to thread 3 (Thread 0x7ffff75d2710 (LWP 4688))]#0
(d=0x0)
at three-threads.c:9
9
int count3 = 0;
(gdb) list
4
5 pthread_t thread;
6
7 void* thread3 (void* d)
8 {
9
int count3 = 0;
10
11
while(count3 < 1000){
12
sleep(10);
13
printf("Thread 3: %d\n", count3++);
(gdb)
thread3
Thread 3 は、Sleep ステートメントがあり、実行スピードが遅くなるという点で少し異なっています。こ
れは、無視される IO スレッドの表現として考えてください。このスレッドは無視されるため、その実行
は、co nti nue を使用して中断せずに続行されます。
(gdb) continue &
(gdb) Thread 3: 0
Thread 3: 1
Thread 3: 2
Thread 3: 3
co nti nue の末尾にある & に注意してください。これによって、GD B のプロンプトが戻るため、他のコ
マンドを実行することができます。i nterrupt を使用して thread 3 が再び関連性を持つ場合は、実行が停
止される可能性があります。
(gdb) interrupt
[Thread 0x7ffff75d2710 (LWP 4688)] #3 stopped.
0x000000343f4a6a6d in nanosleep () at
../sysdeps/unix/syscall-template.S:82
119
開発者ガイド
82 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
また、元のメインスレッドに戻り、これをさらに検査することも可能です。
(gdb) thread 1
[Switching to thread 1 (Thread 0x7ffff7fd5720 (LWP 4620))]#0 main ()
at three-threads.c:34
34
int count1 = 0;
(gdb) next
36
while(count1 < 1000){
(gdb) next
37
printf("Thread 1: %d\n", count1++);
(gdb) next
Thread 1: 0
36
while(count1 < 1000){
(gdb) next
37
printf("Thread 1: %d\n", count1++);
(gdb) next
Thread 1: 1
36
while(count1 < 1000){
(gdb) next
37
printf("Thread 1: %d\n", count1++);
(gdb) next
Thread 1: 2
36
while(count1 < 1000){
(gdb) print count1
$3 = 3
(gdb) info threads
3 Thread 0x7ffff75d2710 (LWP 4688) 0x000000343f4a6a6d in nanosleep ()
at ../sysdeps/unix/syscall-template.S:82
2 Thread 0x7ffff7fd3710 (LWP 4687) thread2 (d=0x0) at threethreads.c:23
* 1 Thread 0x7ffff7fd5720 (LWP 4620) main () at three-threads.c:36
(gdb)
情報スレッドの出力からも分かるように、他のスレッドはそれらが置かれた場所にあるため、thread 1 の
デバッグの影響は受けません。
5.3.6. GDB の代替ユーザーインターフェース
GD B はデフォルトのインターフェースとしてコマンドラインを使用します。ただし、これには machine
interface (MI) と呼ばれる API もあります。MI を使用すると、ID E 開発者は GD B への他のユーザーイン
ターフェースを作成することができます。
これらのインターフェースのいくつかの例は以下の通りです。
Eclip se ( C D T )
Eclipse 開発環境に統合されたグラフィカルデバッガーインターフェース。さらに詳しい情報
は、『Eclipse web サイト』 にあります。
N emiver
GNOME デスクトップ環境に適したグラフィカルなデバッガーインターフェース。さらに詳しい
情報は、『Nemiver web サイト』にあります。
Emacs
120
⁠第5章 デバッグ
emacs に統合された GD B インターフェース。さらに詳しい情報は、『Emacs web サイト』に
あります。
5.3.7. GDB ドキュメンテーション
GD B についての詳細は、GD B マニュアルを参照してください。
http://sources.redhat.com/gdb/current/onlinedocs/gdb.html
さらに、コマンドの i nfo g d b および man g d b は、gdb のインストール済みバージョンに関する最新
でより詳しい情報を提供しています。
5.4 . Variable T racking at Assignment s
Variable Tracking at Assignments (VTA) は、最適化時の変数追跡を改善するために使用される GCC に組み
込まれた新規のインフラストラクチャーです。これにより、GCC は GD B、SystemTap および他のデバッ
グツール用の詳細で、意味のある役に立つデバッグ情報を生成できます。
GCC が最適化を有効にしてコードをコンパイルする場合、変数の名前が変更されるか、変数が移動する
か、またはすべて一緒に削除されます。そのため、最適化されたコンパイルにより、デバッガーは一部の変
数が <optimized out> されていることを報告します。 VTA を有効にすると、最適化されたコードには内部
で注釈が付けられ、変数が移動されているか、または削除されるかどうかにかかわらず、それぞれの変数の
値を透過的に追跡するために最適化が渡されることを確認できます。この結果、最適化された (g cc -O 2
-g でビルドされた) コードの場合でもより多くのパラメーターと変数値を利用できるようになります。さら
に、表示される <optimized out> メッセージがより少なくなります。
VTA の利点は、アプリケーションをインライン関数でデバッグする場合にさらに明らかになります。VTA
を使用しないと、最適化によりインライン関数の一部の引数が完全に削除され、デバッガーがその値を検査
できなくなる可能性があります。VTA を使用すると最適化が実行され、さらに欠落した引数についての適切
なデバッグ情報が生成されます。
VTA は、コードを最適化でコンパイルし、デバッグ情報を有効にする (つまり、g cc -O -g またはより一
般的には g cc -O 2 -g ) 場合にデフォルトで有効になります。このビルド時に VTA を無効にするには、fno -var-tracki ng -assi g nments を追加します。さらに、VTA インフラストラクチャーには、新規
の g cc オプション -fco mpare-d ebug が含まれます。このオプションは、デバッグ情報を使った場合と
デバッグ情報を使わなかった場合の GCC でコンパイルされたコードをテストします。テストはこれら 2 つ
のバイナリが同一である場合にパスします。このテストにより、実行可能コードがいずれのデバッグオプ
ションによっても影響されず、かつデバッグコードには隠されたバグがないことを確認できます。fco mpare-d ebug はコンパイル時に多くのコストを追加することに注意してください。このオプション
についての詳細は、man g cc を参照してください。
VTA のインフラストラクチャーおよび開発についての詳細は、以下のリンクから閲覧可能な 『A Plan to
Fix Local Variable D ebug Information in GCC』 を参照してください。
http://gcc.gnu.org/wiki/Var_Tracking_Assignments
このホワイトペーパーのスライド資料のバージョン
は、http://people.redhat.com/aoliva/papers/vta/slides.pdf にあります。
5.5. Pyt hon Pret t y-Print er
GD B コマンド pri nt は、ターゲットアプリケーションのついての総合的なデバッグ情報を出力します。
GD B は、可能な限り多くのデバッグデータをユーザーに提供することを目的としています。ただし、非常
に複雑なプログラムの場合には、データ量は非常に把握しにくくなる可能性があります。
121
開発者ガイド
また、GD B は GD B pri nt 出力の解読に役立つツールを提供しません。GD B は、プログラムデータの解
読に役立つツールを簡単に作成する権限をユーザーに与えません。そのため、デバッグデータを読み取り、
把握する方法が、とりわけ大規模で複雑なプロジェクトの場合にかなり難しくなります。
ほとんどの開発者にとって、GD B pri nt 出力をカスタマイズし、(これにより意味をもたせる) 唯一の方法
は、GD B を変更し、再コンパイルする方法です。ただし、これを実際に行える開発者はほとんどいませ
ん。さらにこの方法には拡張性がなく、開発者が異種のプログラムで、同じ様に複雑なデバッグデータを含
む複数プログラムもデバッグする必要がある場合には特に対応が難しくなります。
これに対処するため、Red Hat Enterprise Linux バージョンの GD B は Python pretty-printer との互換性を
持つようになりました。これにより、イントロスペクション、出力、およびフォーマットロジックを サー
ドパーティ の Python スクリプトに残すことにより、より意味を持つデバッグデータの取得が可能になり
ます。
Python pretty-printer との互換性により、GD B 出力のカスタマイズを目的に適合するものにできます。こ
れにより、GD B 出力を必要に応じて変化させる柔軟性とその容易性が大幅に向上するため、GD B はより幅
広いプロジェクトに対するより実行可能なデバッグソリューションになります。また、プロジェクトや特
定のプログラミング言語に精通した開発者こそが意味を持つ出力の種類を決定する上で最適であり、その有
用性を高めることができます。
Python pretty-printer の実装により、ユーザーは仕様に従ってプログラムデータの検査、フォーマット、お
よび出力を自動的に実行できます。これらの仕様は Python スクリプトによって実装されるルールとして作
成されます。これには以下のメリットがあります。
安全性
プログラムデータを登録済みの一連の Python pretty-printer に渡すために、GD B 開発チームは GBD 印刷
コードに フック を追加しました。これらのフックは、安全性に注意を払って実装されました。組み込まれた
GBD 印刷コードは依然として元のままの状態で、デフォルトのフォールバック印刷ロジックとして機能で
きます。そのため、専門のプリンターが使用できない場合でも、GD B はこれまでと同様の方法でデバッグ
データを出力します。これにより、GD B に後方互換性を持たせ、pretty-printer を必要としないユーザーが
GD B を引き続き使用することができます。
高いカスタマイズ性
この新規の「Python スクリプト作成」アプローチにより、ユーザーは必要に応じた量の知識を特定のプリ
ンターに抽出することができます。そのため、プロジェクトには、ユーザー要件に特化した特定の方法でプ
ログラムデータを解析するプリンタースクリプトのライブラリ全体を組み込むことができます。ユーザーが
特定プロジェクト用にビルドできるプリンター数には制限がありません。さらに、スクリプトによってデ
バッグデータのスクリプトがカスタマイズできることで、ユーザーによるプリンタースクリプト — または
それらのライブラリー全体の再利用と目的の再設定がより容易になります。
習得が容易
このアプローチの最もすぐれている点は、初めてでも実行しやすいことです。Python スクリプト作成は学
習が比較的に容易で、オンラインで利用できる無料のドキュメンテーションが多数あります。さらに、大半
のプログラマーは Python スクリプト作成や一般的なスクリプト作成における基本から中級レベルの経験を
すでに有しています。
以下は、pretty printer の小さな例です。以下の C++ プログラムを見てみましょう。
f ru it .cc
enum Fruits {Orange, Apple, Banana};
class Fruit
{
122
⁠第5章 デバッグ
int fruit;
public:
Fruit (int f)
{
fruit = f;
}
};
int main()
{
Fruit myFruit(Apple);
return 0;
// line 17
}
これは、コマンド g + + -g frui t. cc -o frui t でコンパイルされています。これから、GD B を使っ
てこのプログラムを検査します。
gdb ./fruit
[...]
(gdb) break 17
Breakpoint 1 at 0x40056d: file fruit.cc, line 17.
(gdb) run
Breakpoint 1, main () at fruit.cc:17
17
return 0;
// line 17
(gdb) print myFruit
$1 = {fruit = 1}
{frui t = 1} の出力は、これがデータ構造 'Fruit' 内の 'fruit' の内部表現であるために正確なものです。
ただし、ここでは整数 1 がどの fruit を表すかを判別することが難しいため、人間による読み取りは容易で
はありません。
この問題を解決するために、以下の pretty printer を作成します。
fruit.py
class FruitPrinter:
def __init__(self, val):
self.val = val
def to_string (self):
fruit = self.val['fruit']
if (fruit == 0):
name = "Orange"
elif (fruit == 1):
name = "Apple"
elif (fruit == 2):
name = "Banana"
else:
name = "unknown"
return "Our fruit is " + name
def lookup_type (val):
if str(val.type) == 'Fruit':
123
開発者ガイド
return FruitPrinter(val)
return None
gdb.pretty_printers.append (lookup_type)
ボトムアップの視点でこのプリンターを検査します。
g d b. pretty_pri nters. append (l o o kup_type) 行は、関数 l o o kup_type を、printer lookup
関数の GD B のリストに追加します。
関数 l o o kup_type は、出力するオブジェクトのタイプを検査し、適切な pretty printer を返します。オ
ブジェクトは、パラメーター val で GD B によって渡されます。 val . type は pretty printer のタイプを
表す属性です。
Frui tP ri nter は、実際の作業が行われる場所です。さらに具体的には、その場所はそのクラスの
to _stri ng 関数になります。この関数では、整数 frui t は、python ディクショナリ構文
sel f. val [' frui t' ] を使って取得されます。次に、名前がその値を使って決定されます。この関数に
よって戻される文字列は、ユーザーに出力される文字列になります。
frui t. py の作成後、これは次のコマンドを使って GD B にロードされる必要があります。
(g d b) pytho n execfi l e("frui t. py")
『GD B および Python Pretty-Printer』 ホワイトペーパーは、この機能についてのより詳しい情報を提供し
ます。この白書には、独自の Python pretty-printer の作成方法や、これを GD B にインポートする方法につ
いての詳細情報といくつかの例も記載されています。詳細は以下のリンクを参照してください。
http://sourceware.org/gdb/onlinedocs/gdb/Pretty-Printing.html
5.6. Eclipse による C/C++ アプリケーションのデバッグ
Eclipse C/C++ 開発ツールには GNU D ebugger (GD B) との優れた統合性があります。これらの Eclipse プ
ラグインは、GD B で利用できる最新機能を利用します。
アプリケーションのデバッグセッション開始は、コンテキストメニューの D eb u g As ( 次をデバッグ) →
C /C + + Ap p licat io n ( C /C + + アプリケーション) から、または R u n ( 実行) メニューの使用のいずれで
アプリケーションを起動する作業に似ています。コンテキストメニューは以下の 3 つの方法のいずれかに
よってアクセスできます。
エディター内のカーソルを使って右マウスボタンをクリック
アプリケーションバイナリから
関連するバイナリが含まれるプロジェクトから
複数のバイナリを起動できる場合、どちらかを選択できるようにダイアログが表示されます。
セッションが開始されると、デバッグに関連する以下のビューのコレクションが含まれるデバッグパース
ペクティブに切り替えるためのプロンプトが表示されます。
コントロールビュー
コントロールビューはデバッグビューとして知られており、これには、コード選択のステップ
オーバーとステップインを行うためのボタンが含まれます。また、ここからスレッドプロセスを
一時停止できます。
ソースコードエディタービュー
124
⁠第5章 デバッグ
ソースコードエディタービューは、どのソースコード行が実行内のデバッガーの位置に対応する
かを示します。デバッグビューツールバー内の Instructi o n Steppi ng Mo d e (命令のス
テップ実行モード ) ボタンを押すことにより、ソースコード行ではなくアセンブリ命令によって
アプリケーションの実行を制御することができます。
コンソールビュー
コンソールビューは、利用可能な入力および出力を表示します。
最後に、変数データおよび他の情報は、デバッグパースペクティブの対応するビューで確認できます。
詳細は、ヘルプコンテンツの 『C/C++ D evelopment User Guide』 の C o n cep t s → D eb u g 、G et t in g
St art ed → D eb u g g in g Pro ject s および T asks → R u n n in g an d D eb u g g in g Pro ject s セクショ
ンを参照してください。
125
開発者ガイド
第6章 プロファイル
開発者は、パフォーマンスに最も大きな影響を与えるプログラムの部分に注目するためにプログラムのプロ
ファイルを作成します。収集されるデータのタイプには、プロセッサーの時間を最も多く消費するプログラ
ムのセクションや、メモリが割り振られる場所などがあります。プロファイルでは、実際のプログラム実行
からデータを収集します。そのため、収集されるデータの質は、プログラムが実施する実際のタスクに影響
されます。プロファイル時に実施されるタスクは、実際の使用を表すものでなければなりません。これによ
り、プログラムの実際の使用に起因する問題への対応を開発時に確実に行うことができるようになります。
Red Hat Enterprise Linux には、プロファイルデータを収集するための数多くの異なるツール
(Valg rin d 、O Pro f ile、perf、および Syst emT ap ) が含まれます。それぞれのツールは、以下のセク
ションで説明されているように特定タイプのプロファイルの実行に適しています。
6.1. Valgrind
Valg rin d は、アプリケーションの詳細なプロファイルを作成するために使用する動的な分析ツールを構築
するための計測フレームワークです。Valg rin d ツールは、通常多くのメモリー管理およびスレッド化の問
題を自動検出するために使用されます。また、Valg rin d スイートには、新規のプロファイルツールを随時
作成できるツールも含まれます。
Valg rin d は、初期化されていないメモリーの使用、メモリーの不適切な割り振り/解放、およびシステム呼
び出しの不適切な引数などのエラーをチェックするためのユーザースペースバイナリの計測を提供します。
そのプロファイルツールは、標準的なユーザーがほとんどのバイナリに対して使用できますが、他のプロ
ファイラーと比較すると、Valg rin d プロファイルの実行速度は大幅に遅くなります。バイナリのプロファ
イルを作成するために、Valg rin d はその実行可能ファイルを再作成し、再作成されたバイナリを計測しま
す。Valg rin d のツールは、ユーザースペースプログラムにおけるメモリ関連の問題を見つける際に最も役
立ちます。ただし、これはある時間に特定の問題や、カーネルスペースの計測/デバッグには適していませ
ん。
これまで、 Valg rin d は IBM System z アーキテクチャーをサポートしていませんでした。しかし、6.1 の
時点でこのサポートが追加されました。つまり、Valg rin d は、Red Hat Enterprise Linux 6.x でサポート
されるすべてのハードウェアアーキテクチャーをサポートするようになりました。
6.1.1. Valgrind ツール
Valg rin d スイートは以下のツールで構成されています。
memch eck
このツールは、メモリーからの読み取りおよびメモリーへの書き込みのすべてをチェック
し、mal l o c、new、free、および d el ete へのすべてのシステム呼び出しをインターセプト
することにより、プログラム内のメモリー管理の問題を検出します。他の手段を使ってメモリー
管理の問題を検出することは困難であるため、memch eck は最もよく使用される Valg rin d
ツールと言えるかもしれません。このような問題は長期にわたって検出されないままになること
が多く、最終的には診断しにくいクラッシュを生じさせます。
cach eg rin d
cach eg rin d は、CPU 内の I1、D 1 および L2 キャッシュの詳細なシミュレーションを実行す
ることにより、コード内のキャッシュミスの原因を正確に指摘するキャッシュプロファイラーで
す。これは、キャッシュミス数、メモリ参照、およびソースコードの各行になる命令を示しま
す。また、cach eg rin d は関数別、モジュール別、およびプログラム全体の要約を提供し、個々
のマシン命令のカウントを表示することもできます。
callg rin d
126
⁠第6 章 プロファイル
cacheg ri nd のように、cal l g ri nd はキャッシュ動作をモデリングできます。ただ
し、cal l g ri nd の主な目的は、実行済みコードについての callgraphs データを記録すること
にあります。
massif
massif はヒーププロファイラーです。これは、プログラムが使用するヒープメモリーの量を測
定し、ヒープブロック、ヒープ管理オーバーヘッド、およびスタックサイズについての情報を提
供します。ヒーププロファイラーは、ヒープメモリーの使用量を減らす方法を探す際に役立ちま
す。仮想メモリを使用するシステムでは、最適なヒープメモリー使用量が設定されたプログラム
がメモリー不足になる可能性は少なく、必要なページングが少ない分、スピードが速くなること
があります。
h elg rin d
POSIX pthreads スレッド化プレミティブを使用するプログラムでは、 h elg rin d は同期エラー
を検出します。このようなエラーには以下が含まれます。
POSIX pthreads API の誤用
ロックの順序付けの問題から生じる潜在的なデッドロック
データレース (ロックが適切でない状態でのメモリーへのアクセス)
Valg rin d により、独自のプロファイルツールを開発することもできます。これに関連して、
Valg rin d に
は、独自のツールを生成するためのテンプレートとして使用できるサンプルの l ackey ツールが含まれま
す。
6.1.2. Valgrind の使用
val g ri nd パッケージとその依存関係は、Valg rin d プロファイル実行を実施するために必要なすべての
ツールをインストールします。Valg rin d を使ってプログラムのプロファイルを作成するには、以下を使用
します。
val g ri nd --to o l = toolname program
toolname の引数のリストについては、「Valgrind ツール」 を参照してください。Valg rin d ツールの
スィートに加えて、no ne も toolname の有効な引数です。この引数を使用することにより、プロファイ
ルを実行せずにプログラムを Valg rin d の下で実行できます。これは、Valg rin d 自体のデバッグまたはベ
ンチマークの際に役立ちます。
さらに、Valg rin d に対し、その情報のすべてを特定ファイルに送信するように指示することもできます。
これを実行するには、オプションの --l o g -fi l e= filename を使用します。例えば、実行可能ファイ
ルの hel l o のメモリー使用量をチェックしたり、プロファイル情報を o utput に送信するには、以下を
使用します。
val g ri nd --to o l = memcheck --l o g -fi l e= o utput hel l o
詳細は、Valg rin d スイートのツールに関する他の利用できるドキュメンテーションと共に、「Valgrind
のドキュメンテーション」 を参照してください。
6.1.3. Eclipse 用の Valgrind プラグイン
Eclipse 用の Valg rin d プラグインは、複数の Valg rin d ツールを Eclipse に統合します。これにより、
Eclipse ユーザーは、各種のプロファイル機能をそれぞれのワークフローにシームレスに組み込むことがで
きます。現在、Eclipse 用の Valg rin d プラグインは、以下の 3 つの Valg rin d ツールをサポートしていま
す。
127
開発者ガイド
Memch eck
Massif
C ach eg rin d
Valg rin d プロファイル実行を起動するには、R u n > Pro f ile に移動します。これにより、Pro f ile As ダ
イアログが開かれ、ここからプロファイル実行用のツールを選択できます。
図6 .1 Pro f ile As
プロファイル実行用に各ツールを設定するには、R u n > Pro f ile C o n f ig u rat io n に移動します。これに
より、Pro f ile C o n f ig u rat io n メニューが開かれます。
128
⁠第6 章 プロファイル
図6 .2 Pro f ile C o n f ig u rat io n
Eclipse 用の Valg rin d プラグインは、ecl i pse-val g ri nd パッケージで提供されます。このプラグイ
ンについての詳細は、Eclipse H elp C o n t en t sの 『Valgrind Integration User Guide』 を参照してくだ
さい。
6.1.4 . Valgrind のドキュメンテーション
Valg rin d についての詳細は、man val g ri nd を参照してください。また Red Hat Enterprise Linux 6
は、PD F および HTML 形式で利用可能な総合的な 『Valgrind D ocumentation』 を提供していますが、こ
れらは以下にあります。
fi l e: ///usr/share/d o c/val g ri nd -version/val g ri nd _manual . pd f
fi l e: ///usr/share/d o c/val g ri nd -version/html /i nd ex. html
Eclipse H elp C o n t en t s にある 『Valgrind Integration User Guide』 も、Eclipse 用の Valg rin d プラ
グインのセットアップと使用についての詳細情報を提供しています。このガイドは、ecl i pseval g ri nd パッケージで提供されています。
6.2. OProfile
OProfile はシステム全体にわたる Linux プロファイラーで、低いオーバーヘッドでの稼働が可能です。こ
れは、raw サンプルデータ収集のためのカーネルドライバーとデーモン、さらにそのデータを有意な情報に
解析するためのツールのスイートで構成されています。OProfile は通常、コードのどのセクションが CPU
時間を最も多く消費しているか、またその理由を判断するために開発者が使用します。
プロファイルの実行中に OProfile はプロセッサーのパフォーマンス監視ハードウェアを使用しま
129
開発者ガイド
す。Valg rin d はアプリケーションのバイナリを書き直し、次にインストルメント化します。一方 OProfile
は、実行中のアプリケーションをそのままプロファイルします。パフォーマンス監視ハードウェアをセッ
トアップし、イベント x 回ごとにサンプルを採取します (例えば、キャッシュミスやブランチ指示など)。
各サンプルには、プログラムのどこでそれが発生したかという情報が含まれています。
OProfile のプロファイル方法は Valg rin d よりも少ないリソースを消費します。しかし、OProfile は root
権限を必要とします。OProfile はコード内での「ホットスポット」を見つけ出し、その原因を探す際に便
利です (例えば、キャッシュパフォーマンスが低い、分岐予想が誤っている、など)。
OProfile を使用する際には、OProfile デーモン (o pro fi l ed ) を開始し、プロファイル対象のプログラム
を実行し、システムプロファイルデータを収集し、このデータをより理解しやすい形式に解析することにな
ります。OProfile はこのプロセスのすべてのステップにツールを提供します。
6.2.1. OProfile のツール
便利な OProfile コマンドを以下に挙げます。
o p erf
Red Hat Enterprise Linux 7 では初めてとなる o perf は、Linux Performance Events サブシス
テムを使用するので、o pco ntro l デーモンを完全に置き換えられます。詳細は、『Red Hat
Enterprise Linux 7 System Administrator's Guide』 を参照してください。
o p co n t ro l
このツールは OProfile デーモンを開始/終了し、プロファイルセッションの設定に使われます。
o p rep o rt
o prepo rt コマンドは、OProfile プロファイルセッションからバイナリイメージのサマリーまた
は記号ごとのデータを出力します。
o p an n o t at e
o panno tate は OProfile セッションのプロファイルデータから注釈付きソースおよび/またはア
センブリを出力します。
o p arch ive
o parchi ve コマンドは、実行可能ファイルやデバッグ、OProfile サンプルファイルの入った
ディレクトリを作成します。このディレクトリは (tar で) 別のマシンに移動でき、そこでオフラ
インで分析ができます。
o p g p ro f
o prepo rt のように、o pg pro f コマンドは OProfile セッションからあるバイナリイメージの
プロファイルデータを出力します。o pg pro f の出力は、g pro f 形式です。
OProfile コマンドの全一覧は、man o pro fi l e を参照してください。各 OProfile コマンドの詳細情報に
ついては、それぞれの man ページを参照してください。OProfile に関するその他のドキュメンテーション
は、「OProfile のドキュメンテーション」 を参照してください。
6.2.2. OProfile の使用
o pro fi l e パッケージおよびその依存関係は、OProfile 実行に必要なすべてのユーティリティをインス
トールします。OProfile にシステム上で実行中の全アプリケーションのプロファイルを行い、ライブラリ
を使用しているアプリケーションで共有ライブラリのサンプルをグループ化するように指示するには、以下
のコマンドを実行します。
130
⁠第6 章 プロファイル
# o pco ntro l --no -vml i nux --separate= l i brary --start
OProfile デーモンはシステムデータを収集せずに開始することもできます。これには、オプション -start-d aemo n を使用します。--sto p オプションはデータ収集を中止し、--shutd o wn は OProfile
デーモンを終了します。
収集されたプロファイルデータを表示するには、o prepo rt か o panno tate、o pg pro f を使用します。
デフォルトでは、OProfile デーモンが収集したデータは /var/l i b/o pro fi l e/sampl es/ に保存され
ます。
O Pro f ile と Perf o rman ce C o u n t ers f o r Lin u x ( PC L) ツールとの競合
OProfile と Performance Counters for Linux (PCL) は同じハードウェアの Performance Monitoring Unit
(PMU) を使用します。PCL もしくは NMI ウォッチドッグタイマーがハードウェア PMU を使用している場
合、OProfile 開始時に以下のようなメッセージが表示されます。
# opcontrol --start
Using default event: CPU_CLK_UNHALTED:100000:0:1:1
Error: counter 0 not available nmi_watchdog using this resource ? Try:
opcontrol --deinit
echo 0 > /proc/sys/kernel/nmi_watchdog
システム上で稼働しているすべての perf コマンドを停止し、NMI ウォッチドッグをオフにして以下のコマ
ンドで OProfile カーネルドライバーをリロードします。
# o pco ntro l --d ei ni t
# echo 0 > /pro c/sys/kernel /nmi _watchd o g
6.2.3. Red Hat Ent erprise Linux 7 での OProfile
Red Hat Enterprise Linux 7 用には、OProfile 0.9.8 がリリースされています。これはアルファバージョン
ですが、多くのユーザーが安定性を確認しています。OProfile 0.9.8 リリースでは、特定の個別プロセスの
プロファイリングにも使用できるようになっています。
6 .2 .3.1 . 新しい機能
新たなo perf プログラムが利用可能となっており、これは root 以外のユーザーによる単一プロセスのプロ
ファイリングを可能にします。これを使ってシステム全体のプロファイリングもできますが、その場合は
root 権限が必要になります。この機能は、kernel バージョン 2.6.31 またはそれ以降が必要になります。
OProfile は、以下の多くの新プロセッサーもサポートします。
Tilera tile64
Tilera tilepro
Tilera tile-gx
IBM System z10
IBM System z196
Intel Ivy Bridge
ARMv7 Cortex-A5
131
開発者ガイド
ARMv7 Cortex-A15
ARMv7 Cortex-A7
6 .2 .3.2 . 以前のリリースとの非互換性
OProfile 0.9.8 は、以前のリリースといくつかの非互換性があります。
2.6 kernel より前のサポートがなくなりました。
2.6 より前のサポートがなくなったことで、--wi th-kernel -suppo rt 設定オプションが不要および
無効になっています。
サンプルヘッダー mtime フィールドが u64 に変更されました。
co nfi g ure. i n ファイルが co nfi g ure. ac に名前変更されています。これは透過的変更です。
6 .2 .3.3. 既知の問題と制限
OProfile 0.9.8 には以下のような既知の問題と制限があります。
AMD Instruction Based Sampling (IBS) は現在、新 operf プログラムに対応していません。IBS プロ
ファイリングには l eg acy opcontrol プロファイリングを使用してください。
o perf を使って複数イベントをプロファイリングする際は、記録されるイベントの絶対数は通常予測さ
れるものより大幅に少なくなります。これは、Linux kernel の Performance Events Subsystem のバグ
が原因で、このバグは Linux kernel バージョンの 3.1 と 3.5 の間で修正されました。.
NMI ウォッチドッグが x86_64 システムで無効になっていないと、o pco ntro l は必要なハードウェア
パフォーマンスカウンターの割り当てに失敗する可能性があります。この問題の進行状況
は、https://bugzilla.redhat.com/show_bug.cgi?id=683176 で確認できます。
多くのアルファ ev67 イベントが機能しません。この問題の進行状況は
https://bugzilla.redhat.com/show_bug.cgi?id=931875 で確認できます。
6.2.4 . OProfile のドキュメンテーション
OProfile に関する詳細情報は、man o pro fi l e を参照してください。Red Hat Enterprise Linux は
fi l e: ///usr/share/d o c/o pro fi l e-version/ でも OProfile の 2 種類の総合ガイドを提供してい
ます。
O Pro f ile Man u al
OProfile の設定および使用方法に関する詳細な指示が記載されている総合マニュアル
で、fi l e: ///usr/share/d o c/o pro fi l e-version/o pro fi l e. html にあります。
O Pro f ile In t ern als
OProfile の構成に関するドキュメンテーションで、OProfile アップストリームへの投稿に興味の
あるプログラマーに有用なもので
す。fi l e: ///usr/share/d o c/o pro fi l e-version/i nternal s. html にあります。
Eclipse の ヘルプコンテンツ にある『OProfile Integration User Guide』 も Eclipse 用 OProfile プラグイ
ンの設定および使用方法に関する詳細情報を提供しています。このガイドは ecl i pse-o pro fi l e パッ
ケージで提供されています。
6.3. Syst emT ap
132
⁠第6 章 プロファイル
SystemTap は、Linux システム上で実行中のプロセスおよびカーネルアクティビティをプローブするため
の有用なインストルメンテーションプラットフォームです。プローブを実行するには、以下の手順にしたが
います。
1. どのシステムイベント (例えば、仮想ファイルシステムの読み込み、パケット送信) が特定のアク
ション (例えば、印刷、解析、またはデータ操作) を開始するかを指定する SystemTap スクリプト
を書き込みます。
2. SystemTap がスクリプトを C プログラミングに翻訳し、さらにカーネルモジュールにコンパイル
します。
3. SystemTap がこのカーネルモジュールを読み込んで、実際のプローブを実行します。
SystemTap スクリプトは、通常のシステム運用に最小限の割り込みでシステム運用を監視しシステム問題
を診断する際に便利なものです。インストルメント化されたコードを再コンパイルしたり再インストールす
ることなく、実行中のシステムテスト仮説をすばやくインストルメント化できます。kern el- sp ace をプ
ローブする SystemTap スクリプトをコンパイルするために、SystemTap は以下の 3 つの異なる カーネル
情報パッケージ からの情報を使用します。
kernel -variant-d evel -version
kernel -variant-d ebug i nfo -version
kernel -d ebug i nfo -co mmo n-arch-version
これらのカーネル情報パッケージは、プローブ対象のカーネルと一致する必要があります。さらに、複数の
カーネル用に SystemTap スクリプトをコンパイルするには、各カーネルのカーネル情報パッケージがイン
ストールされている必要もあります。
Red Hat Enterprise Linux 6.1 からは、--remo te オプションという重要な新機能が追加されました。これ
により、ユーザーは SystemTap モジュールをローカルでビルドし、SSH 経由でリモートでの実行が可能
になります。これを使用する際の構文は、--remo te [USER @ ]HO ST NAME となります。実行ターゲット
を特定の SSH ホストに設定し、オプションで異なるユーザー名を使用します。複数の実行ターゲットを対
象とするために、このオプションは繰り返すことができます。パス 1-4 はスクリプトを通常通りビルドする
ようにローカルで完了し、パス 5 がモジュールをターゲットにコピーして実行します。
6.3.1. Syst emT ap 2.0 での DynInst
SystemTap 2.0 では、DynInst システムを使用したインストルメンテーション実行の実験段階のサポートが
導入されています。D ynInst は純粋なユーザー領域バイナリ操作ライブラリーで、プログラムが他の実行中
のプログラムを修正できるようになります。高度に効率的なインストルメンテーションまたは他の修正を挿
入することで、これを行います。SystemTap 2.0 またはそれ以降では、これをバックエンドとして使用
し、スクリプトの制限付きクラスを実行できます。制限を付けることで、インストルメンテーションが速く
なり、root アクセスや kernel モジュール操作なしにユーザー領域全体で実行されます。制限は変化してい
ますが、暗号作成や kernel モジュール、特殊グループのメンバーシップに依存する権限なしのユーザープ
ローブのものよりも厳密なものです。
この実験的なバックエンドを使用するには、--runti me オプションを stap コマンドラインに追加します
$ stap --runtime=stapdyn script.stp -c command
スクリプトが D ynInst で利用可能な機能以上のものを必要とする場合、SystemTap はアドバイスします。
その場合、標準の kernel モジュールベースのバックエンドは、--runti me オプションを省略して使用す
る必要があります。
6.3.2. Syst emT ap コンパイルサーバー
133
開発者ガイド
Red Hat Enterprise Linux 7 の SystemTap は、 コンパイルサーバーとクライアントの導入をサポートしま
す。この設定では、ネットワークの すべての クライアントシステムのカーネル情報パッケージが 1 つ (も
しくは 2、3) のコンパイルサーバーホストにインストールされます。クライアントシステムが SystemTap
スクリプトからカーネルモジュールをコンパイルしようとすると、集中化されたコンパイルサーバーホスト
から必要となるカーネル情報にリモートでアクセスします。
正常に設定/保守されている SystemTap コンパイルサーバーホストは、以下の利点をもたらします。
システム管理者は、パッケージをユーザーに利用可能とする前にカーネル情報パッケージの整合性を検
証できます。
コンパイルサーバーの ID が Secure Socket Layer (SSL) を使って認証できます。SSL は、送信中の盗
聴や改ざんを防ぐ暗号化されたネットワーク接続を提供します。
個別のユーザーが独自のサーバーを運用し、それらを信頼できるサーバーとして権限を与えることがで
きます。
システム管理者が、ネットワーク上の 1 つ以上のサーバーを全ユーザーの使用において信頼できるサー
バーとして権限を付与できます。
明示的に権限が付与されていないサーバーは無視され、サーバーの偽装や同様の攻撃を防ぎます。
6.3.3. 特権のないユーザーに対する Syst emT ap のサポート
セキュリティのために、エンタープライズ環境でユーザーが自身のマシンへの特権アクセス (つまり、root
や sud o ) を与えられることは滅多にありません。さらに、SystemTap の完全な機能があるとシステムを完
全にコントロールできるため、これも特権のあるユーザーに制限されています。
Red Hat Enterprise Linux 7 の SystemTap には、SystemTap クライアントに --unpri vi l eg ed という
新オプションがあります。このオプションを使うと、特権のないユーザーが stap を実行できるようになり
ます。もちろん、stap を実行しようとする特権のないユーザーにはいくつかの制限が課せられます。
注記
特権のないユーザーとは、stapusr グループのメンバーですが stapd ev グループのメンバーでは
ありません (また、root でもありません)。
特権のないユーザーが作成したカーネルモジュールを読み込む前に、SystemTap が標準のデジタル (暗号
法) 署名技術を使ってモジュールの整合性を検証します。--unpri vi l eg ed オプションを使用する際は
毎回、サーバーは特権のないユーザーに対して課せられら制限についてスクリプトをチェックします。
チェックが成功した場合は、サーバーはスクリプトをコンパイルして自己生成した証明書を使って作成され
たモジュールに署名します。クライアントがモジュールを読み込もうとする際には、root が保守/権限を付
与している信頼できる署名証明書のデータベースに対してモジュールの署名をチェックすること
で、staprun が最初にモジュールの署名を検証します。
署名されたカーネルモジュールが正常に検証されると、staprun は以下の点が保証されます。
モジュールが信頼できる systemtap サーバー実装を使用して作成された。
モジュールが --unpri vi l eg ed オプションを使用してコンパイルされた。
モジュールが、特権のないユーザーによる使用で必要とされる制限を満たしている。
モジュールは作成以降、改ざんされていない。
6.3.4 . SSL および認証管理
134
⁠第6 章 プロファイル
Red Hat Enterprise Linux 7 の SystemTap は、証明書および公開/プライベートキーのペアで認証およびセ
キュリティーを実装します。コンパイルサーバーの認証情報 (つまり証明書) を信頼できるサーバーのデー
タベースに追加するのはシステム管理者の責任です。SystemTap はこのデータベースを使って、クライア
ントがアクセスしようとするコンパイルサーバーの ID を確認します。同様に、SystemTap はこの方法
で、--unpri vi l eg ed オプションを使ってコンパイルサーバーが作成したカーネルモジュールの確認も
行います。
6 .3.4 .1 . コンパイルサーバー接続の承認
コンパイルサーバーはサーバーホスト上での初回開始時に、自動的に証明書を生成します。この証明書は、
SSL 認証およびモジュール署名中にコンパイルサーバーの ID を検証します。
クライアントがコンパイルサーバーにアクセスするには (同一サーバーホスト上でもクライアントマシンか
らでも)、システム管理者はコンパイルサーバーの証明書を信頼できるサーバーのデータベースに追加する
必要があります。コンパイルサーバーの使用を意図する各クライアントホストは、そのようなデータベース
を維持しています。これにより個別のユーザーは、信頼できるサーバーのデータベースをカスタマイズでき
ます。これには、ユーザー自身の使用のみに承認されているコンパイルサーバーの一覧を含めることができ
ます。
6 .3.4 .2 . コンパイルサーバーのモジュール署名の承認 (特権のないユーザー)
特権のないユーザーができるのは、署名済み、承認済みの SystemTap カーネルモジュールの読み込みのみ
です。モジュールがそのように認識されるには、証明書が信頼できる署名者のデータベースに表示されるコ
ンパイルサーバーが作成したものでなくてはなりません。このデータベースは、モジュールの読み込み先と
なる各ホストで維持される必要があります。
6 .3.4 .3. 自動承認
stap-server initscript を使用して開始したサーバーは、同一ホスト上のすべてのクライアントからの接
続を受け付けるよう自動的に承認されます。
他の方法で開始されたサーバーは、サーバーを開始したユーザーが稼働する同一ホスト上のクライアントか
らの接続を受け付けるよう自動的に承認されます。これは便利さを考慮して実装されています。クライアン
トとサーバーが同一ホスト上で稼働していれば、ユーザーは自分で開始したサーバーに接続するよう自動的
に承認されます。
root がコンパイルサーバーを開始する時は常に、同一ホスト上で稼働している すべての クライアントが
サーバーを承認済みと認識します。しかし、Red Hat はこれを推奨しません。
同様に、stap-server で開始したコンパイルサーバーは、稼働するホスト上で信頼できる署名者として自
動的に承認されます。コンパイルサーバーが他の方法で開始された場合は、このように自動的には承認され
ません。
6.3.5. Syst emT ap のドキュメンテーション
SystemTap についての詳細情報は (Red Hat が提供する) 以下のブックを参照してください。
『SystemTap Beginner's Guide』
『SystemTap Tapset Reference』
『SystemTap Beginner's Guide』 および 『SystemTap Tapset Reference』 は、systemtap パッケー
ジをインストールするとローカルでも見ることができます。
fi l e: ///usr/share/d o c/systemtap-version/SystemT ap_Beg i nners_G ui d e/i nd ex.
html
135
開発者ガイド
fi l e: ///usr/share/d o c/systemtap-version/SystemT ap_Beg i nners_G ui d e. pd f
fi l e: ///usr/share/d o c/systemtap-version/tapsets/i nd ex. html
fi l e: ///usr/share/d o c/systemtap-version/tapsets. pd f
「SystemTap コンパイルサーバー」、「特権のないユーザーに対する SystemTap のサポート」、「 SSL
および認証管理」 はすべて、『SystemTap Support for Unprivileged Users and Server Client
D eployment』 白書からの抜粋です。この白書には各機能の詳細情報のほか、実働環境での適用を説明する
ケーススタディも含まれています。
6.4 . Performance Count ers for Linux (PCL) ツールおよび perf
Performance Counters for Linux (PCL) は、パフォーマンスデータ収集および分析用のフレームワークを提
供する新しいカーネルベースのサブシステムです。これらのイベントは、パフォーマンス監視ハードウェア
およびシステムのソフトウェア設定によって異なります。Red Hat Enterprise Linux 6 には、データ収集の
ためのこのカーネルサブシステムと、収集されたパフォーマンスデータを分析するためのユーザースペース
ツールである perf が含まれています。
PCL サブシステムは、削除した指示やプロセッサークロックサイクルを含むハードウェアイベントを測定
するために使用できます。また、主なページフォルトやコンテキストスイッチなどのソフトウェアイベント
も測定できます。例えば、PCL カウンターは、Instructions Per Clock (IPC) を削除した指示のプロセスカウ
ントとプロセッサーのクロックサイクルから計算できます。IPC 率が低いと、コードが CPU をうまく活用
していないことを示します。CPU の低パフォーマンスを診断するために、他のハードウェアイベントも使
用することができます。
パフォーマンスカウンターは、サンプルを記録するように設定することもできます。サンプルの相対的頻度
を使用して、コードのどの領域がパフォーマンスに最も影響があるかを特定することが可能です。
6.4 .1. Perf ツールコマンド
以下に便利な perf コマンドを挙げます。
p erf st at
この perf コマンドは、実行された指示やクロックサイクルを含む一般的なパフォーマンスイベ
ントの全体的な統計情報を提供します。オプションでは、デフォルトの測定イベント以外のもの
が選べます。
p erf reco rd
この perf はパフォーマンスデータをファイルに記録し、これは後でperf repo rt を使って分
析できます。
p erf rep o rt
この perf コマンドはファイルからパフォーマンスデータを読み取り、分析します。
p erf list
この perf コマンドは、特定のマシン上で利用可能なイベントを一覧表示します。これらのイベ
ントは、パフォーマンス監視ハードウェアおよびシステムのソフトウェア設定によって異なりま
す。
perf コマンドの完全な一覧表は、perf hel p を使って取得できます。各 perf コマンドの man ページ情
報を取得するには、perf hel p command を使います。
136
⁠第6 章 プロファイル
6.4 .2. Perf の使用方法
プログラム実行に関する統計情報やサンプルの収集のために基本的な PCL インフラストラクチャーを使用
する方法は簡単なものです。このセクションでは、全体の統計情報およびサンプリングの簡単な例を説明し
ます。
make およびその子についての統計情報を収集するには、以下のコマンドを使用します。
# perf stat -- make al l
perf コマンドは、多くの異なるハードウェアおよびソフトウェアカウンターを収集します。そして、以下
の情報を表示します。
Performance counter stats for 'make all':
244011.782059 task-clock-msecs
53328 context-switches
515 CPU-migrations
1843121 page-faults
789702529782 cycles
1050912611378 instructions
275538938708 branches
2888756216 branch-misses
4343060367 cache-references
428257037 cache-misses
263.779192511
#
#
#
#
#
#
#
#
#
#
0.925 CPUs
0.000 M/sec
0.000 M/sec
0.008 M/sec
3236.330 M/sec
1.331 IPC
1129.203 M/sec
1.048 %
17.799 M/sec
1.755 M/sec
seconds time elapsed
perf ツールはサンプルを記録することもできます。例えば、make コマンドおよびその子に関するデータ
を記録するには、以下のコマンドを実行します。
# perf reco rd -- make al l
これで収集されたサンプル数とサンプルが保存されているファイルが表示されます。
[ perf record: Woken up 42 times to write data ]
[ perf record: Captured and wrote 9.753 MB perf.data (~426109 samples) ]
Red Hat Enterprise Linux 6.4 では、{} グループ構文に新機能が追加され、これによりコマンドライン上で
イベントグループが指定されている方法に基づいてイベントグループが作成できるようになりました。
最新の --g ro up および -g オプションには変更はありません。記録、統計情報、トップコマンドが指定さ
れていれば、指定イベントすべてが単一グループのメンバーになり、最初のイベントがグループリーダーと
なります。
新たな {} グループ構文は、以下のようなグループの作成を可能にします。
# perf reco rd -e ' {cycles, faults}' l s
上記のコマンドを実行すると、cycles および faults イベントを含む単一のイベントグループが作成さ
れ、cycles イベントがグループリーダーになります。
すべてのグループはスレッドおよび CPU に関して作成されます。このため、CPU が 4 つあるサーバー上
で 2 つのスレッド内のイベントは、8 つの異なるグループを作成することになります。
137
開発者ガイド
グループに標準イベント修飾子を使うことができます。これは、グループ内の全イベントにまたがるもの
で、各イベント修飾子設定を更新します。
# perf reco rd -r ' {faults:k,cache-references}: p'
上記のコマンドでは、: kp 修飾子が faults に使われ、: p 修飾子が cache-references イベントに使われるこ
とになります。
Perf o rman ce C o u n t ers f o r Lin u x ( PC L) ツールと O Pro f ile の競合
OProfile と Performance Counters for Linux (PCL) は同じハードウェアの Performance Monitoring Unit
(PMU) を使用します。PCL perf コマンドを使用する際に OProfile が実行中である場合は、OProfile 開始
時に以下のようなエラーメッセージが表示されます。
Error: open_counter returned with 16 (Device or resource busy).
/usr/bin/dmesg may provide additional information.
Fatal: Not all events could be opened.
perf コマンドを使用するには、まず OProfile をシャットダウンします。
# o pco ntro l --d ei ni t
その後に perf. d ata を分析してサンプルの相対頻度を測定することができます。レポート出力には、コマ
ンド、オブジェクト、サンプルの機能などが含まれます。perf repo rt を使って perf. d ata の分析を
出力します。例えば、以下のコマンドは最も多くの時間を消費する実行可能ファイルのレポートを作成しま
す。
# perf repo rt --so rt= co mm
出力は以下のようになります。
# Samples: 1083783860000
#
# Overhead
Command
# ........ ...............
#
48.19%
xsltproc
44.48%
pdfxmltex
6.01%
make
0.95%
perl
0.17%
kernel-doc
0.05%
xmllint
0.05%
cc1
0.03%
cp
0.01%
xmlto
0.01%
sh
0.01%
docproc
0.01%
ld
0.01%
gcc
0.00%
rm
138
⁠第6 章 プロファイル
0.00%
0.00%
0.00%
0.00%
sed
git-diff-files
bash
git-diff-index
左のコラムはサンプルの相対頻度を示しています。この出力では、make が xsl tpro c および
pd fxml tex で最も多くの時間を消費していることを示しています。make が完了する時間を短縮するに
は、xsl tpro c と pd fxml tex にフォーカスします。xsl tpro c が実行する機能を一覧表示するには、以
下のコマンドを実行します。
# perf repo rt -n --co mm= xsl tpro c
以下が生成されます。
comm: xsltproc
# Samples: 472520675377
#
# Overhead Samples
Shared Object
# ........ .......... .............................
#
45.54%215179861044 libxml2.so.2.7.6
xmlXPathCmpNodesExt
11.63%54959620202 libxml2.so.2.7.6
xmlXPathNodeSetAdd__internal_alias
8.60%40634845107 libxml2.so.2.7.6
xmlXPathCompOpEval
4.63%21864091080 libxml2.so.2.7.6
xmlXPathReleaseObject
2.73%12919672281 libxml2.so.2.7.6
xmlXPathNodeSetSort__internal_alias
2.60%12271959697 libxml2.so.2.7.6
2.41%11379910918 libxml2.so.2.7.6
xmlXPathIsNaN__internal_alias
2.19%10340901937 libxml2.so.2.7.6
valuePush__internal_alias
Symbol
......
[.]
[.]
[.]
[.]
[.]
[.] valuePop
[.]
[.]
6.5. ft race
ftrace フレームワークはユーザーにいくつかのトレース機能を提供します。これは SystemTap のイン
ターフェイスよりも非常にシンプルなインターフェイスでアクセス可能です。このフレームワーク
は、d ebug fs ファイルシステムにある仮想ファイルのセットを使用します。これらのファイルは、特定の
トレーサーを有効にします。ftrace 機能トレーサーは、カーネルで呼び出された各機能をリアルタイムで
出力します。ftrace フレームワーク内の他のトレーサーは、ウェイクアップ待ち時間やタスクスイッチ、
カーネルイベントなどの分析にも使用できます。
また、ftrace に新たなトレーサーを追加し、カーネルイベントの分析用に柔軟性のあるソリューションと
することもできます。ftrace フレームワークは、ユーザースペースの外で発生する待ち時間やパフォーマ
ンスの問題のデバッグや分析に便利です。本ガイド内で説明している他のプロファイラーと違い、ftrace
カーネルのビルドイン機能です。
6.5.1. ft race の使用方法
139
開発者ガイド
Red Hat Enterprise Linux のカーネルには、C O NFIG _FT R AC E= y オプションが設定されています。この
オプションは、ftrace が必要とするインターフェイスを提供します。ftrace を使用するには、以下の方
法で d ebug fs ファイルシステムをマウントします。
mo unt -t d ebug fs no d ev /sys/kernel /d ebug
ftrace ユーティリティはすべて、/sys/kernel /d ebug /traci ng / にありま
す。/sys/kernel /d ebug /traci ng /avai l abl e_tracers ファイルで自分のカーネルでどのトレー
サーが利用可能か確認してください。
cat /sys/kernel /d ebug /traci ng /avai l abl e_tracers
power wakeup irqsoff function sysprof sched_switch initcall nop
特定のトレーサーを使用するには、そのトレーサーを
/sys/kernel /d ebug /traci ng /current_tracer に書き込みます。例えば、wakeup は、優先順位
の最も高いタスクをタスクのウェイクアップ後にスケジュールするのにかかる最大時間を追跡・記録しま
す。これを使用するには、以下のコマンドを実行します。
echo wakeup > /sys/kernel /d ebug /traci ng /current_tracer
トレースを開始または停止するには、/sys/kernel /d ebug /traci ng /traci ng _o n に以下のように
書き込みます。
echo 1 > /sys/kernel /d ebug /traci ng /traci ng _o n (追跡を有効化)
echo 0 > /sys/kernel /d ebug /traci ng /traci ng _o n (追跡を無効化)
追跡結果は以下のファイルで確認できます。
/sys/kern el/d eb u g /t racin g /t race
このファイルには、ヒューマンリーダブルな追跡出力が含まれています。
/sys/kern el/d eb u g /t racin g /t race_p ip e
このファイルには /sys/kernel /d ebug /traci ng /trace と同じ出力が含まれていますが、
これはコマンドにパイプ処理されることになっていま
す。/sys/kernel /d ebug /traci ng /trace とは異なり、このファイルからの読み取りは出
力を消費します。
6.5.2. ft race のドキュメンテーション
ftrace フレームワークは、以下のファルで完全に文書化されています。
『ftrace - Function Tracer (機能トレーサー)』: fi l e: ///usr/share/d o c/kernel d o c-version/D o cumentati o n/trace/ftrace. txt
『function tracer guts』: fi l e: ///usr/share/d o c/kernel d o c-version/D o cumentati o n/trace/ftrace-d esi g n. txt
注記
trace-cmd パッケージは、ftrace の有用な代替となるものと同一名のツールを提供します。詳細
は、trace-cmd man ページを参照してください。
14 0
⁠第7 章 Red Hat Developer T oolset
第7章 Red Hat Developer Toolset
Red Hat D eveloper Toolset は、Red Hat Enterprise Linux プラットフォーム上の開発者用の Red Hat オ
ファリングで、Red Hat Enterprise Linux の複数バージョンでインストール・使用できる開発およびパ
フォーマンス分析ツールの包括的セットを提供します。Red Hat D eveloper Toolset ツールチェーンに組
み込まれた実行可能ファイルも、複数バージョンの Red Hat Enterprise Linux 上で導入・実行可能です。
Red Hat D eveloper Toolset は、Red Hat Enterprise Linux 6 プラットフォームにインストールされても、
このプラットフォームでデフォルトで提供されるシステムツールやライブラリーに代わるものではありませ
ん。開発者ツールの類似セットは、これらのツールの代わりとなる新しいバージョンを開発者が最適に使用
できるように提供されるものです。Red Hat D eveloper Toolset が提供するアプリケーションおよびライブ
ラリーは、Red Hat Enterprise Linux システムのバージョンに代わるものでははく、またこれらに優先して
使われるものでもありません。たとえば、デフォルトのコンパイラーやデバッガーは、ベースの Red Hat
Enterprise Linux システムが提供するものにとどまります。
開発者は、scl ユーティリティーを使用することで、ツールの好きなバージョンをいつでも選択できま
す。この製品をインストールして実行可能ファイルを起動する詳細な方法については、『Red Hat
D eveloper Toolset 2.1 User Guide』 を参照してください。
7.1. Red Hat Developer T oolset の機能
Red Hat Enterprise Linux 6 と比較すると、Red Hat D eveloper Toolset は最新バージョンの Eclip se 開
発環境、G N U C o mp iler C o llect io n (GCC)、G N U D eb u g g er (GD B)、および 表7.1「Red Hat
D eveloper Toolset のコンポーネント」 にリスト表示されている他の開発およびパフォーマンス分析ツー
ルを提供します。これらの更新ツールにより開発者は、アトミックタイプ、Transactional Memory、最新
のコンパイラー最適化、OpenMP 3.1 との並列プログラミング、およびデバッグサポートの改善などを含む
実験段階の C++11 言語機能を使用しながらアプリケーションを開発することが可能になっています。
表7.1 R ed H at D evelo p er T o o lset のコンポーネント
名前
バージョン
説明
Eclipse
4.3.1
グラフィカルユーザーインターフェースの統合開発環境。 ⁠ [a]
GCC
4.8.2
binutils
2.23.52
elfutils
0.157
dwz
0.11
Git
1.8.4
GD B
7.6.1
strace
4.7
memstomp
0.1.4
SystemTap
2.1
C、C++、および Fortran をサポートするポータブルコンパイ
ラースイート。
オブジェクトファイルおよびバイナリを検査、操作するバイ
ナリツールおよび他のユーティリティーのコレクション。
ELF ファイルを検査、操作するバイナリツールおよび他の
ユーティリティーのコレクション。
ELF 共有ライブラリーおよびサイズの ELF 実行可能ファイル
に含まれる D WARF デバッグ情報を最適化するツール。
ピアツーピアアーキテクチャーを備えた分散型バージョン管
理システム。
C、C++、および Fortran で書かれたプログラム用のコマンド
ラインデバッガー。
プログラムが使用するシステムコールおよび受け取るシグナル
を監視するデバッグツール。
さまざまな標準では許可されていないメモリー領域の重複をと
もなうライブラリー関数へのコールを特定するデバッグツー
ル。
インストルメント化、再コンパイル、インストール、および再
起動する必要なしにシステム全体のアクティビティーを監視
する追跡およびプローブツール。
14 1
開発者ガイド
名前
バージョン
説明
Valgrind
3.8.1
OProfile
0.9.8
D yninst
8.0
メモリーエラーの検出、メモリー管理問題の特定、さらにシス
テムコールでの不適切な引数使用の報告を行うためのインスト
ルメント化フレームワークおよびアプリケーションをプロ
ファイル化する多くのツール。
プロセッサー上にあるパフォーマンス監視ハードウェアを使
用して、システム上のカーネルと実行可能ファイルに関する
情報を取得するシステム全体のプロファイラー。
実行中にインストルメント化を行い、ユーザー領域の実行可能
ファイルとの作業を行うためのライブラリー。
[a] Red Hat JBo s s Mid d leware 用にアプリケーションを開発する場合、もしくは O p enShift To o ls 用にサ
ポートが必要な場合は、Red Hat JBo s s Develo p er Stud io の使用が推奨されます。
7.2. binut ils の変更点
Red Hat D eveloper Toolset 2.0 は b in u t ils 2.23.52 とともに配布されています。これは、Red Hat
Enterprise Linux のシステムバージョンおよび Red Hat D eveloper Toolset 1.1 に含まれているバージョン
における多くのバグ修正と機能強化を提供するものです。以下では、今回のリリースにおける新機能の完全
なリストを示しています。
The GNU アセンブラー (as)、GNU リンカー (l d )、および binutils の一部である他のバイナリツールは、
GNU 一般公衆利用許諾契約書バージョン 3 の元でリリースされています。
7.2.1. GNU リンカー
既存の GNU リンカーである l d に加え、別の ELF リンカー g o l d が利用可能になっています。g o l d
は、一時的に l d の代わりとなるものなので、l d のドキュメンテーションは参照用ドキュメンテーション
となります。g o l d は l d のほとんどの機能をサポートしますが、目立つ例外は MRI 互換のリンカースク
リプト、相互参照レポート (--cref)、および他の種々ののマイナーオプションになります。また、非常に
大型の C++ アプリケーションとのリンク時間を大幅に改善します。
Red Hat D eveloper Toolset 2.0 では、g o l d リンカーはデフォルトでは有効になっていません。ユーザー
は al ternati ves メカニズムを使って明示的に l d と g o l d を切り替えることができます。
7 .2 .1 .1 . 新しい機能
R ed H at En t erp rise Lin u x 6 .4 以降の変更点
以下の機能は、Red Hat Enterprise Linux 6.4 に含まれる binutils のリリース以降に追加されたものです。
INP UT _SEC T IO N_FLAG S キーワードがリンカースクリプト言語に新たに追加されました。このキー
ワードを使うと、セクションのヘッダーフラグで入力セクションを選択することができます。
SO R T _BY _INIT _P R IO R IT Y キーワードがリンカースクリプト言語に新たに追加されました。この
キーワードを使うと、セクション名にエンコードされている GCC init_priority 属性の数値でセク
ションを分類できます。
SO R T _NO NE キーワードがリンカースクリプト言語に新たに追加されました。このキーワードを使う
と、セクションの分類を無効にできます。
新たなリンカー提供の記号 __ehd r_start が追加されました。ELF 出力を生成する際に、この記号が
プログラムのメモリーイメージ内にある ELF ファイルヘッダー (および近くのプログラムヘッダー) を
指します。
R ed H at En t erp rise Lin u x 5.9 以降の変更点
14 2
⁠第7 章 Red Hat Developer T oolset
以下の機能は、Red Hat Enterprise Linux 5.9 に含まれる binutils のリリース以降に追加されたものです。
GNU/Linux ターゲットが、ELF 記号バインディングの標準セットへの GNU 拡張である
ST B_G NU_UNIQ UE 記号バインディングをサポートするようになりました。このバインディングがダイ
ナミックリンカーに渡されることで、プロセス全体で特定の名前と型を持つ記号が 1 つしか使われてい
ないことを保証します。
注記
この機能の実装は、g l i bc ライブラリーの新しいバージョンにのみある機能に依存していま
す。そのため、この機能は現在、Red Hat Enterprise Linux 6 の Red Hat D eveloper Toolset で
利用可能です。
コマンドラインオプション --no -expo rt-d ynami c が新たに追加されました。このオプションを使
うと、-E および --expo rt-d ynami c オプションの効果を無効にできます。
コマンドラインオプション --warn-al ternate-em が新たに追加されました。このオプションを使う
と、ELF フォーマットオブジェクトファイルが別のマシンコードを使っている場合に警告が表示されま
す。
リンカースクリプト機能 R EG IO N_ALIAS が新たに追加されました。この機能を使うと、メモリー領域
のエイリアス名を作成することができます。
コマンドラインオプション -T text-seg ment address が ELF ベースのターゲットに新たに追加さ
れました。このオプションを使うと、テキスト領域の最初のバイトのアドレスを設定することができま
す。
リンカースクリプトコマンド INSER T が新たに追加されました。このコマンドを使うと、デフォルトス
クリプトを拡大することができます。
リンカースクリプト入力セクションで、archive: file 構文を使ってアーカイブ内でファイルを特定
することができます。
--so rt-co mmo n コマンドラインオプションが ascend i ng および d escend i ng をオプション引数
として使用することができます。これを使うと、どの分類順序を使用するかを指定することができま
す。
コマンドラインオプション --bui l d -i d が ELF ベースのターゲットに新たに追加されました。この
オプションを使うと、ノートセクションに埋め込まれたバイナリあたりの一意の識別子を生成すること
ができます。
コマンドラインオプション --d efaul t-scri pt= file_name (または -d T file_name) が新たに
追加されました。このオプションを使うと、ビルトインリンカースクリプトの代替を指定することがで
きます。
コマンドラインオプション -Bsymbo l i c-functi o ns が新たに追加されました。このオプションは
共有ライブラリー作成時に、共有ライブラリーとの定義がある場合に、グローバル機能記号への参照が
定義にバインドされるようにします。
コマンドラインオプション --d ynami c-l i st-cpp-new および --d ynami c-l i st-d ata が新た
に追加されました。これらを使うと、動的リストを修正することができます。
7 .2 .1 .2 . 互換性の変更点
R ed H at En t erp rise Lin u x 6 .4 以降の変更点
14 3
開発者ガイド
以下の互換性の変更点は、Red Hat Enterprise Linux 6.4 に含まれる binutils のリリース以降になされたも
のです。
--co py-d t-need ed -entri es コマンドラインオプションは、デフォルトで有効になりません。代
わりに --no -co py-d t-need ed -entri es がデフォルトのオプションとなっています。
リンカースクリプト式の評価は、大幅に改善されました。これは、古い式の評価のドキュメント化され
ていない動作に依存するスクリプトにマイナスの影響を与える可能性があることに注意してください。
R ed H at En t erp rise Lin u x 5.9 以降の変更点
以下の互換性の変更点は、Red Hat Enterprise Linux 5.9 に含まれる binutils のリリース以降になされたも
のです。
--ad d -need ed コマンドラインオプションは --co py-d t-need ed -entri es に名前を変更さ
れ、--as-need ed オプションとの混同を防いでいます。
GNU/Linux システムでは、ST T _G NU_IFUNC タイプの記号に対してなされた再配置をリンカーが処理
しなくなりました。代わりに、ローダーが処理するようリンカーは結果のバイナリに生成します。
注記
この機能の実装は、g l i bc ライブラリーの新しいバージョンにのみある機能に依存していま
す。そのため、この機能は現在、Red Hat Enterprise Linux 6 の Red Hat D eveloper Toolset で
利用可能です。
--as-need ed コマンドラインオプションは、以下の 2 つの場合に動的ライブラリー内でリンクするよ
うになりました。
動的ライブラリーが正規オブジェクトの未定義記号にしたがっている場合。
ライブラリーが既にリンクされているライブラリーの D T _NEED ED エントリーで見つけられて
いる場合を除き、動的ライブラリーが他の動的ライブラリーの未定義記号にしたがっている場
合。
-l : file_name コマンドラインオプションが、. a または . so ファイル拡張子を追加せずに
file_name という名前のファイル名のライブラリーパスを検索するようになりました。
7.2.2. GNU アセンブラー
7 .2 .2 .1 . 新しい機能
R ed H at En t erp rise Lin u x 6 .4 以降の変更点
以下の機能は、Red Hat Enterprise Linux 6.4 に含まれる binutils のリリース以降に追加されたものです。
GNU アセンブラーは、マクロでアンパサンド文字 2 つを必要としなくなりました。
コマンドラインオプション --co mpress-d ebug -secti o ns が新たに追加され、再配置可能な出力
ファイルの D WARF デバッグ情報の圧縮を可能にしています。圧縮デバッグセクションは現
在、read el f、o bjd ump、および g o l d ツールがサポートしていますが、l d はサポートしていませ
ん。
x86 ターゲットの. bund l e_al i g n_mo d e、. bund l e_l o ck、および . bund l e_unl o ck 指示文
のサポートが追加されました。
14 4
⁠第7 章 Red Hat Developer T oolset
x86 アーキテクチャーでは、GNU アセンブラーは rep bsf、rep bsr、および rep ret 構文を使う
ことができます。
R ed H at En t erp rise Lin u x 5.9 以降の変更点
以下の機能は、Red Hat Enterprise Linux 5.9 に含まれる binutils のリリース以降に追加されたものです。
GNU/Linux ターゲットは、g nu_uni q ue_o bject を . type 擬似オペレーションの値としてサポート
します。この値を使って、プロセス全体で記号をグローバルで一意のものとしてマークすることができ
ます。
. l o c 指示文用の識別子オペランドをともなう D WARF 行テーブル内の新たな識別子のコラムに対する
サポートが追加されました。
. type 擬似オペレーションが ST T _G NU_IFUNC のタイプを受け付けるようになりました。これを使っ
て、記号が再配置のターゲットである場合、この値は使うべきでないことを示すことができます。代わ
りに、関数が起動され、その結果を値として使います。
擬似オペレーション . cfi _val _enco d ed _ad d r が新たに追加されました。これを使って、ランタイ
ム再配置なしにアンワインドテーブルの一定アドレスを記録することができます。
コマンドラインオプション -msse-check= [no ne| erro r| warni ng ] が x86 ターゲット用に新たに
追加されました。
-a コマンドラインオプションが g を有効なサブオプションとして使用できます。この組み合わせを
使って、アセンブリーについての追加情報をともなうアセンブリーリスティングを有効にできます。こ
れには、提供されるコマンドラインオプションやアセンブラーバージョンが含まれます。
コマンドラインオプション -msse2avx が x86 ターゲット用に新たに追加されました。このオプショ
ンを使って、VEX 接頭辞のある SSE 命令をエンコードできます。
x86 ターゲットは、Intel XSAVE、EPT、MOVBE、AES、PCLMUL、および AVX/FMA 命令をサポート
します。
コマンドラインオプション -march= cpu[,+ extension… ]、-mtune= cpu、-mmnemo ni c=
[att| i ntel ]、-msyntax= [att| i ntel ]、-mi nd ex-reg 、-mnaked -reg 、および -mo l d g cc が x86 ターゲット用に新たに追加されました。
擬似オペレーション . stri ng 16 、. stri ng 32、および . stri ng 6 4 が新たに追加されました。これ
らの擬似オペレーションを使って、ワイド文字を生成することができます。
i386 は SSE5 命令セットをサポートします。
擬似オペレーション . rel o c が新たに追加されました。この擬似オペレーションは、再配置を作成する
低レベルのインターフェースとして機能します。
7.2.3. 他のバイナリツール
7 .2 .3.1 . 新しい機能
R ed H at D evelo p er T o o lset 1.1 以降の変更点
以下の機能は、Red Hat D eveloper Toolset 1.1 に含まれる binutils のリリース以降に追加されたもので
す。
d wp ユーティリティーのマニュアルページが追加されました。
バイナリツールは AMD Family 15h プロセッサーのモデル 02h および 10-1fh をサポートします。
14 5
開発者ガイド
R ed H at En t erp rise Lin u x 6 .4 以降の変更点
以下の機能は、Red Hat Enterprise Linux 6.4 に含まれる binutils のリリース以降に追加されたものです。
read el f および o bjd ump ツールは . d ebug . macro セクションのコンテンツを表示できます。
コマンドラインオプション --d warf-start および --d warf-end が read el f および o bjd ump
ツールに新たに追加されました。これらのオプションは、新しい Emacs モード (d warf-mo d e. el
ファイルを参照) で使用されます。
コマンドラインオプション --i nterl eave-wi d th が o bjco py ツールに新たに追加され、入力から
出力に幅広いバイトをコピーする --i nterl eave の使用が可能になりました。
コマンドラインオプション --d yn-syms が read el f ツールに新たに追加されました。このオプショ
ンを使って動的記号テーブルをダンプすることができます。
新ツール el fed i t が binutils に追加されました。このツールを使って直接 ELF フォーマットのバイ
ナリを操作することができます。
新コマンドラインオプション --ad d resses (または短縮で -a) が ad d r2l i ne ツールに追加されま
した。このオプションを使うと、関数またはソースファイル名の前にアドレスを表示することができま
す。
新コマンドラインオプション --pretty-pri nt (または短縮で -p) が ad d r2l i ne ツールに追加され
ました。このオプションを使うとヒューマンリーダブルな出力を作成することができます。
d wz -m 最適化デバッグ情報が追加されました。
devtoolset-2-binutils-devel パッケージは d emang l e. h ヘッダーファイルを提供します。
R ed H at En t erp rise Lin u x 5.9 以降の変更点
以下の機能は、Red Hat Enterprise Linux 5.9 に含まれる binutils のリリース以降に追加されたものです。
新コマンドラインオプション --i nsn-wi d th= width が o bjd ump ツールに追加されました。この
オプションを使うと、命令の逆アセンブル時に一行に表示するバイト数を指定できます。
新コマンドラインオプション --rel o cated -d ump= name| number が read el f ツールに追加され
ました。このオプションを使うと、再配置されたセクションのコンテンツをバイトのシーケンスとして
表示できます。
新コマンドラインオプション --external -symbo l s-tabl e= filename が g pro f ツールに追加
されました。このオプションを使うと、特定のファイルから記号テーブルを読み込むことができます。
bfd はプラグインターゲットをサポートしており、g o l d が使用する同一の共有オブジェクトをプラ
グインターゲットがロードすることで新たなファイルフォーマット用に基本的なサポートを得ることが
できます。
o bjd ump ツールの --d warf (または短縮で -W コマンドラインオプションは、read el f の -d ebug -d ump (または -w) オプションと同様の柔軟性を持つようになっています。
新コマンドラインオプション --prefi x= prefix および --prefi x-stri p= level が o bjd ump
ツールに追加されました。これらのオプションを使うと、--so urce (または短縮で -S) オプションに
絶対パスを追加することができます。
新コマンドラインオプション -wL が read el f ツールに追加されました。このオプションを使う
と、. d ebug _l i ne セクションのデコード済みのコンテンツをダンプすることができます。
「Thin」 アーカイブがサポートされています。このアーカイブはオブジェクトファイルではなく、それ
らのファイルを指すパス名のみを含みます。
14 6
⁠第7 章 Red Hat Developer T oolset
新コマンドラインオプション -F が o bjd ump ツールに追加されました。このオプションを使うと、逆
アセンブリーにファイルオフセットを含めることができます。
新コマンドラインオプション -c が read el f ツールに追加されました。このオプションを使うと、
アーカイブ記号インデックスの文字列ダンプが可能になります。
i386 は SSE5 命令セットをサポートします。
新コマンドラインオプション -p が read el f ツールに追加されました。このオプションを使うと、セ
クションの文字列ダンプが可能になります。
7 .2 .3.2 . 互換性の変更点
R ed H at En t erp rise Lin u x 5.9 以降の変更点
以下の互換性の変更点は、Red Hat Enterprise Linux 5.9 に含まれる binutils のリリース以降になされたも
のです。
--as-need ed コマンドラインオプションは、以下の 2 つの場合に動的ライブラリー内でリンクするよ
うになりました。
動的ライブラリーが正規オブジェクトの未定義記号にしたがっている場合。
ライブラリーが既にリンクされているライブラリーの D T _NEED ED エントリーで見つけられて
いる場合を除き、動的ライブラリーが他の動的ライブラリーの未定義記号にしたがっている場
合。
7.3. プラットフォームの互換性
Red Hat D eveloper Toolset 2.1 は、Red Hat Enterprise Linux 5 および 6 のみで利用可能で、32 ビット
と 64 ビットの Intel および AMD アーキテクチャーの両方に対応しています。
図7.1「Red Hat D eveloper Toolset 2.1 の互換性に関する表」 は、Red Hat Enterprise Linux の特定バー
ジョン上で Red Hat D eveloper Toolset を使ってビルドされたバイナリが本システムの他のバージョンで
実行される際のサポートを示しています。y 軸では、バイナリがビルドされる Red Hat Enterprise Linux の
バージョンが示され、アプリケーションを稼働する Red Hat Enterprise Linux のバージョンと相互参照さ
れています。
図7.1 R ed H at D evelo p er T o o lset 2.1 の互換性に関する表
7.4 . Red Hat Developer T oolset の参考資料
Red Hat D eveloper Toolset 2.1 およびそのオファリングについての詳細情報は、以下のリソースを参照し
てください。
Red Hat D eveloper Toolset 2.1 Release Notes — Red Hat D eveloper Toolset 2.1 の 『Release
Notes』 は、リリース時に入手可能な重要情報を提供しています。システム要件について知りたい場
合、もしくは製品の既知の問題について知りたい場合は、こちらを参照してください。
Red Hat D eveloper Toolset 2.1 User Guide — Red Hat D eveloper Toolset 2.1 の 『User Guide』
は、製品の概要を提供し、Red Hat D eveloper Toolset のバージョンの始め方および使用方法を説明し
ています。Red Hat D eveloper Toolset をご使用のシステムで取得、インストール、使用する方法につ
いて、または本製品の詳細な変更点の一覧については、このガイドを参照してください。
14 7
開発者ガイド
第8章 Red Hat Software Collections
アプリケーションによっては、最新機能を使うためにソフトウェアコンポーネントの最新バージョンが必
要になることがよくあります。Red Hat Software Collections は Red Hat のオファリングで、動的なプロ
グラム言語のセットやデータベースサーバーを提供します。また、Red Hat Enterprise Linux のベースシス
テムに含まれているものと同等の関連パッケージバージョンよりも最新のもの、またはこのシステムで初め
て利用可能となるパッケージを提供します。
Red Hat Software Collections で配布される動的言語やデータベースサーバー、および他のツールは、Red
Hat Enterprise Linux 6 で提供されるデフォルトのシステムツールを置き換えるもの ではなく、これらの
ツールに優先して使用されるものでもありません。たとえば、デフォルトバージョンの Perl および
PostgreSQL は Red Hat Enterprise Linux のベースシステムが提供するもので変わりありません。ユー
ザーは scl ユーティリティーを使うことで、実行したいツールのバージョンをいつでも選択することがで
きます。
N o d e.js は明らかな例外ですが、他のすべての Red Hat Software Collections コンポーネントは、Red
Hat Enterprise Linux サブスクリプションレベルアグリーメントで完全にサポートされ、機能的に完成して
おり、本番使用を目的としています。
8.1. Red Hat Soft ware Collect ions の機能
Red Hat Software Collections 1.0 は、表8.1「Red Hat Software Collections 1.0 コンポーネント」 に記
載のツールの最新バージョンを提供します。
表8.1 R ed H at So f t ware C o llect io n s 1.0 コンポーネント
コンポーネント
So f t ware
C o llect io n
説明
Perl 5.16 .3
perl516
PH P 5.4 .14
php54
Pyt h o n 2.7
python27
Pyt h o n 3.3
python33
最新の安定した Perl のリリースで、多くの追加ユーティリ
ティーやスクリプト、および MySQ L と Po st g reSQ L 用の
データベースコネクター があります。このバージョンでは多
くの新機能および機能強化が提供されており、新たなデバッ
グオプション、Unicode サポートの改善、すぐれたパフォー
マンスなどが含まれます。
PEAR 1.9 .4 および多くの追加ユーティリティーを含む最新
の安定した PHP リリースです。このバージョンでは、新たな
言語構文、コマンドライン用のビルトインウェブサーバー、
パフォーマンス改善などが含まれます。
MySQ L と Po st g reSQ L 用のデータベースコネクター およ
び多くの追加ユーティリティーがある最新の安定した Python
リリースです。このバージョンでは、さまざまな新機能と機
能強化が提供され、新たな順序付き辞書型、より速い I/O 操
作、Python 3 との前方互換性の改善などが含まれます。
Po st g reSQ L 用のデータベースコネクター および多くの追
加ユーティリティーがある最新の安定した Python 3 リリー
スです。この Software Collection は、Red Hat Enterprise
Linux 6 での開発者に Python 3 へのアクセスを提供し、この
バージョンとのアプリケーションの互換性テストを可能にし
ます。
14 8
⁠第8 章 Red Hat Soft ware Collect ions
コンポーネント
So f t ware
C o llect io n
説明
R u b y 1.9 .3
ruby193
MariaD B 5.5
mariadb55
MySQ L 5.5
mysql55
R ails 3.2.8 および 大型の R u b y g ems コレクション のあ
る安定した Ruby の最新リリースです。この Software
Collection は Red Hat Enterprise Linux 6 の開発者に Ruby
1.9 へのアクセスを提供します。Ruby 1.9 は、改善された
Unicode サポート、スレッドの機能強化、迅速な読み込み時
間などを含む多くの新機能および機能強化を提供します。
安定した最新リリースの MariaD B です。この Software
Collection は、Red Hat Enterprise Linux 6 のユーザーに
MySQL の代替を提供します。これは MariaD B とバイナリ互
換で、データ変換なしにこれを置き換えることができます。
最新の安定した MySQL のリリースです。このバージョンで
は、パフォーマンスの改善など、多くの新機能および機能強
化が提供されます。
最新の安定した PostgreSQL リリースです。このバージョン
では、ネイティブ JSON サポートやスケーラビリティーの改
善、パフォーマンスの改善などの多くの新機能や機能強化が
提供されます。
安定した最新リリースの Node.js です。この Software
Collection は、Red Hat Enterprise Linux 6 のユーザーにこ
のプログラミングプラットフォームへのアクセスを提供しま
す。
Po st g reSQ L 9 .2 postgresql92
N o d e.js 0.10 ⁠ [a]
nodejs010
[a] Red Hat So ftware Co llec tio ns 1.0 、では、Node.js はテクノロジープレビューとして含まれています。
Red Hat テクノロジープレビューについての詳細
は、http s ://ac c es s .red hat.c o m/s up p o rt/o ffering s /tec hp review/ を参照してください。
8.2. プラットフォームの互換性
Red Hat Software Collections 1.0 は、以下のバージョンの AMD 64 および Intel 64 アーキテクチャーの
Red Hat Enterprise Linux システムで利用できます。
Red Hat Enterprise Linux 6.2 Extended Update Support
Red Hat Enterprise Linux 6.3 Extended Update Support
Red Hat Enterprise Linux 6.4
8.3. Red Hat Soft ware Collect ions の使用
特定の Software Collection から実行可能ファイルを実行するには、シェルプロンプトで以下のコマンドを
入力します。
scl enabl e software_collection. . . ' command. . . '
software_collection を使用する Software Collections を空白で区切った一覧で置き換え、command を実行
するコマンドで置き換えます。たとえば、perl516 Software Collection から hel l o . pl というファイル名
に保存されている Perl プログラムを Perl インタープリターで実行するには、以下のように入力します。
~]$ scl enabl e perl 516 ' perl hel l o . pl '
Hello, World!
14 9
開発者ガイド
Red Hat Enterprise Linux の同等のものに優先して、選択した Software Collection から実行可能ファイル
で新たなシェルセッションを開始するには、シェルプロンプトで以下を入力します。
scl enabl e software_collection. . . bash
software_collection を使用する Software Collections を空白で区切った一覧で置き換えます。たとえば、デ
フォルトとして新たなシェルセッションを python27 および postgresql92 Software Collections で開始す
るには、以下のように入力します。
~]$ scl enabl e pytho n27 po stg resq l 9 2 bash
現行セッションで有効となっている Software Collections の一覧は、$X_SC LS 環境変数に保存されま
す。例を示します。
~]$ echo $X_SC LS
python27 postgresql92
scl ユーティリティーを使うことで、どのコマンドも実行できます。これは、Red Hat Enterprise Linux
の同等のものに優先して、選択された Software Collection からの実行ファイルで実行するようにします。
システムにこのコマンドラインユーティリティーをインストールして使用する方法について
は、「Software Collections および scl -uti l s」 を参照してください。
Red Hat Software Collections で配布される Software Collections の完全なリストについては、表
8.1「Red Hat Software Collections 1.0 コンポーネント」 を参照してください。これらの Software
Collections の詳細な使用方法については、『Red Hat Software Collections 1.0 Release Notes』 を参照
してください。
8.4 . Red Hat Soft ware Collect ions を使用するアプリケーションの導入
稼働中の Red Hat Software Collections からのコンポーネントに依存するアプリケーションを導入するに
は、一般的に以下のどちらかの方法を使うことができます。
すべての必要な Software Collections とパッケージを手動でインストールし、その後にアプリケーショ
ンを導入する。
アプリケーション用に新たな Software Collection を作成し、必要なすべての Software Collections お
よびその他のパッケージを依存関係として指定する。
個別の Red Hat Software Collections コンポーネントを手動でインストールする詳細な情報は、『Red Hat
Software Collections 1.0 Release Notes』 を参照してください。カスタマイズされた Software
Collection を作成する詳細な説明は、『Red Hat D eveloper Toolset Software Collections Guide』 を参
照してください。
8.5. その他の情報
Red Hat Software Collections 1.0 Release Notes — Red Hat Software Collections 1.0 の 『Release
Notes』 は、リリース時に入手可能な重要情報を提供しています。システム要件について知りたい場
合、もしくは製品の既知の問題について知りたい場合は、こちらを参照してください。
150
⁠第9 章 ドキュメンテーションツール
第9章 ドキュメンテーションツール
Red Hat Enterprise Linux 6 には、プロジェクトにドキュメンテーションを含めるためのツールが 2 つあ
ります。Publican と D oxygen です。
9.1. Publican
Publican は D ocBook XML でドキュメンテーションを発行、処理するプログラムです。ブックを発行する
プロセスで、XML が有効かつ発行可能な基準にあることを確認します。新規作成されたアプリケーション
についてのドキュメンテーションの発行には、特に便利です。
9.1.1. コマンド
Publican には利用可能な多くのコマンドとアクションがあり、これらすべては --hel p もしくは --man
ページで見られます。一般的なものを以下に挙げます。
bui l d
XML ファイルをドキュメンテーションに適合するフォーマット (PD F、HTML、HTML-single な
ど) に変換します。
create
「ファイル」 で説明されている必要なファイルすべてを含むあらたなブックを作成します。
create_brand
「ブランド」 で説明されているように、新たなブランドを作成し、すべてのブックの外観を揃え
ます。
packag e
ブックのファイルを RPM 配布可能にパッケージ化します。
9.1.2. 新規ドキュメントの作成
すべての必要なファイルを含む新規ドキュメントを作成するには、publ i can create コマンドを使いま
す。
publ i can create には、以下のような多くのオプションがあります。
--hel p
publ i can create コマンドで使用できるオプション一覧を表示します。
--name Doc_Name
ブックの名前を設定します。タイトルには空白を入れないように注意してください。
--l ang Language_Code
このオプションを設定しない場合は、デフォルトで en-US となります。--l ang オプション
は、publ i can. cfg ファイル内の xml _l ang を設定し、ドキュメントディレクトリ内でこの
名前を使ってディレクトリを作成します。
--versi o n version
151
開発者ガイド
ブックについての製品バージョン番号を設定します。
--pro d uct Product_Name
ブックについての製品名を設定します。この名前には空白を入れないよう注意してください。
--brand brand
ドキュメントの見た目の一貫性を保つために使うブランド名を設定します。
他のオプションについては --hel p を参照してください。
publ i can create を実行する前に、ブックを作成するディレクトリに切り替えることを忘れないでくだ
さい。こうすることで、ファイルやディレクトリがユーザーのホームディレクトリに追加されなくなりま
す。
9.1.3. ファイル
ブックが作成されると、多くのファイルがブックのディレクトリ内に作成されます。これらのファイル
は、ブックが正常にビルドされるために必要なもので、削除してはいけません。しかし、(各章などの) リン
クが機能するにはこれらを編集すると共に、著者やタイトルに関する正確な情報を含める必要もあります。
publ i can. cfg
このファイルはビルドオプションを設定し、常に xml_lang (ブックの言語、例えば enUS)、type (ドキュメントのタイプ、例えば book または set)、brand (「ブランド」 にある、
ドキュメントが使用するブランディング、例えば Red Hat) の各パラメーターが含まれます。オ
プションのパラメーターは多くありますが、これらは後で翻訳の分野などで問題を引き起こす可
能性もあるので、使用する際には注意が必要です。これらの高度なパラメーター一覧は、
Publican User Guide にあります。publ i can. cfg ファイルは、初期作成時のものから編集さ
れることはほとんどありません。
bo o k_i nfo . xml
このファイルはブックのテンプレートで、タイトルやサブタイトル、著者、発行番号、ブックの
ID 番号などの情報が含まれています。また、注意や警告、基本的なスタイルガイドに関する情報
と発行物の最初に印刷される基本的な Publican 情報も含まれます。ブックが更新される際には
発行番号を増やす必要があるので、このファイルは頻繁に編集されます。
Autho r_G ro up. xml
このファイルは、著者および投稿者に関する情報を保存するために使われます。一旦設定される
と、著者に関する変更がない限り、編集されることは滅多にありません。
C hapter. xml
このファイルは、実際のコンテンツがどのようなものかを示す例です。プレースホルダーとして
作成されますが、(下記の) Doc_Name.xml でリンクされていなければ、実際のブックには表示
されません。発行するコンテンツを書く際に、新規 XML ファイルが作成され、適切に名前が付け
られ (例えば、ch-publican.xml)、D o c_Name. xml 内にリンクされます。ブックがビルドされ
ると、このファイルのコンテンツがブックのコンテンツを形成します。この特定ファイルが編集
される可能性は低いですが、同様のファイルは継続的に変更、更新、追加、削除などがされるの
で、編集されることになります。
Doc_Name. xml
このファイルは発行物のコンテンツページで、ブックに含まれる各章へのリンク一覧が含まれま
す。実際には「D oc_Name」 とは呼ばれず、発行物のタイトル (例えば、
D eveloper_Guide.xml) になります。このファイルは、新しい章が追加されるか、削除または整
152
⁠第9 章 ドキュメンテーションツール
理し直した場合にのみ、編集されます。このファイルは、Doc_Name. ent と同じである必要が
あり、そうでない場合は、ブックがビルドされません。
Doc_Name. ent
このファイルには、ローカルエンティティの一覧が含まれます。デフォルトでは、YEAR は現在
の年に設定され、HOLDER には著作権所有者の名前をそこに表示するというメモが含まれま
す。Doc_Name. xml と同様に、このファイルは「D oc_Name」とは呼ばれず、ドキュメントの
タイトル (例えば、D eveloper_Guide.ent) になります。発行の最初の 1 回か、著作権所有者が変
更された場合にのみ編集される可能性があります。Doc_Name. xml と同じになっている必要が
あり、そうでない場合はブックがビルドされません。
R evi si o n_Hi sto ry. xml
publ i can packag e の実行時に、<revhi sto ry> タグを含む最初の XML ファイルを使って
RPM 改訂履歴がビルドされます。
9 .1 .3.1 . ドキュメンテーションにメディアを追加する
説明されている内容を例証するために、様々なメディアを追加する必要がある場合もあります。
イメージ
i mag es フォルダは、publican がドキュメントのディレクトリ内に作成します。ドキュメントで使われる
イメージはすべてここに保存します。そして、このドキュメントにイメージを追加する際は、i mag es
ディレクトリ内にイメージにリンクさせます (例えば、. /i mag es/i mag e1. png )。
コードサンプル
時間が経過し技術が変化するにつれ、プロジェクトのドキュメンテーションはコード内の差異を反映するた
めに更新が必要になります。これを容易にするには、好みのエディターで各コードサンプルに個別のファイ
ルを作成し、ドキュメントのディレクトリ内の extras と呼ばれるフォルダにこれを保存します。ドキュ
メントにコードサンプルを挿入する際に、ファイルとファイルが入っているフォルダにリンク付けします。
この方法だと、数カ所で使われている例が一度で更新でき、変更する特定のアイテムをドキュメント全体で
探すのではなく、コードサンプルが一箇所で見つかるので、時間と労力が節約できます。
任意のファイル
ドキュメンテーションに含まれていないファイルを RPM (例えば、ビデオによる説明) でバンドルする必要
がある場合もあります。これらのファイルを発行物のディレクトリ内にある fi l es と呼ばれるディレクト
リに加えることで、ブックがコンパイルされる際にファイルが RPM に追加されます。
これらのファイルにリンクを貼るには、以下の XML を使用します。
<xi:include parse="text" href="extras/fork/fork1.c"
xmlns:xi="http://www.w3.org/2001/XInclude" />
9.1.4 . ドキュメントのビルド
root ディレクトリでまず最初に publ i can bui l d --fo rmats= chosen_format -l ang s= chosen_language を入力してテストビルドを実行し、すべての XML が正しく受け入れられる
かを確かめます。例えば、US English のドキュメントを single HTML ページでビルドするに
は、publ i can bui l d --fo rmats= html -si ng l e --l ang s= en-US を実行します。エラーがなけ
れば、ブックは root ディレクトリにビルドされ、そこで必要な仕上がりとなっているかを確認できます。
トラブルシューティングをできるだけ簡単なものとするため、この確認を定期的に行うことが推奨されま
す。
153
開発者ガイド
注記
XML コード内のバグをテストするためにビルドを行う際は、--no val i d オプションが便利な時も
あります。これは、まだ存在しないファイルやドキュメントのセクションを指している相互参照や
リンクをスキップします。その代わりに、クエスチョンマーク 3 つ (???) で示されます。
ドキュメントは以下に挙げる多くの異なる形式で発行できます。
h t ml
通常の HTML ページで、次の章やセクションへのリンクがあります。
h t ml- sin g le
1 ページの長い HTML ページで、異なる章やセクションへのリンクはページのトップにあり、新
たなページではなくページ下部に移動します。
h t ml- d eskt o p
1 ページの長い HTML ページで、異なる章やセクションへのリンクはドキュメントの左側のパネ
ルに表示され、新たなページではなくページ下部に移動します。
man
Linux、UNIX、その他の同様のオペレーティングシステムシステムの man ページです。
pdf
PD F ファイルです。
t est
実際に表示されるファイルを作成することなく XML を検証します。
t xt
単一のテキストファイルです。
ep u b
EPUB 形式の電子書籍です。
eclip se
Eclipse ヘルプのプラグインです。
9.1.5. 発行物のパッケージ
ドキュメンテーションが完成し、エラーなしでビルドができたら、publ i can packag e -l ang = chosen_language を実行します。これで SRPM パッケージがドキュメントのディレクトリの
tmp/rpm に出力され、バイナリ RPM パッケージがドキュメントのディレクトリのtmp/rpm/no arch に
行きます。デフォルトでは、これらのパッケージの名前は productname-title-productnumber[web]-language-edition-pubsnumber.[build_target]. no arch. file_extension とな
り、各セクションの情報は publ i can. cfg からのものとなります。
9.1.6. ブランド
154
⁠第9 章 ドキュメンテーションツール
ブランドは、ロゴやイメージ、配色の一致という点で多くのドキュメントの種類にわたって外観で一貫性の
レベルを作成するという点で、テンプレートと同様の使われ方をします。同一アプリケーションやアプリ
ケーションの同一バンドルのブックを複数作成する場合は、これが特に有用となります。
新規ブランドの作成には、名前と言語が必要になります。publ i can create_brand --name= brand
--l ang = language_code を実行します。これで publ i can-brand というフォルダが作成され、発行
物のディレクトリ内に置かれます。このフォルダには、以下のファイルが含まれます。
C O P Y ING
SRPM パッケージの一部で、著作権ライセンスおよび詳細が含まれます。
d efaul ts. cfg
publ i can. cfg で設定可能なパラメーターのデフォルト値を提供します。このファイルからの
仕様は、publ i can. cfg ファイル内の仕様が適用される前に最初に適用されます。つま
り、publ i can. cfg 内の値は d efaul ts. cfg ファイルの値を上書きします。これはドキュ
メント内で定期的に使用される側面に使用することが最善ですが、ライターは設定を変更するこ
ともできます。
o verri d es. cfg
これも publ i can-brand . spec で設定可能なパラメーターの値を提供します。このファイル
からの仕様は最後に適用されるので、d efaul ts. cfg と publ i can. cfg の両方を上書きしま
す。ライターによる変更が許可されていない側面に使用されることが最善です。
publ i can. cfg
バージョンやリリース番号、ブランド名といった基本的な情報を設定する点
で、publ i can. cfg ファイルと同様のファイルです。
publ i can-brand . spec
このファイルは、RPM Package Manager が発行物を RPM にパッケージ化する際に使用しま
す。
R EAD ME
SRPM パッケージの一部で、パッケージの概説を提供します。
言語コードの名前がつけられたサブディレクトリもこのディレクトリ内に置かれ、以下のファイルが含まれ
す。
Feed back. xml
これはデフォルトで生成され、閲覧者がフィードバックを残せるようにします。カスタマイズし
て、関連の連絡先詳細やバグ報告プロセスを含めることができます。
Leg al _No ti ce. xml :
著作権情報が含まれます。選択された著作権ライセンスの詳細を編集・変更できます。
このディレクトリには、あと 2 つのサブディレクトリがあります。i mag es サブディレクトリには、ラス
ター (PNG) とベクター (SVG) 形式の両方のイメージ数が含まれており、イメージの置換で変更可能な様々
なナビゲーションアイコンのプレースホルダとして機能します。css フォルダには o verri d es. css が
含まれ、これはブランドの視覚スタイルを設定し、co mmo n. css のものを上書きします。
配布可能な新規ブランドをパッケージ化するには、publ i can packag e コマンドを使用します。デフォ
ルトでは、このコマンドは ソース RPM パッケージ (SRPM パッケージ) を作成しますが、--bi nary オプ
ションを使用して バイナリ RPM パッケージ を作成することもできます。パッケージ名は、publicanbrand-version-release.[build_target].[no arch].file_extension とな
155
開発者ガイド
り、publ i can. cfg ファイルから取られた必須パラメーターが付けられます。
注記
SRPM パッケージには .src.rpm 拡張子が付き、バイナリ RPM パッケージには .rpm 拡張子が付き
ます。
バイナリ RPM パッケージには、[bui l d _targ et]. no arch に拡張子の付いたファイルが含まれ、この
[bui l d _targ et] は publ i can. cfg ファイルの o s_ver パラメーターで設定されているパッケージ
がビルドされる対象のオペレーティングシステムとバージョンを示しています。noarch 要素は、このパッ
ケージがシステムアーキテクチャに関係なく、どのシステム上にでもインストールできることを明記してい
ます。
9.1.7. Web サイトのビルド
Publican は、ドキュメンテーションを管理するための Web サイトをビルドすることもできます。これ
は、1 人でドキュメンテーションを維持しているものの、Web サーバー上にインストールする Publican が
生成可能な PRM パッケージのドキュメンテーションをチームで作業している場合に特に便利なものです。
作成される Web サイトは、ホームページ、製品およびバージョン情報のページ、ドキュメンテーションの
ページで構成されます。発行物の root ディレクトリに Publican は、設定ファイル、SQLite データベース
ファイル、サブディレクトリ 2 つを作成します。言語ごとに新規サブディレクトリが作成されるので、ド
キュメンテーションが発行される言語数によっては多くの設定ファイルが存在することになります。
詳細情報は 「ドキュメンテーション」 を参照してください。
9.1.8. ドキュメンテーション
Publican には端末からアクセス可能な --man、--hel p、--hel p_acti o ns の各種の包括的ページが
あります。
利用可能な異なるタグを含む XML についての情報は、Norman Walsh および Leonard Muellner 著の
D ocBook ガイドである 『D ocBook: the definitive guide』 を参照してくださ
い。http://www.docbook.org/tdg/en/html/docbook にあります。タグの全一覧とそれらの簡単な使用方法
については、『Part II: Reference』 を参照してください。
また、包括的な Publican ユーザーガイドもオンラインで http://jfearn.fedorapeople.org/enUS/index.html にアクセスするか、yum i nstal l publ i can-d o c でローカルにインストールすること
ができます。
9.2. Doxygen
D oxygen は、オンラインの HTML とオフラインの Latex の両方で参照資料を作成するドキュメンテーショ
ンツールです。これは、文書化されたソースファイルのセットから作成を行い、これによりドキュメンテー
ションの一貫性を保ちソースコードとの正確性を保つことが容易になります。
9.2.1. Doxygen 対応の出力および言語
D oxygen は以下の主力をサポートします。
RTF (MS Word)
PostScript
156
⁠第9 章 ドキュメンテーションツール
ハイパーリンク付き PD F
圧縮 HTML
Unix man ページ
D oxygen は以下のプログラム言語をサポートします。
C
C++
C#
Objective -C
ID L
Java
VHD L
PHP
Python
Fortran
D
9.2.2. 使用開始
D oxygen は設定ファイルを使ってセッティングを決定するので、これが正確に作成されることが非常に重
要になります。各プロジェクトには、それぞれの設定ファイルが必要になります。最も簡単に設定ファイル
を作成する方法は、d o xyg en -g config-file コマンドを使用する方法です。この方法だと、編集が
容易なテンプレート設定ファイルが作成されます。変数 config-file は、設定ファイル名です。コマンドから
コミットされた場合は、デフォルトで D oxyfile と呼ばれます。設定ファイル作成でのもうひとつの便利な
オプションは、ファイル名にマイナス記号 (-) を使うことです。これは、標準出力 (std i n) から設定ファ
イルを D oxygen に読み取らせるようにするため、スクリプティングに便利なものです。
設定ファイルは、シンプルな Makefile と同様に、多くの変数およびタグから構成されます。
T AG NAME = VALUE1 VALUE2. . .
ほとんどの場合はこのままにしておいて構いません。ただし、編集の必要がある場合、すべての利用可能な
タグの詳細な説明について、D oxygen ドキュメンテーション Web サイト 『configuration page』 を参照
してください。また、d o xywi zard と呼ばれる GUI インターフェイスもあります。この編集方法が望ま
しい場合は、機能についてのドキュメンテーションは D oxygen ドキュメンテーション Web サイトの
『D oxywizard usage page』 にあります。
以下の 8 つのタグは、慣れておくと便利なものです。
INP UT
C もしくは C++ ソースとヘッダーファイルで主に構成されている小規模プロジェクトの場合、なにも変更
する必要はありません。ただし、プロジェクトが大型でソースディレクトリやツリーで構成されている場合
は、root ディレクトリ (単数または複数) を INPUT タグに割り当てます。
FILE_P AT T ER NS
157
開発者ガイド
ファイルパターン (例えば、*. cpp や *. h) をこのタグに追加し、パターンのいずれかに適合するファイル
のみを解析させることができます。
R EC UR SIVE
この設定を yes にすると、ソースツリーの再帰分析が可能になります。
EXC LUD E および EXC LUD E_P AT T ER NS
これらは、回避するファイルパターンを追加することで解析されるファイルをさらに細かくチューニングす
るために使用されます。例えば、ソースツリーからすべての test ディレクトリを省略するに
は、EXC LUD E_P AT T ER NS = */test/* を使用します。
EXT R AC T _ALL
これを yes に設定すると、doxygen はプロジェクトが完全に文書化されるとどのように見えるかが分かる
ように、ソースファイル内のすべてが文書化されているかのように振る舞います。しかし、このモードで
は、文書化されていないメンバーに関する警告は生成されません。終了時これを修正するには、no に設定
を戻します。
SO UR C E_BR O WSER および INLINE_SO UR C ES
SO UR C E_BR O WSER タグを yes に設定すると、doxygen は相互参照を生成し、ソースファイル内で存在
するドキュメンテーションでソフトウェアの定義について分析します。これらのソース
は、INLINE_SO UR C ES を yes に設定することでドキュメンテーション内に含めることもできます。
9.2.3. Doxygen の実行
d o xyg en config-file を実行すると、html 、rtf、l atex、xml 、および/または man ディレクトリ
が doxygen が開始されたディレクトリ内に作成され、対応するファイルタイプのドキュメンテーションが
含まれます。
HT ML O UT P UT
このドキュメンテーションは、カスケードスタイルシート (CSS) や一部では D HTML や Javascript をサ
ポートする HTML ブラウザで閲覧することができます。ブラウザ (例えば、Mozilla、Safari、
Konqueror、Internet Explorer 6) を html の i nd ex. html に向けます。
LaT eX O UT P UT
D oxygen は、Makefi l e を l atex ディレクトリに書き込み、Latex ドキュメンテーションの最初のコン
パイルを容易にします。これを行うには、最新の teTeX ディストリビューションを使用します。このディ
レクトリに含まれるものは、USE_P D FLAT EX が no に設定されているかどうかに依存します。設定されて
いる場合は、l atex ディレクトリで make と入力すると、refman. d vi が生成されます。これは、xd vi
で閲覧するか、refman. ps と入力して make ps に変換することができます。これにはd vi ps が必要で
あることに注意してください。
便利なコマンドは多くあります。make ps_2o n1 は 2 ページを 1 ページに印刷できます。また、
ghostscript インタプリターがインストールされていれば、make pd f コマンドで PD F に変換することも
できます。ほかには make pd f_2o n1 も有効なコマンドです。これを実行する際
は、P D F_HY P ER LINKS および USE_P D FLAT EX タグを yes に設定します。こうすること
で、Makefi l e には refman. pd f を直接ビルドするターゲットのみが含まれることになります。
R T F O UT P UT
このファイルは、RTF 出力を単一ファイルである refman. rtf と組み合わせることで Microsoft Word に
インポートするように設計されています。情報の中にはフィールドを使ってエンコードされるものもありま
158
⁠第9 章 ドキュメンテーションツール
すが、これはすべてを選択し (C T R L+ A または 編集 -> すべて選択)、右クリックをして to g g l e
fi el d s オプションをドロップダウンメニューから選ぶと表示することができます。
XML O UT P UT
xml ディレクトリへの出力は多くのファイルで構成され、各複合ファイルは i nd ex. xml に加えて
doxygen が収集したものです。XSLT スクリプトである co mbi ne. xsl t も、すべての XML ファイルを
単一ファイルに組み合わせるために作成されます。また、インデックスファイル用の i nd ex. xsd と複合
ファイル用の co mpo und . xsd という 2 つのXML スキーマファイルが作成され、これらは可能性のある要
素、それらの属性、それらの構成方法を説明します。
MAN P AG E O UT P UT
man ディレクトリからのドキュメンテーションは、manpath の man path に正確な man ディレクトリが
あることを確認した後で man プログラムを使って閲覧できます。man ページ形式の制限により、図や相互
参照、式といった情報は失われることに留意してください。
9.2.4 . ソースの文書化
ソースを文書化するには 3 つのステップがあります。
1. まず、EXT R AC T _ALL が no に設定され、警告が正確に生成され、ドキュメンテーションが適切
にビルドされることを確認します。これにより、doxygen は文書化されたメンバー、ファイル、ク
ラス、ネームスペースのドキュメンテーションを作成できます。
2. このドキュメンテーションを作成するには 2 つの方法があります。
特別な ドキュメンテーションブロック
このコメントブロックには追加のマーキングが含まれていることで D oxygen はこれがド
キュメンテーションの一部であることが分かり、C もしくは C++ で書かれています。簡
単な説明もしくは詳細な説明で構成されています。これらはどちらもオプションです。し
かし、 本文 の説明はオプションではありません。これがメソッドもしくは関数の本文で
見つかるすべてのコメントブロックを結びつけます。
注記
簡単もしくは詳細な説明は 1 つ以上が認められますが、順番が指定されないので
これは推奨されません。
以下で、コメントブロックを詳細な説明としてマークする方法を詳述します。
JavaD oc スタイルで 2 つのアスタリスク (*) で始まる C スタイルコメントブロック
/**
* ... documentation ...
*/
Qt スタイルを使用した C スタイルコメントブロック。もうひとつのアスタリスクの
代わりに感嘆符 (!) で構成されています。
/*!
* ... documentation ...
*/
159
開発者ガイド
ドキュメンテーション行の最初のアスタリスクは、なくても構いません。
C++ では最初と最後の行は空白でもよく、スラッシュ 3 つか、スラッシュ 2 つと感
嘆符を付けます。
///
/// ... documentation
///
または
//!
//! ... documentation ...
//!
別の方法としては、コメントブロックをより見やすくするために、アスタリスクもし
くはスラッシュの行を使うことができます。
/////////////////////////////////////////////////
/// ... documentation ...
/////////////////////////////////////////////////
または
/********************************************//**
* ... documentation ...
***********************************************/
通常のコメントブロックの最後にあるスラッシュ 2 つが特別なコメントブロックの開
始となっていることに注意してください。
ドキュメンテーションに簡単な説明を加えるには 3 つの方法があります。
簡単な説明を追加するには、コメントブロックの上に \bri ef を使います。この簡単
なセクションは段落の最後で終わり、それ以降の段落は詳細な説明になります。
/*! \brief brief documentation.
*
brief documentation.
*
* detailed documentation.
*/
JAVAD O C _AUT O BR IEF を yes に設定することで、簡単な説明は最初のドットとそ
の後の空白もしくは新たな行までしか続きません。このため、簡単な説明は単一行に
制限されています。
/** Brief documentation. Detailed documentation continues
* from here.
*/
これは、上記の 3 つのスラッシュ (///) のコメントブロックでも使用できます。
3 つ目のオプションは、特別な C++ スタイルコメントを使用して、1 行以上に及ばな
いようにします。
160
⁠第9 章 ドキュメンテーションツール
/// Brief documentation.
/** Detailed documentation. */
または
//! Brief documentation.
//! Detailed documentation //! starts here
上記の例の空白の行は、簡単な説明と詳細な説明を分けるために必要
で、JAVAD O C _AUT O BR IEF を no に設定する必要があります。
Qt スタイルを使って文書化された C++ コードの例は、『D oxygen documentation
website』 にあります。
ファイル、構造体、ユニオン、クラス、enum のメンバーの後にドキュメンテーション
を持ってくることも可能です。 < マーカーをコメントブロック \ の後に追加します。
int var; /*!< detailed description after the member */
Qt スタイルでは以下のようになります。
int var; /**< detailed description after the member */
または
int var; //!< detailed description after the member
//!<
または
int var; ///< detailed description after the member
///<
メンバーユースの後の簡単な説明は、以下のようになります。
int var; //!< brief description after the member
または
int var; ///< brief description after the member
これらの例と HTML の作成方法は 『D oxygen documentation website』 で確認できま
す。
他の場合でのドキュメンテーション
文書化しているコードの前にドキュメンテーションを置くのが望まれますが、特にファ
イルを文書化する場合などはファイルの前にドキュメンテーションを置くことは不可能
なので、異なる場所にしか置けない場合もあります。異なる場所に置くと情報の重複が発
生する可能性があるので、絶対に必要な場合以外はこれを避けることが最善策となりま
す。
161
開発者ガイド
これを行うには、構造コマンドをドキュメンテーションブロック内に持つことが重要に
なります。構造コマンドは JavaD oc では、バックスラッシュ (\) もしくはアットマーク
(@) で始まり、その後に 1 つ以上のパラメーターが続きます。
/*! \class Test
\brief A test class.
A more detailed description of class.
*/
上記の例では、\cl ass コマンドが使われています。これは、コメントブロックにクラ
ス 'Test' のドキュメンテーションが含まれていることを示しています。他の例では、
\struct: C 構造体を文書化します。
\uni o n: union を文書化します。
\enum: 列挙タイプを文書化します。
\fn: 関数を文書化します。
\var: 変数、typedef、enum 値を文書化します。
\d ef: #define を文書化します。
\typed ef: タイプ定義を文書化します。
\fi l e: ファイルを文書化します。
\namespace: ネームスペースを文書化します。
\packag e: Java パッケージを文書化します。
\i nterface: ID L インターフェイスを文書化します。
3. 次に、特別なドキュメンテーションブロックを HTML および / Latex 出力ディレクトリに書き込む
前に、解析します。以下の手順が含まれます。
a. 特別なコマンドを実行します。
b. 空白およびアスタリスク (*) をすべて削除します。
c. 空白の行を新たな段落として取り扱います。
d. 単語が対応するドキュメンテーションにリンク付されます。単語の前にパーセンテージ記
号 (% ) がある場合は、その記号を削除して単語を残します。
e. テキストに特定のパターンが見つかった場合は、メンバーへのリンクが作成されます。こ
の例は、D oxygen ドキュメンテーション Web サイトの 『automatic link generation
page』 にあります。
f. ドキュメンテーションが Latex についての場合は、HTML タグが Latex のタグに相当する
ものに変換されます。サポート対象の HTML タグは D oxygen ドキュメンテーション Web
サイトの 『HTML commands page』 にあります。
9.2.5. リソース
詳細情報は以下の D oxygen web サイトで見られます。
162
⁠第9 章 ドキュメンテーションツール
『D oxygen homepage』
『D oxygen introduction』
『D oxygen documentation』
『Output formats』
163
開発者ガイド
付録A 付録
A.1. mal l o pt
mal l o pt は、プログラムによる malloc メモリアロケータの動作の変更を可能にするライブラリコールで
す。
例A.1 アロケータヒューリスティック
アロケータには、昔からあるオブジェクトと最近できたオブジェクトを見分けるヒューリスティックが
あります。前者に対しては mmap を割り当てようとし、後者には sbrk を割り当てようとします。
これらのヒューリスティックを上書きするには、M_MMAP _T HR ESHO LD を設定します。
マルチスレッドのアプリケーションでは、アロケータは arenas にある既存のロック競合に対応して複数の
arenas を作成します。これより、いくつかのマルチスレッドのアプリケーションでは、メモリ使用量が増
えるという代わりに、パフォーマンスが大幅に改善する場合があります。これをコントロールしておくに
は、mal l o pt インターフェイスを使って作成可能な arenas 数を制限します。
アロケータには、作成できる arenas の数に限りがあります。32 ビットのターゲットの場合、2 * # のコア
arenas を作成します。64 ビットターゲットの場合、8 * # コア arenas を作成します。mal l o pt を使う
と、開発者はこれらの制限を無効に出来ます。
例A.2 mal l o pt
9 以上の arenas が作成されないようにするには、以下のライブラリコールを発行します。
mallopt (M_ARENA_MAX, 8);
mal l o pt の最初の引数は、以下のものが可能です。
M_MXFAST
M_TRIM_THRESHOLD
M_TOP_PAD
M_MMAP_THRESHOLD
M_MMAP_MAX
M_CHECK_ACTION
M_PERTURB
M_ARENA_TEST
M_ARENA_MAX
上記の引数の特定の定義は、http://www.makelinux.net/man/3/M/mallopt で確認できます。
mal l o c_tri m
164
⁠付録A 付録
mal l o c_tri m は、アロケータに未使用のメモリをオペレーティングシステムに戻すように要求するライ
ブラリコールです。これは、オブジェクトが解放済みの場合、通常は自動で行われます。しかし、小さいオ
ブジェクトを解放している場合、 g l i bc がメモリを即座にオペレーティングシステムに戻さないこともあ
ります。この理由は、メモリをオペレーティングシステムからリリースさせて割り当てるのは高くつき、空
きメモリは来たるべきメモリ割り当て要求を満たすために使用できるからです。
mal l o c_stats
mal l o c_stats は、アロケータの内部状態を std err にダンプするために使用されます。mal l i nfo は
これに似ていますが、代わりに状態を構造体に置きます。
追加情報
mal l o pt に関する追加情報は http://www.makelinux.net/man/3/M/mallopt および
http://www.gnu.org/software/libc/manual/html_node/Malloc-Tunable-Parameters.html にあります。
165
開発者ガイド
付録B 改訂履歴
改訂 1- 2.3
Fri Au g 21 2015
ソート番号を更新し、ドキュメントを再ビルドします。
C h est er C h en g
改訂 1- 2
リンク切れを修正
Jacq u elyn n East
Wed Ju n 11 2014
改訂 1- 0
Mo n Ju n 2 2014
7.0 GA リリース向けバージョン
Jacq u elyn n East
改訂 0- 33
Wed May 21 2014
oprofile セクションのバグに URL を追加 (BZ #795987)
Jacq u elyn n East
改訂 0- 32
Mo n Ap r 12 2014
スタイル変更のための再ビルド
Jacq u elyn n East
改訂 0- 21
T u e Ap r 8 2014
Jacq u elyn n East
java セクションに新機能を追加 (BZ #795590)
テクノロジープレビューのステータスを反映するよう btrfs の重要な注記を編集 (BZ #1025572)
改訂 0- 20
Mo n Ap r 7 2014
Jacq u elyn n East
最新の JD K バージョンで RHEL7 が常に更新されている文を追加 (BZ #911433)
SystemTap の章を更新 (BZ #795980)
GCC および D TS についてのセクションを更新 (BZ #1032615)
GCC パワーデフォルトを追加 (BZ #1009827)
改訂 0- 18
Fri Ap r 4 2014
Lau ra B ailey
operf コマンドを OProfile セクションに追加およびマイナー修正 (BZ #1048636)
改訂 0- 17
T h u Ap r 3 2014
Jacq u elyn n East
libStorageMgmt ライブラリー用のプラグインの作成に関するセクションを追加 (BZ #795222)
改訂 0- 16
Fri Mar 14 2014
D TS の章を更新 (BZ #1026417)
Jacq u elyn n East
改訂 0- 15
Mo n Feb 3 2014
perl セクションで若干の編集 (BZ #795583)
Jacq u elyn n East
改訂 0- 13
Fri Jan 10 2014
oProfile セクションを更新 (BZ #795987)
Jacq u elyn n East
改訂 0- 12
Wed N o v 27 2013
Jacq u elyn n East
python セクションを Python 2.7 に更新 (BZ #795585)
perl セクションを Perl 5.16 に更新 (BZ #795583)
ruby セクションを Ruby 1.9 に更新 (BZ #795629 および BZ #795631)
改訂 0- 9
ベータ前のビルド
Wed N o v 27 2013
Jacq u elyn n East
改訂 0- 7
Wed O ct 2 2013
Jacq u elyn n East
166
⁠索引
/bin、/sbin、/lib、/lib64 への参照を /usr 下にネスト化するよう変更 (BZ #952479)
改訂 0- 6
Mo n Sep 23 2013
memcpy 失敗の可能性に関する重要な注記を追加 (BZ #836490)
Jacq u elyn n East
改訂 0- 5
Wed Sep 11 2013
Red Hat Enterprise Linux 7.0 用にブランチ
Jacq u elyn n East
索引
シンボル
.sp ec f ile
- specfile Editor
- コンパイルおよびビルド,Eclipse RPM ビルディング, Eclipse Built-in Specfile
Editor
アプリケーションバイナリインターフェース ( 参照 AB I)
アーキテクチャ、K D E4
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
インストール
- debuginfo-packages
- デバッグ, D ebuginfo パッケージのインストール
インターフェース ( C LI およびマシン)
- GNU デバッガー, GD B の代替ユーザーインターフェース
インデックス化
- libhover
- ライブラリおよびランタイムサポート,libhover プラグイン
ウィジェットツールキット
- Qt
- ライブラリおよびランタイムのサポート,Qt
カーネル情報パッケージ
- プロファイル
- SystemTap, SystemTap
キーボードショートカットの設定
- 統合開発環境
- Eclipse, キーボードショートカット
キーボードショートカットメニュー
- 統合開発環境
- Eclipse, キーボードショートカット
クイックアクセスメニュー
- 統合開発環境
167
開発者ガイド
- Eclipse, クイックアクセスメニュー
コマンド
- ツール
- Performance Counters for Linux (PCL) ツールおよび perf, Perf ツールコマン
ド
- プロファイル
- Valgrind, Valgrind ツール
- 基本
- GNU デバッガー, 単純な GD B
コンテンツ ( ヘルプコンテンツ)
- ヘルプシステム
- Eclipse, Eclipse のドキュメンテーション
コンパイルおよびビルド
- Autotools, Autotools
- Eclipse 用プラグイン, Eclipse 用の Autotools プラグイン
- テンプレート (サポート対象), Eclipse 用の Autotools プラグイン
- ドキュメンテーション, Autotools のドキュメンテーション
- 一般的に使用されるコマンド, Autotools
- 設定スクリプト, 設定スクリプト
- build-id, build-id バイナリの一意の ID
- Eclipse の CD T, Eclipse の CD T
- Autotools プロジェクト, Autotools プロジェクト
- Managed Make プロジェクト, Managed Make プロジェクト
- Standard Make プロジェクト, Standard Make プロジェクト
- GNU コンパイラーコレクション, GNU コンパイラーコレクション (GCC)
- specfile Editor, Eclipse RPM ビルディング, Eclipse Built-in Specfile Editor
- Eclipse 用プラグイン, Eclipse RPM ビルディング, Eclipse Built-in Specfile
Editor
- 分散コンパイル, 分散コンパイル
- 必要なパッケージ, 分散コンパイル
- 概要, コンパイルおよびビルド
コンパイルサーバー
- SystemTap, SystemTap コンパイルサーバー
コンパイルサーバー接続の承認
- SSL および認証管理
- SystemTap, コンパイルサーバー接続の承認
サブシステム ( PC L)
- プロファイル
- Performance Counters for Linux (PCL) ツールおよび perf, Performance
Counters for Linux (PCL) ツールおよび perf
サブパッケージ
- Boost
- ライブラリおよびランタイムサポート,Boost
168
⁠索引
サポート対象のテンプレート
- Autotools
- コンパイルおよびビルド,Eclipse 用の Autotools プラグイン
スクリプト ( Syst emT ap スクリプト)
- プロファイル
- SystemTap, SystemTap
スレッドおよびスレッド化されたデバッグ
- GNU デバッガー, 個別スレッドのデバッグ
ツール
-
GNU デバッガー, 単純な GD B
OProfile, OProfile のツール
Performance Counters for Linux (PCL) ツールおよび perf, Perf ツールコマンド
Valgrind, Valgrind ツール
プロファイル
- Valgrind, Valgrind ツール
ツールバーの表示
- 統合開発環境
- Eclipse, パースペクティブのカスタマイズ
テンプレート ( サポート対象)
- Autotools
- コンパイルおよびビルド,Eclipse 用の Autotools プラグイン
デバッグ
- debuginfo-packages, D ebuginfo パッケージのインストール
- インストール, D ebuginfo パッケージのインストール
- Eclipse による C/C++ アプリケーションのデバッグ, Eclipse による C/C++ アプリケー
ションのデバッグ
- GNU デバッガー, GD B
- GD B, GD B
- 基本的なメカニズム, GD B
- 要件, GD B
- Python pretty-printer, Python Pretty-Printer
- pretty-printer, Python Pretty-Printer
- デバッグ出力 (フォーマット済み), Python Pretty-Printer
- ドキュメンテーション, Python Pretty-Printer
- 利点, Python Pretty-Printer
- variable tracking at assignments (VTA), Variable Tracking at Assignments
- 概要, デバッグ
デバッグ出力 ( フォーマット済み)
- Python pretty-printer
- デバッグ, Python Pretty-Printer
デフォルト
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
169
開発者ガイド
ドキュメンテーション
- Autotools
- コンパイルおよびビルド,Autotools のドキュメンテーション
- Boost
- ライブラリおよびランタイムサポート,Boost ドキュメンテーション
- D oxygen, D oxygen
- D oxygen の実行, D oxygen の実行
- ソースの文書化, ソースの文書化
- リソース, リソース
- 使用開始, 使用開始
- 対応の出力および言語, D oxygen 対応の出力および言語
- GNU C++ 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリドキュメン
テーション
- GNU デバッガー, GD B ドキュメンテーション
- Java
- ライブラリおよびランタイムサポート,Java ドキュメンテーション
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,kdelibs ドキュメンテーション
- OProfile
- プロファイル, OProfile のドキュメンテーション
- Perl
- ライブラリおよびランタイムサポート,Perl のドキュメンテーション
- Python
- ライブラリおよびランタイムサポート,Python ドキュメンテーション
- Python pretty-printer
- デバッグ, Python Pretty-Printer
- Qt
- ライブラリおよびランタイムサポート,Qt ライブラリドキュメンテーション
- Ruby
- ライブラリおよびランタイムサポート,Ruby ドキュメンテーション
- SystemTap
- プロファイル, SystemTap のドキュメンテーション
- Valgrind
- プロファイル, Valgrind のドキュメンテーション
- プロファイル
- ftrace, ftrace のドキュメンテーション
ドキュメンテーションツール, ドキュメンテーションツール
- Publican, Publican
- Publican のドキュメンテーション, ドキュメンテーション
- Web サイトのビルド, Web サイトのビルド
- コマンド, コマンド
- ドキュメンテーションにメディアを追加する, ドキュメンテーションにメディ
アを追加する
170
⁠索引
-
ドキュメントのビルド, ドキュメントのビルド
ファイル, ファイル
ブランド, ブランド
新規ドキュメントの作成, 新規ドキュメントの作成
発行物のパッケージ, 発行物のパッケージ
パースペクティブ
- 統合開発環境
- Eclipse, Eclipse ユーザーインターフェイス
パースペクティブメニューのカスタマイズ
- 統合開発環境
- Eclipse, パースペクティブのカスタマイズ
ビルド
- コンパイルおよびビルド,コンパイルおよびビルド
フォークされる実行
- GNU デバッガー, フォークされる実行
フォーマット済みデバッグ出力
- Python pretty-printer
- デバッグ, Python Pretty-Printer
フレームワーク ( f t race)
- プロファイル
- ftrace, ftrace
ブレークポイント ( 条件付き)
- GNU デバッガー, 条件付きブレークポイント
プロジェクト
- Eclipse, Eclipse プロジェクトの開始
プロファイル
- Eclipse, Eclipse 用の Valgrind プラグイン
- Profile As, Eclipse 用の Valgrind プラグイン
- Profile Configuration Menu (プロファイル設定メニュー), Eclipse 用の
Valgrind プラグイン
- ftrace, ftrace
- OProfile, OProfile
- oprofiled, OProfile
- perf と oprofile の競合, OProfile の使用, Perf の使用方法
- Performance Counters for Linux (PCL) ツールおよび perf, Performance Counters for
Linux (PCL) ツールおよび perf
- SystemTap, SystemTap
- Valgrind, Valgrind
- 概要, プロファイル
プロファル
- SystemTap
- D ynInst, SystemTap 2.0 での D ynInst
171
開発者ガイド
ヘルプシステム
- Eclipse, Eclipse のドキュメンテーション
ホスト ( コンパイルサーバーホスト)
- コンパイルサーバー
- SystemTap, SystemTap コンパイルサーバー
ホバーヘルプ
- libhover
- ライブラリおよびランタイムサポート,設定および使用方法
マシンインターフェース
- GNU デバッガー, GD B の代替ユーザーインターフェース
メカニズム
- GNU デバッガー
- デバッグ, GD B
メタパッケージ
- Boost
- ライブラリおよびランタイムサポート,Boost
メニュー ( ヘルプメニュー)
- ヘルプシステム
- Eclipse, Eclipse のドキュメンテーション
メニュー ( メインメニュー)
- 統合開発環境
- Eclipse, Eclipse ユーザーインターフェイス
モジュールのインストール
- Perl
- ライブラリおよびランタイムサポート,インストール
モジュール署名 ( コンパイルサーバーの承認)
- SSL および認証管理
- SystemTap, コンパイルサーバーのモジュール署名の承認 (特権のないユーザー)
ユーザーインターフェイス
- 統合開発環境
- Eclipse, Eclipse ユーザーインターフェイス
ライブラリ
- ランタイムのサポート, ライブラリおよびランタイムのサポート
ライブラリおよびランタイムのサポート
- Boost, Boost
- boost-doc, Boost ドキュメンテーション
- message passing interface (MPI), Boost
- MPICH2, Boost
- Open MPI, Boost
- サブパッケージ, Boost
- ドキュメンテーション, Boost ドキュメンテーション
- メタパッケージ, Boost
172
⁠索引
- 新規ライブラリ, Boost 更新
- 更新, Boost 更新
- C++ 標準ライブラリ、GNU, GNU C++ 標準ライブラリ
- compat-glibc, compat-glibc
- GNOME の電源管理, GNOME の電源管理
- gnome-power-manager, GNOME の電源管理
- GNU C++ 標準ライブラリ, GNU C++ 標準ライブラリ
- C++0x、サポート強化, GNU C++ 標準ライブラリ更新
- ISO 14482 標準 C++ ライブラリ, GNU C++ 標準ライブラリ
- ISO C++ TR1 要素、サポート強化, GNU C++ 標準ライブラリ更新
- libstdc++-devel, GNU C++ 標準ライブラリ
- libstdc++-docs, GNU C++ 標準ライブラリドキュメンテーション
- ドキュメンテーション, GNU C++ 標準ライブラリドキュメンテーション
- 更新, GNU C++ 標準ライブラリ更新
- 標準テンプレートライブラリ, GNU C++ 標準ライブラリ
- Java, Java
- ドキュメンテーション, Java ドキュメンテーション
- KD E 開発フレームワーク, KD E 開発フレームワーク
- Akonadi, KD E4 アーキテクチャ
- KD E4 アーキテクチャ, KD E4 アーキテクチャ
- kdelibs-devel, KD E 開発フレームワーク
- KHTML, KD E4 アーキテクチャ
- KIO, KD E4 アーキテクチャ
- KJS, KD E4 アーキテクチャ
- KNewStuff2, KD E4 アーキテクチャ
- KXMLGUI, KD E4 アーキテクチャ
- Phonon, KD E4 アーキテクチャ
- Plasma, KD E4 アーキテクチャ
- Solid, KD E4 アーキテクチャ
- Sonnet, KD E4 アーキテクチャ
- Strigi, KD E4 アーキテクチャ
- Telepathy, KD E4 アーキテクチャ
- ドキュメンテーション, kdelibs ドキュメンテーション
- libstdc++, GNU C++ 標準ライブラリ
- Perl, Perl
- ドキュメンテーション, Perl のドキュメンテーション
- モジュールのインストール, インストール
- 更新, Perl 更新
- Python, Python
- ドキュメンテーション, Python ドキュメンテーション
- 更新, Python 更新
- Qt, Qt
-
meta object compiler (MOC), Qt
Qt Creator, Qt Creator
qt-doc, Qt ライブラリドキュメンテーション
ウィジェットツールキット, Qt
ドキュメンテーション, Qt ライブラリドキュメンテーション
更新, Qt 更新
- Ruby, Ruby
- ruby-devel, Ruby
173
開発者ガイド
- ドキュメンテーション, Ruby ドキュメンテーション
- 互換性, 互換性
- 概要, ライブラリおよびランタイムのサポート
ライブラリおよびランタイムの詳細
- NSS 共有データベース, NSS 共有データベース
- ドキュメンテーション, NSS 共有データベース のドキュメンテーション
- 後方互換性, 後方互換性
ライブラリおよびランタイムサポート
- libhover
- Code Completion, 設定および使用方法
- インデックス化, libhover プラグイン
- ホバーヘルプ, 設定および使用方法
- 使用方法, 設定および使用方法
ランタイムのサポート
- libraries, ライブラリおよびランタイムのサポート
リスト
- ツール
- Performance Counters for Linux (PCL) ツールおよび perf, Perf ツールコマン
ド
レポート
- ツール
- Performance Counters for Linux (PCL) ツールおよび perf, Perf ツールコマン
ド
ワークスペース ( 概要)
- プロジェクト
- Eclipse, Eclipse プロジェクトの開始
ワークベンチ
- 統合開発環境
- Eclipse, Eclipse ユーザーインターフェイス
一般的に使用されるコマンド
- Autotools
- コンパイルおよびビルド,Autotools
互換性
- GNU コンパイラーコレクション, 言語の互換性, 互換性の変更点, Fortran 2003 の互換性,
Fortran 2008 の互換性, Fortran 77 の互換性, ABI の互換性, デバッグ機能の互換性, 他の互
換性
- libraries and runtime support, 互換性
使用方法
- libhover
- ライブラリおよびランタイムサポート,設定および使用方法
- Performance Counters for Linux (PCL) ツールおよび perf, Perf の使用方法
- プロファイル
- ftrace, ftrace の使用方法
174
⁠索引
使用法
- GNU デバッガー, GD B の実行
- 基本, 単純な GD B
- Valgrind
- プロファイル, Valgrind の使用
- プロファイル
- OProfile, OProfile の使用
分散コンパイル
- コンパイルおよびビルド,分散コンパイル
利点
- Python pretty-printer
- デバッグ, Python Pretty-Printer
動的ヘルプ
- ヘルプシステム
- Eclipse, Eclipse のドキュメンテーション
協同作業, 協同作業
- Apache Subversion (SVN), Apache Subversion (SVN)
- SVN リポジトリ, SVN リポジトリ
- インストール, インストール
- データのインポート, データのインポート
- ドキュメンテーション, SVN ドキュメンテーション
- 作業コピー, 作業コピー
- 変更のコミット, 変更のコミット
- Concurrent Versions System (CVS), Concurrent Versions System (CVS)
基本
- GNU デバッガー, 単純な GD B
基本コマンド
- 基本
- GNU デバッガー, 単純な GD B
基本的なメカニズム
- GNU デバッガー
- デバッグ, GD B
実行 ( フォークされる)
- GNU デバッガー, フォークされる実行
実行可能ファイルの停止
- 基本
- GNU デバッガー, 単純な GD B
実行可能ファイルの状態の検査
- 基本
- GNU デバッガー, 単純な GD B
実行可能ファイルの開始
175
開発者ガイド
- 基本
- GNU デバッガー, 単純な GD B
導入
- Eclipse, Eclipse の開発環境
必要なパッケージ
- コンパイルおよびビルド,分散コンパイル
- プロファイル
- SystemTap, SystemTap
技術的概要
- プロジェクト
- Eclipse, Eclipse プロジェクトの開始
接続の承認 ( コンパイルサーバー)
- SSL および認証管理
- SystemTap, コンパイルサーバー接続の承認
新規ライブラリ
- Boost
- ライブラリおよびランタイムサポート,Boost 更新
新規拡張子
- GNU C++ 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ更新
更新
- Boost
- ライブラリおよびランタイムサポート,Boost 更新
- GNU C++ 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ更新
- Perl
- ライブラリおよびランタイムサポート,Perl 更新
- Python
- ライブラリおよびランタイムサポート,Python 更新
- Qt
- ライブラリおよびランタイムサポート,Qt 更新
条件付きブレークポイント
- GNU デバッガー, 条件付きブレークポイント
概要
- コンパイルおよびビルド,コンパイルおよびビルド
- デバッグ, デバッグ
- プロファイル, プロファイル
- SystemTap, SystemTap
- ライブラリおよびランタイムのサポート,ライブラリおよびランタイムのサポート
標準テンプレートライブラリ
- GNU C++ 標準ライブラリ
176
⁠索引
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ
機能トレーサー
- プロファイル
- ftrace, ftrace
特権のないユーザー
- 特権のないユーザーのサポート
- SystemTap, 特権のないユーザーに対する SystemTap のサポート
特権のないユーザーのサポート
- SystemTap, 特権のないユーザーに対する SystemTap のサポート
種類および環境
- GNU デバッガー, GD B の代替ユーザーインターフェース
統合開発環境
- Eclipse, Eclipse ユーザーインターフェイス
署名済みのモジュール
- 特権のないユーザーのサポート
- SystemTap, 特権のないユーザーに対する SystemTap のサポート
署名済みモジュール
- SSL および認証管理
- SystemTap, コンパイルサーバーのモジュール署名の承認 (特権のないユーザー)
自動承認
- SSL および認証管理
- SystemTap, 自動承認
要件
- GNU デバッガー
- デバッグ, GD B
記録
- ツール
- Performance Counters for Linux (PCL) ツールおよび perf, Perf ツールコマン
ド
設定
- libhover
- ライブラリおよびランタイムサポート,設定および使用方法
設定スクリプト
- Autotools
- コンパイルおよびビルド,設定スクリプト
認証管理
- SSL および認証管理
- SystemTap, SSL および認証管理
追跡されたコメント
- ユーザーインターフェイス
177
開発者ガイド
- Eclipse, Eclipse ユーザーインターフェイス
A
AB I
- 互換性, ABI の互換性
ad d r2lin e
- 機能, 新しい機能
Ako n ad i
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
Ap ach e Su b versio n ( SVN )
- 協同作業, Apache Subversion (SVN)
- SVN リポジトリ, SVN リポジトリ
- インストール, インストール
- データのインポート, データのインポート
- ドキュメンテーション, SVN ドキュメンテーション
- 作業コピー, 作業コピー
- 変更のコミット, 変更のコミット
Au t o t o o ls
- コンパイルおよびビルド,Autotools
B
b ackt race
- ツール
- GNU デバッガー, 単純な GD B
bfd
- 機能, 新しい機能
b in u t ils
- バージョン, Red Hat D eveloper Toolset の機能
B o o st
- ライブラリおよびランタイムのサポート,Boost
b o o st - d o c
- Boost
- ライブラリおよびランタイムサポート,Boost ドキュメンテーション
b reakp o in t
- 基本
- GNU デバッガー, 単純な GD B
b u ild - id
- コンパイルおよびビルド,build-id バイナリの一意の ID
C
C + + 標準ライブラリ、G N U
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ
178
⁠索引
C + + 0x、サポート強化
- GNU C++ 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ更新
C + + 11 ( 参照 G N U コンパイラーコレクション)
C /C + + ソースコード
- Eclipse, Eclipse での C/C++ ソースコードの編集
C 11 ( 参照 G N U コンパイラーコレクション)
cach eg rin d
- ツール
- Valgrind, Valgrind ツール
callg rin d
- ツール
- Valgrind, Valgrind ツール
C o d e C o mp let io n
- libhover
- ライブラリおよびランタイムサポート,設定および使用方法
C o mman d G ro u p Availab ilit y タブ
- 統合開発環境
- Eclipse, パースペクティブのカスタマイズ
co mp at - g lib c
- ライブラリおよびランタイムのサポート,compat-glibc
C o n cu rren t Versio n s Syst em ( C VS)
- 協同作業, Concurrent Versions System (CVS)
C o n so le View
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
co n t in u e
- ツール
- GNU デバッガー, 単純な GD B
D
d eb u g f s ファイルシステム
- プロファイル
- ftrace, ftrace
d eb u g in f o - p ackag es
- デバッグ, D ebuginfo パッケージのインストール
D o xyg en
- ドキュメンテーション, D oxygen
- D oxygen の実行, D oxygen の実行
- ソースの文書化, ソースの文書化
- リソース, リソース
- 使用開始, 使用開始
179
開発者ガイド
- 対応の出力および言語, D oxygen 対応の出力および言語
d wz
- バージョン, Red Hat D eveloper Toolset の機能
D yn in st
- バージョン, Red Hat D eveloper Toolset の機能
E
Eclip se
-
C/C++ ソースコード, Eclipse での C/C++ ソースコードの編集
Java 開発, Eclipse での Java ソースコードの編集
libhover pluプラグイン, libhover プラグイン
RPM ビルディング, Eclipse RPM ビルディング
クイックアクセスメニュー, クイックアクセスメニュー
ドキュメンテーション, Eclipse のドキュメンテーション
バージョン, Red Hat D eveloper Toolset の機能
プロジェクト, Eclipse プロジェクトの開始
- New Project ウィザード, Eclipse プロジェクトの開始
- Workspace Launcher, Eclipse プロジェクトの開始
- ワークスペース (概要), Eclipse プロジェクトの開始
- 技術的概要, Eclipse プロジェクトの開始
- プロファイル, Eclipse 用の Valgrind プラグイン
- ヘルプシステム, Eclipse のドキュメンテーション
- Workbench User Guide, Eclipse のドキュメンテーション
- コンテンツ (ヘルプコンテンツ),Eclipse のドキュメンテーション
- メニュー (ヘルプメニュー), Eclipse のドキュメンテーション
- 動的ヘルプ, Eclipse のドキュメンテーション
- ユーザーインターフェイス, Eclipse ユーザーインターフェイス
- Console View, Eclipse ユーザーインターフェイス
- Editor, Eclipse ユーザーインターフェイス
- Outline Window, Eclipse ユーザーインターフェイス
- Problems View, Eclipse ユーザーインターフェイス
- Project Explorer, Eclipse ユーザーインターフェイス
- quick fix (Problems View), Eclipse ユーザーインターフェイス
- Tasks Properties, Eclipse ユーザーインターフェイス
- Tasks View, Eclipse ユーザーインターフェイス
- View Menu (ボタン), Eclipse ユーザーインターフェイス
- デフォルト, Eclipse ユーザーインターフェイス
- 追跡されたコメント, Eclipse ユーザーインターフェイス
- 導入, Eclipse の開発環境
- 統合開発環境, Eclipse ユーザーインターフェイス
- Command Group Availability タブ, パースペクティブのカスタマイズ
- ID E (統合開発環境), Eclipse ユーザーインターフェイス
- Menu Visibility タブ, パースペクティブのカスタマイズ
- Shortcuts タブ, パースペクティブのカスタマイズ
- キーボードショートカットの設定, キーボードショートカット
- キーボードショートカットメニュー, キーボードショートカット
- クイックアクセスメニュー, クイックアクセスメニュー
- ツールバーの表示, パースペクティブのカスタマイズ
- パースペクティブ, Eclipse ユーザーインターフェイス
- パースペクティブメニューのカスタマイズ, パースペクティブのカスタマイズ
- メニュー (メインメニュー) , Eclipse ユーザーインターフェイス
180
⁠索引
- ユーザーインターフェイス, Eclipse ユーザーインターフェイス
- ワークベンチ, Eclipse ユーザーインターフェイス
Eclip se による C /C + + アプリケーションのデバッグ
- デバッグ, Eclipse による C/C++ アプリケーションのデバッグ
Eclip se の C D T
- コンパイルおよびビルド,Eclipse の CD T
- Autotools プロジェクト, Autotools プロジェクト
- Managed Make プロジェクト, Managed Make プロジェクト
- Standard Make プロジェクト, Standard Make プロジェクト
Eclip se 用のプラグイン
- プロファイル
- Valgrind, Eclipse 用の Valgrind プラグイン
Eclip se 用プラグイン
- Autotools
- コンパイルおよびビルド,Eclipse 用の Autotools プラグイン
- specfile Editor
- コンパイルおよびビルド,Eclipse RPM ビルディング, Eclipse Built-in Specfile
Editor
Ed it o r
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
elf ed it
- 機能, 新しい機能
elf u t ils
- バージョン, Red Hat D eveloper Toolset の機能
F
f in ish
- ツール
- GNU デバッガー, 単純な GD B
f t race
- プロファイル, ftrace
- debugfs ファイルシステム, ftrace
- ドキュメンテーション, ftrace のドキュメンテーション
- フレームワーク (ftrace), ftrace
- 使用方法, ftrace の使用方法
G
g cc
- GNU コンパイラーコレクション
- コンパイルおよびビルド,GNU コンパイラーコレクション (GCC)
G DB
- GNU デバッガー
- デバッグ, GD B
181
開発者ガイド
G it
- バージョン, Red Hat D eveloper Toolset の機能
G N O ME の電源管理
- ライブラリおよびランタイムのサポート,GNOME の電源管理
g n o me- p o wer- man ag er
- GNOME の電源管理
- ライブラリおよびランタイムサポート,GNOME の電源管理
G N U C + + 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ
G N U C o mp iler C o llect io n
- バージョン, Red Hat D eveloper Toolset の機能
G N U D eb u g g er
- バージョン, Red Hat D eveloper Toolset の機能
G N U コンパイラーコレクション
- コンパイルおよびビルド,GNU コンパイラーコレクション (GCC)
- 互換性, 言語の互換性, 互換性の変更点, Fortran 2003 の互換性, Fortran 2008 の互換性,
Fortran 77 の互換性, ABI の互換性, デバッグ機能の互換性, 他の互換性
- 機能, ステータスおよび機能, 新しい機能, Fortran 2003 の機能, Fortran 2008 の機能
G N U デバッガー
- インターフェース (CLI およびマシン), GD B の代替ユーザーインターフェース
- スレッドおよびスレッド化されたデバッグ, 個別スレッドのデバッグ
- ツール, 単純な GD B
- backtrace, 単純な GD B
- continue, 単純な GD B
- finish, 単純な GD B
- help, 単純な GD B
- list, 単純な GD B
- next, 単純な GD B
- print, 単純な GD B
- quit, 単純な GD B
- step, 単純な GD B
-
デバッグ, GD B
ドキュメンテーション, GD B ドキュメンテーション
フォークされる実行, フォークされる実行
使用法, GD B の実行
- Hello World プログラムのデバッグ, GD B の実行
- 基本, 単純な GD B
- breakpoint, 単純な GD B
- コマンド, 単純な GD B
- 実行可能ファイルの停止, 単純な GD B
- 実行可能ファイルの状態の検査, 単純な GD B
- 実行可能ファイルの開始, 単純な GD B
- 実行 (フォークされる), フォークされる実行
- 条件付きブレークポイント, 条件付きブレークポイント
- 種類および環境, GD B の代替ユーザーインターフェース
182
⁠索引
g p ro f
- 機能, 新しい機能
H
h elg rin d
- ツール
- Valgrind, Valgrind ツール
H ello Wo rld プログラムのデバッグ
- 使用法
- GNU デバッガー, GD B の実行
h elp
- ツール
- GNU デバッガー, 単純な GD B
I
ID E ( 統合開発環境)
- 統合開発環境
- Eclipse, Eclipse ユーザーインターフェイス
IISO 14 4 82 標準 C + + ライブラリ
- GNU C++ 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ
ISO C + + T R 1 要素、サポート強化
- GNU C++ 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ更新
J
Java
- ライブラリおよびランタイムのサポート,Java
Java 開発
- Eclipse, Eclipse での Java ソースコードの編集
K
K D E 開発フレームワーク
- ライブラリおよびランタイムのサポート,KD E 開発フレームワーク
K D E4 アーキテクチャ
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
kd elib s- d evel
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E 開発フレームワーク
K H T ML
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
K IO
- KD E 開発フレームワーク
183
開発者ガイド
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
K JS
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
K N ewSt u f f 2
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
K XMLG U I
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
L
lib st d c+ +
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ
lib st d c+ + - d evel
- GNU C++ 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリ
lib st d c+ + - d o cs
- GNU C++ 標準ライブラリ
- ライブラリおよびランタイムのサポート,GNU C++ 標準ライブラリドキュメン
テーション
list
- ツール
- GNU デバッガー, 単純な GD B
M
mallo p t , mallo p t
massif
- ツール
- Valgrind, Valgrind ツール
memch eck
- ツール
- Valgrind, Valgrind ツール
memst o mp
- バージョン, Red Hat D eveloper Toolset の機能
Men u Visib ilit y タブ
- 統合開発環境
- Eclipse, パースペクティブのカスタマイズ
messag e p assin g in t erf ace ( MPI)
- Boost
- ライブラリおよびランタイムサポート,Boost
met a o b ject co mp iler ( MO C )
- Qt
184
⁠索引
- ライブラリおよびランタイムのサポート,Qt
MPIC H 2
- Boost
- ライブラリおよびランタイムサポート,Boost
N
N ew Pro ject ウィザード
- プロジェクト
- Eclipse, Eclipse プロジェクトの開始
n ext
- ツール
- GNU デバッガー, 単純な GD B
N SS 共有データベース
- ライブラリおよびランタイムの詳細,NSS 共有データベース
- ドキュメンテーション, NSS 共有データベース のドキュメンテーション
- 後方互換性, 後方互換性
O
o b jco p y
- 機能, 新しい機能
o b jd u mp
- features, 新しい機能
- 機能, 新しい機能
o p an n o t at e
- ツール
- OProfile, OProfile のツール
o p arch ive
- ツール
- OProfile, OProfile のツール
o p co n t ro l
- ツール
- OProfile, OProfile のツール
O p en MPI
- Boost
- ライブラリおよびランタイムサポート,Boost
o p erf
- ツール
- OProfile, OProfile のツール
o p g p ro f
- ツール
- OProfile, OProfile のツール
o p rep o rt
- ツール
185
開発者ガイド
- OProfile, OProfile のツール
O Pro f ile
- ツール, OProfile のツール
- opannotate, OProfile のツール
- oparchive, OProfile のツール
- opcontrol, OProfile のツール
- operf, OProfile のツール
- opgprof, OProfile のツール
- opreport, OProfile のツール
- バージョン, Red Hat D eveloper Toolset の機能
- プロファイル, OProfile
- ドキュメンテーション, OProfile のドキュメンテーション
- 使用法, OProfile の使用
o p ro f iled
- OProfile
- プロファイル, OProfile
O u t lin e Win d o w
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
P
p erf
- プロファイル
- Performance Counters for Linux (PCL) ツールおよび perf, Performance
Counters for Linux (PCL) ツールおよび perf
- 使用方法
- Performance Counters for Linux (PCL) ツールおよび perf, Perf の使用方法
Perf o rman ce C o u n t ers f o r Lin u x ( PC L) ツールおよび p erf
- ツール, Perf ツールコマンド
- コマンド, Perf ツールコマンド
- リスト, Perf ツールコマンド
- レポート, Perf ツールコマンド
- 記録, Perf ツールコマンド
- プロファイル, Performance Counters for Linux (PCL) ツールおよび perf
- サブシステム (PCL), Performance Counters for Linux (PCL) ツールおよび
perf
- 使用方法, Perf の使用方法
- perf, Perf の使用方法
Perl
- ライブラリおよびランタイムのサポート,Perl
Ph o n o n
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
Plasma
- KD E 開発フレームワーク
186
⁠索引
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
p ret t y- p rin t er
- Python pretty-printer
- デバッグ, Python Pretty-Printer
p rin t
- ツール
- GNU デバッガー, 単純な GD B
Pro b lems View
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
Pro f ile As
- Eclipse
- プロファイル, Eclipse 用の Valgrind プラグイン
Pro f ile C o n f ig u rat io n Men u ( プロファイル設定メニュー)
- Eclipse
- プロファイル, Eclipse 用の Valgrind プラグイン
Pro ject Exp lo rer
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
Pu b lican
- ドキュメンテーションツール, Publican
- Publican のドキュメンテーション, ドキュメンテーション
- Web サイトのビルド, Web サイトのビルド
- コマンド, コマンド
- ドキュメンテーションにメディアを追加する, ドキュメンテーションにメディ
アを追加する
- ドキュメントのビルド, ドキュメントのビルド
- ファイル, ファイル
- ブランド, ブランド
- 新規ドキュメントの作成, 新規ドキュメントの作成
- 発行物のパッケージ, 発行物のパッケージ
Pyt h o n
- ライブラリおよびランタイムのサポート,Python
Pyt h o n p ret t y- p rin t er
- デバッグ, Python Pretty-Printer
Q
Qt
- ライブラリおよびランタイムのサポート,Qt
Q t C reat o r
- Qt
- ライブラリおよびランタイムのサポート,Qt Creator
qt-doc
187
開発者ガイド
- Qt
- ライブラリおよびランタイムサポート,Qt ライブラリドキュメンテーション
q u ick f ix ( Pro b lems View)
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
q u it
- ツール
- GNU デバッガー, 単純な GD B
R
read elf
- 機能, 新しい機能
Ruby
- ライブラリおよびランタイムのサポート,Ruby
ru b y- d evel
- Ruby
- ライブラリおよびランタイムサポート,Ruby
S
Sh o rt cu t s タブ
- 統合開発環境
- Eclipse, パースペクティブのカスタマイズ
So lid
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
So n n et
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
sp ecf ile Ed it o r
- コンパイルおよびビルド,Eclipse RPM ビルディング, Eclipse Built-in Specfile Editor
SSL および認証管理
- SystemTap, SSL および認証管理
st at
- ツール
- Performance Counters for Linux (PCL) ツールおよび perf, Perf ツールコマン
ド
st ep
- ツール
- GNU デバッガー, 単純な GD B
st race
- バージョン, Red Hat D eveloper Toolset の機能
St rig i
188
⁠索引
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
SVN ( 参照 Ap ach e Su b versio n ( SVN ) )
Syst emT ap
- SSL および認証管理, SSL および認証管理
- モジュール署名 (コンパイルサーバーの承認), コンパイルサーバーのモジュール
署名の承認 (特権のないユーザー)
- 接続の承認 (コンパイルサーバー), コンパイルサーバー接続の承認
- 自動承認, 自動承認
- コンパイルサーバー, SystemTap コンパイルサーバー
- ホスト (コンパイルサーバーホスト),SystemTap コンパイルサーバー
- バージョン, Red Hat D eveloper Toolset の機能
- プロファイル, SystemTap
- カーネル情報パッケージ, SystemTap
- スクリプト (SystemTap スクリプト), SystemTap
- ドキュメンテーション, SystemTap のドキュメンテーション
- 必要なパッケージ, SystemTap
- 概要, SystemTap
- プロファル
- D ynInst, SystemTap 2.0 での D ynInst
- 特権のないユーザーのサポート, 特権のないユーザーに対する SystemTap のサポート
- 署名済みのモジュール, 特権のないユーザーに対する SystemTap のサポート
T
T asks Pro p ert ies
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
T asks View
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
T elep at h y
- KD E 開発フレームワーク
- ライブラリおよびランタイムサポート,KD E4 アーキテクチャ
V
Valg rin d
- ツール
-
cachegrind, Valgrind ツール
callgrind, Valgrind ツール
helgrind, Valgrind ツール
massif, Valgrind ツール
memcheck, Valgrind ツール
- バージョン, Red Hat D eveloper Toolset の機能
- プロファイル, Valgrind
- Eclipse 用のプラグイン, Eclipse 用の Valgrind プラグイン
- コマンド, Valgrind ツール
- ツール, Valgrind ツール
- ドキュメンテーション, Valgrind のドキュメンテーション
189
開発者ガイド
- 使用法, Valgrind の使用
variab le t rackin g at assig n men t s ( VT A)
- デバッグ, Variable Tracking at Assignments
View Men u ( ボタン)
- ユーザーインターフェイス
- Eclipse, Eclipse ユーザーインターフェイス
W
Wo rkb en ch U ser G u id e
- ヘルプシステム
- Eclipse, Eclipse のドキュメンテーション
Wo rksp ace Lau n ch er
- プロジェクト
- Eclipse, Eclipse プロジェクトの開始
190