/scanDependencies (標準形式でモジュールの依存関係を一覧表示する)

このコンパイラ オプションは、C++ 標準提案の P1689R5 Format for describing dependencies of source filesに従ってモジュールとヘッダーユニットの依存関係を一覧表示する JSON ファイルを生成します。

構文

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

引数

-
単一のダッシュが指定されている場合、コンパイラはソース依存関係 JSON を出力して stdoutするか、コンパイラ出力がリダイレクトされる場所に出力します。

filename
コンパイラでは、ソース依存関係の出力を指定したファイル名に書き込みます。これには相対パスまたは絶対パスが含まれる場合があります。 ファイルが存在しない場合は作成されます。

directory
引数がディレクトリの場合、コンパイラでは指定したディレクトリにソース依存関係ファイルを生成します。 ディレクトリが存在する必要があります。または、引数が filenameとして扱われます。 出力ファイル名は入力ファイルの完全名をベースとし、.module.json 拡張子が付加されます。 たとえば、コンパイラに指定されるファイルが main.cpp の場合、生成される出力ファイル名は main.cpp.module.json です。

解説

/scanDependencies コンパイラ オプションは、それらを使用するプロジェクトをコンパイルする前にコンパイルする必要がある依存関係、モジュール、およびヘッダー ユニットを識別します。 たとえば、ヘッダー ユニットの依存関係として import <library>; または import "library"; が一覧表示され、モジュールの依存関係として import name; されます。 その目的は、CMake などのビルド ツールで使用できる共通の形式でこの情報を提供することです。 モジュールとヘッダー ユニットの依存関係を報告するには、 /std:c++20 以降を使用してコンパイルする必要もあります。

このコマンド ライン オプションは、 /sourceDependencies:directives/sourceDependenciesに似ていますが、次の点で異なります。

  • 出力では、/sourceDependencies:directivesによって生成された Microsoft 固有のスキーマではなく、P1689R5 スキーマが使用されます。
  • /sourceDependenciesとは異なり、コンパイラはコンパイルされた出力を生成しません。 代わりに、モジュール ディレクティブについてファイルがスキャンされます。 コンパイル済みのコード、モジュール、またはヘッダー ユニットは生成されません。
  • このオプションではプロジェクト ファイルのみがスキャンされるため、出力 JSON ファイルには、インポートされたモジュールとインポートされたヘッダー ユニット (.ifc ファイル) は一覧表示されません。 リストするビルドされたモジュールやヘッダー ユニットはありません。
  • 直接インポートされたモジュールまたはヘッダー ユニットだけが一覧表示されます。 インポートされたモジュールまたはヘッダー ユニット自体の依存関係は一覧表示されません。
  • /translateInclude オプションを使用してヘッダー ユニットに変換しない限り、#include <file>#include "file"などのテキストに含まれるヘッダー ファイルは依存関係として一覧表示されません。
  • /scanDependencies は、.ifc ファイルをビルドする前に使用されることを意図しています。

/scanDependencies は、Visual Studio 2022 バージョン 17.2 以降で使用できます。 これは、既定では有効になっていません。

コンパイラ オプション/MP (複数のプロセスを使用したビルド) を指定する場合は、ディレクトリ引数で/scanDependenciesを使用することをお勧めします。 1 つの filename 引数を指定した場合、コンパイラの 2 つのインスタンスで出力ファイルを同時に開こうとし、エラーが発生する可能性があります。 /scanDependencies-/MPを使用して出力をstdoutに送信すると、インターリーブ結果が発生する可能性があります。

致命的でないコンパイラ エラーが発生した場合でも、依存関係情報は出力ファイルに書き込まれます。

出力には、すべてのファイル パスが絶対パスとして表示されます。

出力 JSON ファイルで使用される形式とスキーマの詳細については、 P1689R5 セクション 6 を参照してください。

次のようなサンプル コードを考えてみましょう。

//app.cpp:
#include <vector>

import other.module;
import std.core;

import "t.h";

import <iostream>;

int main() {}

このコマンド ラインを使用して、 app.cppの依存関係を報告できます。

cl /std:c++latest /scanDependencies output.json app.cpp

コンパイラは、次のような内容の JSON ファイル ( output.json) を生成します。

{
    "version": 1,
    "revision": 0,
    "rules": [
        {
            "primary-output": "app.obj",
            "outputs": [
                "C:\\Users\\username\\source\\repos\\app\\app"
            ],
            "requires": [
                {
                    "logical-name": "other.module"
                },
                {
                    "logical-name": "std.core"
                },
                {
                    "logical-name": "t.h",
                    "source-path": "C:\\Users\\username\\source\\repos\\app\\app\\t.h",
                    "lookup-method": "include-quote",
                    "unique-on-source-path": true
                },
                {
                    "logical-name": "iostream",
                    "source-path": "C:\\Program Files\\...\\include\\iostream",
                    "lookup-method": "include-angle",
                    "unique-on-source-path": true
                }
            ]
        }
    ]
}

報告されたパスを省略するために ... を使用しました。 レポートには絶対パスが含まれます。 報告されるパスは、コンパイラで依存関係が見つかる場所によって変わります。 予期しない結果である場合は、プロジェクトのインクルード パスの設定を確認することをお勧めします。

.ifc ファイルはビルドされなかったため、出力に一覧表示されません。 /sourceDependencies とは異なり、/scanDependencies を指定した場合にコンパイラではコンパイル済みの出力は生成されません。そのため、インポートするコンパイル済みのモジュールまたはヘッダー ユニットは生成されません。

このコンパイラ オプションを Visual Studio で使用するには

通常は、Visual Studio 開発環境で /scanDependencies オプションを設定しないでください。 このオプションを設定すると、コンパイラによってオブジェクト ファイルが生成されないため、リンク ステップが失敗し、エラーが報告されます。

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「コンパイラとビルドのプロパティを設定する」をご覧ください。

  2. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  3. Additional Options プロパティを変更して/scanDependencies-または/scanDependencies "pathname"を追加します。"pathname"出力用のディレクトリを参照します。

  4. [OK] を選択して変更を保存します。

モジュールとヘッダー ユニットの依存関係を報告するには、 Configuration Properties>General>C++ Language Standard プロパティを ISO C++20 Standard 以降に設定する必要もあります。

このコンパイラ オプションをコードから設定するには

関連項目

MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文
/sourceDependencies:directives
/sourceDependencies
/std (言語の標準バージョンの指定)
/translateInclude