Tips & Tricks

CLion での Makefile プロジェクト

Read this post in other languages:

CLion 2020.2 EAP2 では待望の Makefile プロジェクトサポートを導入しました。 まだ初期の段階で様々な制限や既知の問題はありますが、既に多くのプロジェクトに対応できるレベルになりました。

facebook_1200x628

Makefileプロジェクトを使用していますか? 無料EAPビルドを入手して、今すぐ試してみてください。 フィードバック大歓迎です!

このブログでは、次のような質問にお答えします。

 

実装への当社のアプローチ

少し前に、こちらのブログポスト CLion で Makefile プロジェクトをサポートするアプローチを発表しました。 その中で、多くの最新の C++ IDE、エディターで採用されている Makefile を処理するアプローチについて概要を説明しました。

  1. コンパイララッパーを使用して実際のコンパイラ呼び出しをラップし、完全なクリーンビルドを行い、プロジェクトの情報を抽出する。
  2. LD_PRELOAD環境変数を使用し、コンパイラ呼び出しをインターセプトしてプロジェクト情報を収集するビルドプロセスの実行前に、特定の動的ライブラリを読み込む。
  3. makeコマンドの出力結果(多くは実際のビルドを回避するため--just-printオプションと共に使用される)を解析する。

3番目のオプションには、非常に重要なメリットがあります。

  • ビルドプロセスに影響を及ぼさない。
  • 完全なプロジェクトビルドに比べ、情報を速く収集できる。
  • IDEは理論的に別のマシンに記録された Make 出力で開始できるため、これを「ポータブル」オプションとして活用できる。

そこで当社は3番目のアプローチを採用し、プロトタイプを実装しました。 当社はそれを多くのプロジェクトでテストしました。詳細は当社の Confluence ページをご覧ください。 その他多種多様なプロジェクトにも機能することを期待しています。 さあ、今度は皆さんが自分の Makefile プロジェクトを試し、当社と意見をシェアしてください!

CLion で Makefile プロジェクトを始める

次の手順で、CLion で Makefile プロジェクトを開きます。

  1. File | Open を選択します。
  2. フォルダーはプロジェクトとして開くことが可能で、CLionが最上位の MakefileCMakeList.txt および compile_commands.json ファイルを含む)を検索してプロジェクトとして開くことを提案をします。 もしくは、Open ダイアログで CLion からを Makefile に直接指定します。
  3. CLion がプロジェクトを Clean(クリーン)にするか尋ねる場合があります。 これは、Make ビルドがインクリメンタルであり、クリーンされていないプロジェクト上で実行すると変更されたファイルのみがコンパイルされるため、必須です。クリーンされていない場合にはプロジェクトの再読み込みが正しく機能せず、変更していないファイルが全て失われてしまいます。
  4. CLion がプロジェクトの読み込みを開始します。
  5. プロジェクトの読み込みに成功すると、CLion での使用が可能となり、高性能の IDE 機能をフル活用できるようになります。

動作中のMakefile

デフォルト設定でうまく行かない場合に調整できる、重要な設定があります。 Settings/Preferences(設定/環境設定)| Build, Execution, Deployment(ビルド、実行、デプロイメント)| Makefile から設定してください。

Makefileの設定

以下の変更が可能です。

  1. Makefileプロジェクトの読み込みに使用される Toolchain(ツールチェーン)。 すべてのローカルツールチェーン(Clang、GCC、MinGW、Cygwin、WSL)がサポートされています。 Visual Studio ツールチェーンは、現在サポートされていない NMake に依存していますが、GNU Make でプロジェクトをビルドすれば CLion で動作します。 リモートモードはまだ含まれていません。
  2. CLion がプロジェクト情報を抽出するために使用される make コマンドに対する Arguments(引数)
  3. Build(ビルド)Clean(クリーン)。Make ターゲットを CLion の make コマンドと共に使用し、プロジェクト情報を抽出します。 Build フィールドが空である場合は、CLion はプロジェクトの Makefile の最初のターゲットを取得します。

CLion で Makefile プロジェクトを操作する際のヒントをいくつか紹介しましょう。

ヒント1:CLion は Makefile プロジェクト内のターゲットを検索するため、Run/Debug 構成内ですぐに使用を開始することができます。:
Makefile configurations

CLion が Make ターゲットを見つけられない場合には、Make を入力して Custom Build Target(カスタムビルドターゲット)を作成すると、構成内で使用できます。

Makefileターゲットのカスタマイズ

