依存性の確認

このチュートリアルでは、NetBeans IDEで、プロジェクトのビルド時におけるファイル依存性の確認を有効にする方法を示します。依存性チェックは、Makefileの手順に従ってmakeユーティリティによって実行されます。

目次

このページの内容は、NetBeans IDE 7.3、7.4および8.0に適用されます

要件

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェア 必須バージョン
NetBeans IDE (C/C++のサポートを含む) バージョン7.3、7.4または8.0とNetBeans C/C++プラグイン
Java Development Kit (JDK) バージョン7または8

必要なソフトウェアのダウンロードとインストールについては、NetBeans IDEのインストール手順およびC/C++/Fortran向けのNetBeans IDEの構成を参照してください。

概要

大規模なC/C++プロジェクトは何千ものファイルで構成されます。たとえば、Linuxカーネルには約20,000ファイルが含まれます。このようなプロジェクトの開発中に、小さな変更(1行の修正など)の後にプロジェクトを再ビルドする場合、2つのオプションがあります。

  • 完全再ビルド(消去してビルド・アクション)。低速ですが、ビルド結果の整合性は保証されます。
  • 増分再ビルド(ビルド・アクション)。高速ですが、再ビルドを必要とするものがすべて正確に再ビルドされるでしょうか。

増分再ビルドの主な問題は、あるファイルの内容を別のファイルにインクルードする#includeディレクティブの存在です。インクルード・ファイルはファイル依存性として知られています。インクルード・ファイルの変更は、そのファイルをインクルードするすべてのファイルの変更として扱う必要があります。間接インクルード(AがBをインクルードし、BがCをインクルードする=> AがCをインクルードする)がある場合は問題がさらに複雑になります。

NetBeans IDEではファイル依存性の自動確認がサポートされており、増分再ビルドが正しく機能するように動作します。一部のソース・ファイルに含まれるヘッダー・ファイルを変更して「ビルド」をクリックすると、IDEでは、変更されたヘッダーに実際に依存しているプロジェクトの要素のみが再ビルドされます。この機能によって時間が節約され、ビルド結果の整合性が保証されます。

プロジェクトの依存性チェックの有効化

依存性チェックは特定のプロジェクトごとに制御できます。この機能が有効であることを確認する場合があります。

プロジェクトの依存性チェックを有効化する手順:

  1. 「プロジェクト」ウィンドウでプロジェクトを右クリックし、「プロパティ」を選択します。
  2. 「プロジェクト・プロパティ」ダイアログ・ボックスで、「カテゴリ」リストの「ビルド」ノードを選択します。
  3. ビルド・プロパティで、「依存性チェックを有効化」のチェックボックスを選択します。

プロジェクト・プロパティの依存性チェックのチェックボックス

新規プロジェクトのデフォルトによる依存性チェックの有効化

作成した新しいプロジェクトの依存性チェックが自動的に有効になるように、依存性チェックのデフォルトの状態を設定できます。

IDEで作成されるすべての新規プロジェクトの依存性チェックを有効化する手順:

  1. IDEメイン・メニューで「ツール」>「オプション」を選択します。
  2. 最上部ペインで「C/C++」ボタンをクリックします。
  3. 「プロジェクト・オプション」タブをクリックします。
  4. 生成したMakefileでの依存性チェックを有効化するチェックボックスを選択します。

NetBeansオプションでの依存性チェックのチェックボックス

注意

  • 自動依存性チェックはIDEで作成されたC/C++プロジェクト(管理対象プロジェクト)で機能します。IDEは生成されたMakefile内に依存性チェック・ロジックをビルドします。既存のソースによって作成されたプロジェクトの場合は、既存のMakefileの依存性チェック・ロジック(ある場合)に依存する必要があります。
  • 依存性チェックにはツール・コレクション(makeおよびコンパイラ)からのサポートが必要です。これはOracle Solaris Studioツール・コレクションと、CygwinおよびMinGWが含まれるGNUツール・コレクションによってテストされています。
  • 依存性チェックは、Oracle Solaris StudioコンパイラがOracle Solaris makeとともに使用され、GNUコンパイラがGNU gmakeとともに使用される際に機能します。Oracle Solaris makeとGNUコンパイラの混在、あるいはその反対はサポートされていません。

