コード生成レポートの情報へのプログラムによるアクセス
コード生成に関する情報をベース MATLAB® ワークスペース内の変数にエクスポートすることができます。その変数に含まれる coder.ReportInfo
オブジェクトのプロパティに、以下の情報が格納されます。
コード生成の成功、日時、出力ファイルのパス、プロセッサ、MATLAB Coder™ のバージョン、コード生成時にチェックアウトされたツールボックス ライセンス、ツールチェーン、ビルド構成などを含むコード生成の概要
コード生成構成オブジェクト
入力ファイルのテキスト、パス、拡張子
生成ファイルのテキスト、パス、拡張子
コード生成に関わるすべての MATLAB 関数およびメソッドについて: 名前、特殊化、ファイル、開始インデックス、終了インデックス
コード生成エラー、警告、情報メッセージ
生成コードに関する潜在的な問題を示すコード洞察
コード生成時に生成されたビルド ログ
coder.ReportInfo のプロパティ を参照してください。
レポート情報オブジェクトを使用すると、このコード生成に関する情報にプログラムからアクセスできます。たとえば、MATLAB コマンド ラインでコード生成メッセージを表示できます。この操作を実行するには、ビルド スクリプトでそれらのメッセージを含むプロパティにアクセスします。
レポート情報オブジェクトの作成
ベース MATLAB ワークスペース内の変数 info
にコード生成レポート情報をエクスポートするとします。次のいずれかを行います。
MATLAB Coder アプリの [デバッグ] タブで、変数名
info
に [レポート情報を変数にエクスポート] を設定します。コマンド ラインで
codegen
コマンドを-reportinfo
オプション付きで使用します。-reportinfo
オプションの後に変数名を指定します。codegen myFunction -reportinfo info
コマンド ラインで、コード構成オブジェクトのプロパティ
ReportInfoVarName
を'info'
に設定します。コード生成レポートを生成し、開きます。[レポート情報のエクスポート] をクリックします。このダイアログ ボックスで、変数名
info
を指定します。
例: 成功するコード生成に対するレポート情報オブジェクトの作成
成功するコード生成プロセスについて、レポート情報オブジェクトを作成します。そのオブジェクトのプロパティを検査します。
MATLAB 関数
foo
を定義します。function b = foo(a) c = svd(a,0); b = sum(c); end
foo
の MEX 関数を生成します。入力a
を、1 番目の次元の上限が3
で 2 番目の次元の上限が5
の可変サイズの行列として指定します。コード生成レポートの情報をベースの MATLAB ワークスペースの変数info
にエクスポートします。codegen -config:mex foo -args {coder.typeof(ones(1,1),[3 5],[1 1])} -reportinfo info
コード ジェネレーターが MEX 関数
foo_mex
を生成します。また、コード ジェネレーターはベース MATLAB ワークスペース内にレポート情報オブジェクトinfo
も作成します。レポート情報オブジェクトの構造を検査します。このオブジェクトには、コード生成に関する情報を含むプロパティが 8 つあります。
ReportInfo with properties: Summary: [1×1 coder.Summary] Config: [1×1 coder.MexCodeConfig] InputFiles: [1×1 coder.CodeFile] GeneratedFiles: [21×1 coder.CodeFile] Functions: [1×1 coder.Function] Messages: [0×1 coder.Message] CodeInsights: [1×1 coder.Message] BuildLogs: [1×1 coder.BuildLog]
info
の各プロパティを個別に検査します。info.Summary
は、coder.Summary
オブジェクトで、そのプロパティにコード生成の成功、コード生成日時、出力ファイルのパス、プロセッサ、コード生成時にチェックアウトされたツールボックス ライセンス、MATLAB Coder のバージョンに関する情報が含まれます。Summary with properties: Success: true Date: '08-May-2020 09:15:07' OutputFile: 'C:\coder\R2020b\License discovery\foo_mex.mexw64' Processor: 'Generic->MATLAB Host Computer' Version: 'MATLAB Coder 5.1 (R2020b)' ToolboxLicenses: [1×0 string]
スタンドアロン コードを生成した場合、
info.Summary
にはツールチェーンとビルド構成についての情報も含まれます。info.Config
はコード構成オブジェクトです。この例では、foo
の MEX 関数を生成したため、これはcoder.MexCodeConfig
オブジェクトになります。info.InputFiles
はcoder.CodeFile
オブジェクトの配列です。配列の各要素に、コード生成入力ファイルのテキスト、パス、および拡張子が格納されます。この例では、入力ファイルはfoo.m
の 1 つだけなので、配列の要素は 1 つだけです。CodeFile with properties: Text: 'function b = foo(a)←↵b = svd(a,0);←↵end←↵' Path: 'C:\coder\R2019a\Report Info Object\foo.m' Extension: '.m'
info.GeneratedFiles
はcoder.CodeFile
オブジェクトの配列です。配列の各要素に、生成ファイルのテキスト、パス、および拡張子が格納されます。この例では、生成ファイルは25
個あるため、21
行1
列の配列になります。21×1 CodeFile array with properties: Text Path Extension
info.Functions
はcoder.Function
オブジェクトの配列です。配列の各要素に、MATLAB 関数またはメソッドに関する次の情報が格納されます。名前および特殊化。
関数またはメソッドを含む入力ファイルの
coder.CodeFile
オブジェクト。このオブジェクトはinfo.InputFiles
にも含まれます。ファイルのテキストに含まれる関数またはメソッドの開始インデックスおよび終了インデックス。
この例では、入力ファイル
foo.m
内の MATLAB 関数は 1 つだけのため、info.Functions
の要素は 1 つです。Function with properties: Name: 'foo' Specialization: 0 File: [1×1 coder.CodeFile] StartIndex: 1 EndIndex: 52
info.Messages
はcoder.Message
オブジェクトの配列で、コード生成エラー、警告、および情報メッセージを格納します。この例では、該当するメッセージはありません。そのため、このプロパティは空の配列です。0×1 Message array with properties: Identifier Type Text File StartIndex EndIndex
info.CodeInsights
はcoder.Message
オブジェクトの配列で、コード生成エラー、警告、および情報メッセージを格納します。これらの洞察は、生成されるコードに含まれる潜在的な問題についてのメッセージです。たとえば、MATLAB コードとの差異や、起こりうる行優先の配列レイアウトの問題などです。これらのメッセージは、コード生成レポートの [コード洞察] タブにも表示されます。配列の各要素に、1 つのコード洞察に関する次の情報が格納されます。メッセージの識別子とタイプ。
メッセージのテキスト。
メッセージが属するカテゴリおよびサブカテゴリ。
メッセージを生成した入力ファイルの
coder.File
またはcoder.CodeFile
オブジェクト。メッセージを生成したファイル テキストの部分の開始インデックスと終了インデックス。
この例では、コード洞察が 1 つあります。
Message with properties: Identifier: 'Coder:potentialDifferences:autoDimIncompatibility' Type: 'Info' Text: 'In the generated code, the dimension to operate along is selected automatically, and might be different from MATLAB. Consider specifying the working dimension explicitly as a constant value.' Category: 'PotentialDifferencesFromMATLAB' File: [1×1 coder.CodeFile] StartIndex: 41 EndIndex: 46
ファイルのテキストにインデックスを付けるには、
StartIndex
プロパティおよびEndIndex
プロパティを使用します。このコマンドは、コード洞察を生成したファイル テキストの部分を示しています。info.CodeInsights.File.Text(41:46)
'sum(c)'
info.BuildLogs
は、コード生成中に作成されたビルド ログを含むcoder.BuildLog
オブジェクトの配列です。ビルド ログには、コンパイルおよびリンクのエラーと警告が含まれます。同一のビルド ログは、コード生成レポートの [ビルド ログ] タブにも表示されます。配列の各要素に、1 つのビルド ログのタイプとテキストが含まれます。この例では、タイプが'Target'
のビルド ログが 1 つあります。
例: ツールボックス ライセンスをチェックアウトする、成功するコード生成に対するレポート情報オブジェクトの作成
ツールボックス ライセンスをチェックアウトするコード生成プロセス用のレポート情報オブジェクトを作成します。そのオブジェクトのプロパティを検査します。
関数
iqr
(Statistics and Machine Learning Toolbox) およびhaart
(Wavelet Toolbox) を呼び出す MATLAB 関数bar
を定義します。function [u,v,w] = bar(x) %#codegen u = iqr(x); [v,w] = haart(x); end
bar
の C ソース コードを生成します。入力引数の型を double の1
行100
列の行ベクトルとして指定します。コード生成レポートの情報をベースの MATLAB ワークスペースの変数info
にエクスポートします。codegen -c bar -args {zeros(1,100)} -reportinfo info
コード生成に成功します。
info.Summary.ToolboxLicenses
プロパティを検査します。1×2 string array "statistics_toolbox" "wavelet_toolbox"
このプロパティは、Statistics and Machine Learning Toolbox™ と Wavelet Toolbox™ のライセンスがコード生成時にチェックアウトされたことを示しています。
メモ
MEX コードを生成する場合、これらのライセンスは MEX 関数の読み込み時に再度チェックアウトされます。
スタティック ライブラリまたはダイナミック リンク ライブラリを生成する場合、ツールボックス ライセンスはコード生成時にのみチェックアウトされます。コード ジェネレーターは、生成されたスタンドアロン コードにライセンスのチェックアウトを書き込みません。
例: 失敗するコード生成に対するレポート情報オブジェクトの作成
失敗するコード生成プロセス用のレポート情報オブジェクトを作成します。そのオブジェクトのプロパティを検査します。
MATLAB 関数
foo
を定義します。function b = foo(a) b = svd(a,0); end
foo
の MEX 関数を生成します。入力a
を string スカラーとして指定します。コード生成レポートの情報をベースの MATLAB ワークスペースの変数info
にエクスポートします。codegen -config:mex foo -args {"A string scalar"} -reportinfo info
string スカラーは MATLAB 関数
svd
の有効な入力でないため、コード生成は失敗します。コード ジェネレーターは、ベース MATLAB ワークスペース内にレポート情報オブジェクトinfo
を作成します。info.Summary
プロパティおよびinfo.Messages
プロパティを検査します。info.Summary
はコード生成が失敗したことを示しています。Summary with properties: Success: false Date: '08-May-2020 10:20:35' OutputFile: 'C:\coder\R2020b\License discovery\codegen\mex\foo' Processor: 'Generic->MATLAB Host Computer' Version: 'MATLAB Coder 5.1 (R2020b)' ToolboxLicenses: [1×0 string]
info.Messages
はcoder.Message
オブジェクトの配列で、コード生成エラー、警告、および情報メッセージを格納します。配列の各要素に、1 つのメッセージに関する次の情報が格納されます。メッセージの識別子とタイプ
メッセージのテキスト
メッセージの原因となった入力ファイルの
coder.CodeFile
オブジェクトメッセージの原因となったファイル テキストの部分の開始インデックスと終了インデックス
この例では、エラー メッセージは 2 つあります。そのため、
info.Messages
は2
行1
列の配列です。2×1 Message array with properties: Identifier Type Text File StartIndex EndIndex
配列
info.Messages(1)
の最初の要素を表示します。Message with properties: Identifier: 'Coder:toolbox:unsupportedClass' Type: 'Error' Text: 'Function 'svd' is not defined for values of class 'string'.' File: [1×1 coder.CodeFile] StartIndex: 26 EndIndex: 33
StartIndex
プロパティおよびEndIndex
プロパティを使用して、ファイルのテキストにインデックスを付けます。このコマンドは、エラー メッセージの原因となったファイル テキストの部分を表示します。info.Messages(1).File.Text(26:33)
'svd(a,0)'
手動でのコード検査
入力ファイルのテキストを手動で検査するには、StartIndex
および EndIndex
の値に対応する行番号と列番号が役立ちます。この情報を取得するには、関数 getLineColumn
を使用します。この関数は、StartIndex
に対応する行番号および列番号と、EndIndex
に対応する行番号および列番号を格納した、2 つの構造体を返します。
前述の例で、最初のエラー メッセージの原因となった foo.m
の部分を手動で検査するため、ファイルのテキストを表示します。
info.Messages(1).File.Text
ファイルのテキストが次のように表示されます。
'function b = foo(a) b = svd(a,0); end '
最初のエラー メッセージの原因となったテキスト部分の行番号と列番号にアクセスします。
[startLoc,endLoc] = getLineColumn(info.messages(1))
出力は、次のようになります。
startLoc = struct with fields: Line: 2 Column: 5 endLoc = struct with fields: Line: 2 Column: 12
これらの位置は、foo.m
のテキスト内の関数呼び出し 'svd(a,0)'
の最初と最後の位置に対応します。
コード構成オブジェクトの新しい MATLAB セッションへの転送
MATLAB セッションで作成したレポート情報オブジェクト info
を別の MATLAB セッションで使用すると仮定します。info.Config
がスタンドアロン コード生成用の構成オブジェクトの場合 (coder.CodeConfig
または coder.EmbeddedCodeConfig
)、次の動作が起こることがあります。
2 つ目のセッションの MATLAB ホスト コンピューターに、
info.Config.Hardware
プロパティで指定されたハードウェア ボードがインストールされていない場合、構成パラメーターinfo.Config.Hardware
が既定値に戻ります。既定値は[]
です。2 つ目のセッションの MATLAB ホスト コンピューターに、
info.Config.Toolchain
プロパティで指定されたツールチェーンがインストールされていない場合、構成パラメーターinfo.Config.Toolchain
が既定値に戻ります。既定値は'Automatically locate an installed toolchain'
です。
参考
coder.BuildLog のプロパティ | coder.ReportInfo のプロパティ | coder.Summary のプロパティ | coder.File のプロパティ | coder.CodeFile のプロパティ | coder.Function のプロパティ | coder.Method のプロパティ | coder.Message のプロパティ | getLineColumn