ヒント 2:ソース外のビルドに対応していますが、プロジェクトの読み込み後に Tools | Makefile | Change Project Root(プロジェクトルートを変更する)を呼び出し、プロジェクトビューに適切に表示されるようにするとよいでしょう。

ヒント 3:現段階の CLion は、例えば新しいファイルの追加などのファイル変更をしても、プロジェクトを自動的に更新したり再読み込みすることはありません。プロジェクトの再読み込みを忘れないようにするため、 Makefile に対する変更は更新後、通知が表示されます。 ただし、プロジェクトに構成ステップを使用する場合は、必ず最初に呼び出して Makefile を更新し、通知を受け取るようにしてください。

アップデートされたMakefile

問題が発生し、プロジェクトを正しく読み込めない場合には

当社はこれを多くのプロジェクトをテストしました。詳細は当社の Confluence ページをご覧ください。 あなたのプロジェクトを含む、その他多種多様なプロジェクトにも機能することを期待しています。 それでも問題が解決しない場合は、次のアクションをお勧めします。

  1. 使用中の ツールチェーン を、Settings/Preferences | Build, Execution, Deployment | Makefile の設定 で確認してください。 選択した環境でプロジェクトをビルドすることができます。
  2. 引数の再読込とビルドターゲットを Settings/Preferences | Build, Execution, Deployment | Makefile の設定から確認してください。 うまく動作したプロジェクトの大半ではデフォルトの引数に起因する問題が生じませんでしたが、プロジェクトによっては引数の変更が必要な場合があります。
  3. Tools | Makefile | Clean および Reload Makefile Project(Makefileプロジェクトの再読み込み)を試してみてください。
  4. 上記ステップでも解決しない場合は、システムディレクトリ内の /makefiles から、プロジェクトのクリーニングを行ってみてください。 例えば、私の macOS 上の postgres プロジェクトは、~/Library/Caches/JetBrains/CLion2020.2/makefiles/postgres.dc29ef09 です。 その後、プロジェクトを再読み込みします。
  5. 上記すべてのヒントで解決しない場合には、Help | Diagnostic Tools(診断ツール)| Debug Log Settings(デバッグログ設定)から、 #com.jetbrains.cidr.cpp.makefile を追加してデバッグログをオンにします。 そうすることで問題を再現し、ログをトラッカーまたはサポートに送信することができます。

既知の問題と制限事項

使用されるアルゴリズムで最も脆弱な部分は、make コマンド出力からのコンパイルコマンドの抽出です。 いくらかのケースで問題が見つかりました。

  • プロジェクトがディレクトリの入力を抑制している。 そのため、アルゴリズムは実際にビルドされているソースファイルを正しく検出することができない。
  • コンパイラが不明、またはコンパイルフラグが正しく抽出できない。 libtool などの様々なラッパーが、コンパイルフラグを隠し、Make の出力を妨害して状況を悪化させている(CPP-19549CPP-19305)。

テストプロジェクトで経験したようなケースの解決策として、ヒューリスティックをいくつか追加しました。 また、Settings/Preferences | Build, Execution, Deployment | Makefile | Arguments(引数)から、ユーザーはプロジェクト情報を抽出する際に、make コマンドを呼び出す引数をコントロールできます。

今後の予定

  • Makefile サポートプラグインは、コードハイライトを提供し、Make プロジェクトのビルドをサポートします。 それをリワークして CLion にバンドルする予定です( CPP-16933)。
  • ユニットテストの統合は、後ほど Makefile プロジェクトで使用可能となります(CPP-20718)。
  • Makefile を既存のプロジェクトにリンクできる機能を追加します(CPP-20733)。
  • ツールチェーンもしくはプロジェクトの読み込みに影響を与えている他の設定を変更し、再読み込みをトリガーするようにします(CPP-18982)。
  • GNU Autotool プロジェクトのサポートを拡大する目的で、すべてのユーザーが Makefile プロジェクトの “pre-configure”(事前構成)ステップをセットアップできるようにします (CPP-16924)。
  • 非 GNU Make(NMake、BSD)のサポート(CPP-18723)。
  • コンパイララッパーを使用したアプローチを実装し、現在のものと組み合わせて機能可能にします。

その前に、まずは現在のプロトタイプを洗練させて各種課題を修正する予定です。 現段階では、ユーザーの皆さんのフィードバックが非常に重要です。 問題が生じた場合は、課題トラッカーに報告してください。

当社がプロトタイプで既にテストしたプロジェクトのリスト、CLion のMakefile プロジェクトをご参照ください。

CLion 2020.2 EAPをダウンロード

CLion チームより
JetBrains
The Drive to Develop

image description