この記事の後半は、IDEの内部動作に関する上級ユーザー向けの内容です。

ビルド・プロセス(makeおよびmakefile)

NetBeansでのすべてのC/C++プロジェクトのビルド・プロセスは、makeユーティリティで理解される特殊な形式のファイルである、Makefileに記述があります。GUIからプロジェクトをビルドまたは消去すると、IDEはmakeを呼び出し、これによってMakefileが実行されます。このアプローチでは、makeを使用することでプロジェクトをIDE外部で簡単にビルドできます。プロジェクト・ディレクトリに移動し、make helpと入力して指示を得るだけです。

NetBeans IDEでC/C++プロジェクトのために使用されるMakefileを次に示します。

NetBeansでC/C++プロジェクトのために使用されるMakefile

マスターMakefileは一度生成されると、手動で編集することができます。nbprojectディレクトリ内のMakefileは手動で編集できません。これらは、IDEによって自動的に更新されます。図中のファイルMakefile-CONF.mkは、Makefile-Release.mkMakefile-Debug.mkなどの、すべてのプロジェクト構成のための複数のファイルを表しています。

管理対象プロジェクトの場合、IDE自体がすべてのmakefileを生成し、依存性チェックの適切な手順を挿入します。既存のソースから作成されたプロジェクトの場合、依存性チェックは、既存のMakefileにこのような手順が含まれる場合のみ機能します。NetBeans IDEでは既存のMakefileは変更されないためです。

依存性生成の基本

makeでビルド中にインクルード・ファイル依存性をチェックする場合は、依存性情報をMakefile内に挿入する必要があります。しかしながら、すべてのmakeユーティリティおよびコンパイラに対してこれを行う移植可能な方法はありません。まず、稼働中のmakeを検出してから、対応する依存性チェック手順を生成する必要があります。

Oracle Solarisのmakeには非常に単純なソリューションがあります。Makefile内の特殊な.KEEP_STATE:ルールは、インクルード・ファイル依存性に関してコンパイラに問合せを行い、それを一時ファイルに格納するようにmakeに指示します。次回プロジェクトが再ビルドされるとき、makeはその一時ファイルをロードして、格納された依存性を分析してから、変更されたヘッダーと再コンパイルが必要なオブジェクト・ファイルを決定します。

GNU make (gmakeと呼ばれる)の場合、ソリューションはより複雑になります。依存性情報を生成することをコンパイラに明示的に要求してから、それを明示的にMakefileに含める必要があります。特殊なフラグをコンパイラに渡すことで、コンパイルされた個々のソース・ファイルの依存性情報をコンパイラが生成するようになります。次回プロジェクトが再ビルドされるとき、依存性情報が収集されてMakefile内に含まれます。

実装

次のコードがnbproject/Makefile-impl.mkに追加されます。これによって稼働中のmakeが検出されてから、対応する依存性チェック・コードが.dep.incファイル内に含まれます。GNU makeMAKE_VERSION変数の存在によって検出されます。MAKE_VERSIONが設定されていない場合は、Solaris make固有の手順が生成されます。

# dependency checking support
.depcheck-impl:
	@echo "# This code depends on make tool being used" >.dep.inc
	@if [ -n "${MAKE_VERSION}" ]; then \
	    echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
	    echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
	    echo "include \$${DEPFILES}" >>.dep.inc; \
	    echo "endif" >>.dep.inc; \
	else \
	    echo ".KEEP_STATE:" >>.dep.inc; \
	    echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
	fi

次のコードがnbproject/Makefile-${CONF}.mkに追加されます。これによって、前に生成された.dep.incを読み取ってその手順を実行するように、makeが指示されます。

# Enable dependency checking
.dep.inc: .depcheck-impl

include .dep.inc

ルール.dep.inc: .depcheck-implが、.dep.incが存在しない場合にビルドの失敗を防ぐために追加されます。このことが発生するのは1つのケースのみ、すなわち「プロジェクト」ウィンドウから単一ファイルをコンパイルする場合です。この場合、makenbproject/Makefile-${CONF}.mkファイルを直接実行します。

参考資料

  1. makeに関するWikipedia記事
  2. 高度な自動依存性の生成

関連項目

NetBeans IDEでのC/C++/Fortranを使用した開発に関する詳細な記事は、C/C++の学習を参照してください。

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2015, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo