Main Content

ビルド プロセスの依存関係の追加

コード生成用のシステム ターゲット ファイルを指定すると、コード ジェネレーターは開発コンピューター上で実行可能なスタンドアロンの実行可能プログラムをビルドできます。実行可能プログラムをビルドするために、コード ジェネレーターは選択されたコンパイラと、ツールチェーンまたはテンプレート makefile (TMF) ビルド プロセスのアプローチによって生成された makefile を使用します。makefile 生成プロセスの一環で、ソース ファイル、ヘッダー ファイルおよびライブラリ ファイル情報 (依存関係) がコンパイルのために生成される makefile 内に追加されます。また、特定のアプリケーションの場合、構成管理システムを使用して生成ファイルおよびファイルの依存関係を追加できます。

モデルの生成コードは少数のファイルで構成されます (ビルド プロセスのファイルの管理を参照してください)。これらのファイルには他のファイルへの依存関係があります。依存関係は以下のために生じます。

  • ヘッダー ファイルのインクルード

  • マクロ宣言

  • 関数の呼び出し

  • 変数宣言

さまざまな理由でモデルまたは外部コードに依存関係が導入されます。

  • モデル内のブロックが関数呼び出しを作成するコードを生成する。これらの呼び出しはいくつかの形式で発生する可能性があります。

    • 呼び出される関数がインクルードされるソース ファイル (生成されたものではない) で宣言される。ブロックセットなどの場合は、これらのソース ファイルの依存関係をライブラリ ファイル内にコンパイルすることによって管理します。

    • コンパイラから提供されるランタイム ライブラリの関数を生成コードが呼び出す。

    • 一部の関数の依存関係は、共有ユーティリティとして参照される生成ファイルにもあります。たとえば、固定小数点ユーティリティや非有限サポート関数があります。これらの依存関係を共有ユーティリティと呼びます。生成関数を、スタンドアロンのモデル用のビルド フォルダー内のファイル、または、モデル参照に関係するビルド用の slprj フォルダーの下の _sharedutils フォルダー内のファイルに表示することができます。

  • 連続時間をもつモデルにはソルバー ソース コードファイルが必要です。

  • エクスターナル モード、C API、MAT ファイルのログなどのコード ジェネレーター オプション。

  • 外部コードで依存関係が指定されている。

ビルド プロセスのファイル依存関係情報

コード ジェネレーターには、ファイル依存関係情報をビルド プロセスに入力するメカニズムがいくつかあります。このメカニズムは依存関係がブロックベースか、モデルまたはシステム ターゲット ファイルベースかによって異なります。

ブロックの依存関係の場合は、以下の使用を検討します。

  • S-Function とブロックセット

    • モデルが使用する S-Function MEX ファイルを含むフォルダーをヘッダー インクルード パスに追加します。

    • これらのフォルダーの makefile 規則を作成してソース コードを検出できるようにします。

    • S-Function ブロック パラメーター SFunctionModules を使用して追加のソース ファイル名を指定します。

    • rtwmakecfg.m メカニズムを使用して追加の依存関係を指定します。生成された makefile を rtwmakecfg.m API を使用してカスタマイズを参照してください。

    レガシ コードまたは外部コードの統合にこれらのアプローチを適用する方法の詳細については、レガシ コード ツールによって外部コードへの呼び出しを生成コードにインポートを参照してください。

  • S-Function Builder ブロック (依存関係情報を指定するための固有の UI があります)

外部ヘッダー ファイルなどのモデルまたはシステム ターゲット ファイルベースの依存関係の場合は、以下の使用を検討します。

  • [コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][カスタム コード] ペイン。追加のライブラリ、ソース ファイルおよびインクルード フォルダーを指定できます。

  • TLC 関数 LibAddToCommonIncludes() および LibAddToModelSources()。TLC フェーズの最中に依存関係を指定できます。LibAddToCommonIncludes(incFileName)およびLibAddSourceFileCustomSection(file, builtInSection, newSection)を参照してください。Embedded Coder® 製品では追加のソース ファイルを生成する TLC ベースのカスタマイズ テンプレートも提供されています。

生成された makefile の依存関係

ツールチェーン アプローチまたはテンプレート makefile (TMF) アプローチのビルド プロセスでは、コード ジェネレーターによって makefile が生成されます。TMF の場合、生成された makefile にはトークン拡張機能が含まれており、ビルド プロセスによって makefile 内のさまざまなトークンが拡張され、依存関係情報が追加されます。結果の makefile は完全な依存関係情報を含んでいます。テンプレート makefile のカスタマイズを参照してください。

生成された makefile には以下が含まれます。

  • ソース ファイルの名前の依存関係

  • ソース ファイルが配置されるフォルダー

  • ヘッダー ファイルの場所

  • プリコンパイルされたライブラリの依存関係

  • make ユーティリティがコンパイルして作成するライブラリ

make ユーティリティのプロパティでは、ソースの C ファイルや C++ ファイルの具体的な場所を指定する必要はありません。makefile 内でそのフォルダーに規則が存在し、ソース ファイル名が前提条件である場合、make ユーティリティはソース ファイルを見つけ、それをコンパイルすることができます。C または C++ コンパイラ (プリプロセッサ) はヘッダーへの絶対パスを必要としません。#include 命令とインクルード パスを使用して、コンパイラはヘッダー ファイルの名前からヘッダー ファイルを検出します。生成された C または C++ ソース コードはこの標準のコンパイラ機能に依存します。

ライブラリが作成されてリンクされますが、これによってプログラムから呼び出される具体的な関数は隠蔽されます。

これらのプロパティにより、依存関係の最小のリストを手作業で特定することが困難になる場合があります。生成コード内の依存関係を特定するための開始点として makefile を使用できます。

依存関係を特定する他の方法には、リンカー マップ ファイルなどのリンカー情報を使用してシンボルの依存関係を特定する方法があります。コード ジェネレーターおよびブロックセットのソースとヘッダー ファイルの場所がマップ ファイルによって提供されるため、依存関係の特定に役立ちます。

コード ジェネレーターの静的ファイルの依存関係

MATLAB® フォルダー ツリー内のいくつかの場所にはコード ジェネレーター固有の静的なファイル依存関係が含まれています。

  • matlabroot/rtw/c/src (開く)

    このフォルダーにはサブフォルダーがあり、コンパイルしなければならない追加のファイルが含まれています。たとえば、ソルバー関数 (連続時間サポート用)、エクスターナル モード サポート ファイル、C API サポート ファイル、S-Function サポート ファイルがあります。makefile の変数 SRC を使用して、このフォルダー内のソース ファイルをビルド プロセスに追加します。

  • matlabroot/extern/include フォルダー内のヘッダー ファイル

  • matlabroot/simulink/include フォルダー内のヘッダー ファイル

    これらのフォルダーは追加のヘッダー ファイル依存関係を含んでいます (tmwtypes.hsimstruc_types.h、および simstruc.h など)。

    メモ

    ERT ベースのシステム ターゲット ファイルの場合、一部のヘッダーの依存関係を排除できます。ERT ベースのシステム ターゲット ファイルではファイル rtwtypes.h 内でタイプ定義、マクロなどの最小限のセットを生成します。

ブロックセットの静的ファイルの依存関係

S-Function コードを備えたブロックセット製品は rtwmakecfg.m メカニズムを適用して、依存関係情報をコード ジェネレーターに提供します。ブロックセットからの rtwmakecfg.m ファイルには、ブロックセット用のインクルード パスとソース パスの依存関係のリストが含まれています。一般的に、ブロックセットは生成されたモデル コードがリンクできるソース ファイルからライブラリを作成します。ライブラリは、rtwmakecfg.m メカニズムを使用したときに生成および特定されます。

MATLAB がインストールしたツリー内でブロックセット用の rtwmakecfg.m ファイルを探すには、以下のコマンドを使用します。

>> which -all rtwmakecfg.m

コンパイル中のモデルが which コマンドによってリストされるブロックセットの 1 つ以上を使用する場合は、それぞれの rtwmakecfg.m ファイルからフォルダーとファイルの依存関係情報を判断することができます。

ビルド プロセスのフォルダー依存関係情報

#include ステートメントを追加してコードを生成できます。そのような参照は複数のソースから来る可能性があります (S-Function、カスタムのストレージ クラス、バス オブジェクト、およびデータ型オブジェクトをインライン化するための TLC スクリプトを含む)。インクルードされるファイルは外部コードや他のカスタマイズ用のヘッダー ファイルから構成されます。-I コンパイラ オプションを使用してコンパイラ インクルード パスを指定できます。ビルド プロセスでは指定されたパスを使用して、インクルードされるヘッダー ファイルを探します。

生成コードのための用法シナリオは以下を含みます。

  • カスタムのビルド プロセスによって環境固有の一連の #include ステートメントを必要とする生成コードをコンパイルします。

    このシナリオでは、モデル コンフィギュレーション パラメーター [コード生成のみ] を選択した場合にビルド プロセスがコード ジェネレーターを起動します。#include ステートメント内で完全修飾パス、相対パスまたはヘッダー ファイル名のみを使用することを検討します。インクルード パスを使用します。

  • ビルド プロセスによって生成コードをコンパイルします。

    この場合、ビルド プロセスのコンパイラ インクルード パス (-I) を複数の方法で指定できます。

    • [コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][カスタム コード] ペインで追加のインクルード パスを指定します。コード ジェネレーターはインクルード パスを生成される makefile に伝播します。

    • rtwmakecfg.m メカニズムにより、S-Function は追加のインクルード パスをビルド プロセスに導入できます。コード ジェネレーターはインクルード パスを生成される makefile に伝播します。

    • カスタムのシステム ターゲット ファイルを使用する makefile ベースのモデルをビルドする場合、システム ターゲット ファイルが使用するテンプレート makefile にインクルード パスを直接追加できます。

    • make コマンドを使用して、make 変数 USER_INCLUDES を指定します。この変数はインクルードされるファイルをビルド プロセスが探すフォルダーを定義します。次に例を示します。

      make_rtw USER_INCLUDES=-Id:\work\feature1

      ビルド プロセスによってカスタム インクルードが make ユーティリティのコマンド ライン呼び出しに渡され、さらに、コンパイラに渡される全体のフラグに追加されます。

#include ステートメントとインクルード パスの使用

ビルド プロセスで #include ステートメントとインクルード パスを使用する際に以下のアプローチについて検討します。これにより、引き続き移植可能なコードを生成して、将来のバージョンとの互換性問題を最小限にできます。

追加のヘッダー ファイルが次の場所にあると仮定します。

c:\work\feature1\foo.h
c:\work\feature2\bar.h
  • 1 つ目のアプローチでは、次のようにファイル名のみを #include ステートメントに含めます。

    #include "foo.h"
    #include "bar.h"

    そして、コンパイラに渡されるインクルード パスに、ヘッダー ファイルが存在するフォルダーが含まれるようにします。

    cc -Ic:\work\feature1 -Ic:\work\feature2     ...
  • もう 1 つのアプローチでは、#include ステートメント内で相対パスを使用し、インクルード パスを使用してこれらの相対パス用のアンカー フォルダーを指定します。次に例を示します。

    #include "feature1\foo.h"
    #include "feature2\bar.h"

そして、コンパイラにアンカー フォルダーを指定します (\work など)。

 cc -Ic:\work   ...

避けるべきフォルダーの依存関係

ビルド プロセスを使用するときには、model_ert_rtw フォルダーや slprj フォルダーのような、ビルド プロセスのCode generation folder内のフォルダーへの依存を避けます。#include ステートメント内に、生成されるソース ファイルの場所への相対パスを使用しないでください。たとえば、MATLAB のコード生成フォルダーが c:\work の場合、ビルド プロセスは model.c ソース ファイルを次のようなサブフォルダーに生成します。

c:\work\model_ert_rtw\model.c

model.c ファイルには次の形式の #include ステートメントが含まれています。

#include "..\feature1\foo.h"
#include "..\feature2\bar.h"

相対パスによってコード ジェネレーターのフォルダー構造への依存関係が作られるため、他のいずれかの推奨されるアプローチを使用することをお勧めします。

関連するトピック