Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

生成された makefile を rtwmakecfg.m API を使用してカスタマイズ

ツールチェーン アプローチとテンプレート makefile アプローチの両方のビルドにより、生成された makefile に以下の項目が追加されます。

  • ソース フォルダー

  • インクルード フォルダー

  • ライブラリ名

  • モジュール オブジェクト

関数 rtwmakecfg について

関数 rtwmakecfg を使用して、S-Function のビルド操作中にこの情報を makefile に追加します。関数 rtwmakecfg は、追加したソースとライブラリを指定して、1 つ以上の S-Function ブロックが含まれるモデルをビルドする際に役に立ちます。

S-Function に関連する情報を makefile に追加するには、次を行います。

  1. ファイル rtwmakecfg.m で MATLAB® 言語関数 rtwmakecfg を作成します。コード ジェネレーターは、このファイルのフォルダーの場所に基づいて、このファイルを S-Function に関連付けます。rtwmakecfg 関数の作成では、関数 rtwmakecfg の要件およびこの関数が返すデータについて説明します。

  2. テンプレート makefile アプローチを使用する場合、関数 rtwmakecfg が返す情報のマクロ展開をサポートするように、ターゲットの TMF を変更します。rtwmakecfg 用のテンプレート makefile の変更では、必要な変更について説明します。ツールチェーン アプローチを使用する場合、関数 rtwmakecfg が返す情報は生成される makefile に使用されるため、その他の構成は必要ありません。

ビルド プロセスの TLC フェーズの後、makefile を生成する際に、コード ジェネレーターは S-Function MEX ファイルを含んでいるフォルダー内で rtwmakecfg.m ファイルを検索します。ファイルが検出された場合、ビルド プロセスは関数 rtwmakecfg を呼び出します。

rtwmakecfg 関数の作成

関数 rtwmakecfg を含む rtwmakecfg.m ファイルを S-Function コンポーネント (Microsoft® Windows® システム上の .mexext のように、プラットフォーム依存の拡張子が付いた MEX ファイル) と同じフォルダーに作成します。関数は、以下のフィールドを含む構造体配列を返さなければなりません。

フィールド説明
makeInfo.includePath追加のインクルード フォルダー名を指定する cell 配列 (行ベクトルとして構成されます)。ビルド プロセスは、生成された makefile 内の include 命令にフォルダー名を拡張します。
makeInfo.sourcePath追加のソース フォルダー名を指定する cell 配列 (行ベクトルとして構成されます)。[S-Function ブロック パラメーター] ダイアログ ボックスの [S-Function モジュール] フィールドに入力されたか、ファイルが S-Function と同じフォルダー内に存在しない場合はブロックの SFunctionModules パラメーターに入力されたファイルのフォルダー名を含めます。ビルド プロセスは、生成された makefile 内の make 規則にフォルダー名を拡張します。
makeInfo.sources追加のソース ファイル名 (C または C++) を指定する cell 配列 (行ベクトルとして構成されます)。[S-Function ブロック パラメーター] ダイアログ ボックスの [S-Function 名]、[S-function モジュール] フィールドに入力されるファイル、あるいはブロックの SFunctionModules パラメーターに入力されるファイルは含まれません。ビルド プロセスは、ソース ファイルを含む make 変数にファイル名を拡張します。拡張子を含むファイル名だけを指定します。パス情報は sourcePath フィールドで指定します。
makeInfo.linkLibsObjs生成コードがリンクするオブジェクトまたはライブラリ ファイルへの追加の完全修飾パスを指定する cell 配列。ビルド プロセスは、指定されたオブジェクトおよびライブラリをコンパイルしません。しかし、これらのオブジェクトおよびライブラリは、最終的な実行可能ファイルをリンクするときに含まれます。このように含めると、ビルド プロセスで再コンパイルしないライブラリまたはソース ファイルが使用できないライブラリを組み込むときに便利です。この要素を使用して、C と C++ 以外の言語からソース ファイルを統合することもできます。この統合は、最初に C 互換のオブジェクト ファイルまたはライブラリをビルド プロセスの外部で作成した場合に可能です。
makeInfo.precompilertwmakecfg.m ファイルに指定されたライブラリが指定された場所に存在するかどうか (precompile==1) や、ビルド プロセス中にビルド フォルダーにライブラリを作成しなければならないかどうか (precompile==0) を示す boolean フラグ。
makeInfo.library追加のランタイム ライブラリとモジュール オブジェクトを指定する構造体配列 (行ベクトルとして構成されます)。ビルド プロセスは、生成された makefile 内の make 規則に情報を拡張します。ライブラリ フィールドの一覧は、以下の表を参照してください。

makeInfo.library フィールドは以下の要素で構成されます。

要素説明
makeInfo.library(n).Name拡張子を除くライブラリ名を指定する文字配列。
makeInfo.library(n).Locationプリコンパイル時にライブラリを配置するフォルダーを指定する文字配列。詳細は、前の表の makeInfo.precompile の説明を参照してください。ターゲットは、TargetPreCompLibLocation パラメーターを指定して、この値をオーバーライドできます。プリコンパイル済みのライブラリの位置を指定を参照してください。
makeInfo.library(n).Modulesライブラリで構成される C または C++ ソース ファイルの基本名 (拡張子なし) を指定する cell 配列。ファイルの拡張子は含めないでください。makefile によってオブジェクト拡張子が追加されます。

メモ

makeInfo.library フィールドでは、各ライブラリとその作成方法を完全に指定しなければなりません。makeInfo.library(n).Modules 要素内のモジュール リストは空にはできません。リンク専用のライブラリを指定するには、代わりに makeInfo.linkLibsObjs フィールドを使用します。

例:

 disp(['Running rtwmakecfg from folder: ',pwd]);
    makeInfo.includePath = { fullfile(pwd, 'somedir2') };
    makeInfo.sourcePath = {fullfile(pwd, 'somedir2'), fullfile(pwd, 'somedir3')};
    makeInfo.sources  = { 'src1.c', 'src2.cpp'};
    makeInfo.linkLibsObjs = { fullfile(pwd, 'somedir3', 'src3.object'),...
                              fullfile(pwd, 'somedir4', 'mylib.library')};
    makeInfo.precompile = 1;
    makeInfo.library(1).Name     = 'myprecompiledlib';
    makeInfo.library(1).Location = fullfile(pwd,'somdir2','lib');
    makeInfo.library(1).Modules  = {'srcfile1' 'srcfile2' 'srcfile3' };

メモ

rtwmakecfg.m API で指定したパスにスペースが含まれる場合、パスはビルド プロセスによってスペースを含まない形式に変換されません。サポート対象のビルド環境で、パスでスペースがサポートされない場合は、スペースまたは特殊文字を含むフォルダー名のビルド プロセスでのサポートを参照してください。

rtwmakecfg 用のテンプレート makefile の変更

関数 rtwmakecfg が生成する情報を拡張するには、ターゲットの TMF の以下のセクションを変更します。

  • Include Path

  • C Flags および/または Additional Libraries

  • Rules

これらの TMF コード例は、make ユーティリティに適用されない場合があります。追加の例については、matlabroot/toolbox/coder/compile/tmf にある GRT または ERT TMF を参照してください。

makefile インクルード パスへのフォルダー名の追加

次の TMF コード例は、生成された makefile のインクルード パスにフォルダー名を追加します。

ADD_INCLUDES = \
|>START_EXPAND_INCLUDES<|   -I|>EXPAND_DIR_NAME<| \
|>END_EXPAND_INCLUDES<|

また、INCLUDES 行に ADD_INCLUDES マクロを追加しなければなりません。

INCLUDES = -I. -I.. $(ADD_INCLUDES) $(USER_INCLUDES)

makefile へのライブラリ名の追加

次の TMF コード例は、生成された makefile にライブラリ名を追加します。

LIBS =
|>START_PRECOMP_LIBRARIES<|
LIBS += |>EXPAND_LIBRARY_NAME<|.a |>END_PRECOMP_LIBRARIES<|
|>START_EXPAND_LIBRARIES<|
LIBS += |>EXPAND_LIBRARY_NAME<|.a |>END_EXPAND_LIBRARIES<|

詳細については、ビルド中のライブラリの位置および名前付けの制御を参照してください。

makefile へのルールの追加

以下の TMF コード例は、生成された makefile に規則を追加します。

|>START_EXPAND_RULES<|
$(BLD)/%.o: |>EXPAND_DIR_NAME<|/%.c $(SRC)/$(MAKEFILE) rtw_proj.tmw
    @$(BLANK)
    @echo ### "|>EXPAND_DIR_NAME<|\$*.c"
    $(CC) $(CFLAGS) $(APP_CFLAGS) -o $(BLD)$(DIRCHAR)$*.o \
    |>EXPAND_DIR_NAME<|$(DIRCHAR)$*.c > $(BLD)$(DIRCHAR)$*.lst
|>END_EXPAND_RULES<|

|>START_EXPAND_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \
|>START_EXPAND_MODULES<|    |>EXPAND_MODULE_NAME<|.o \
|>END_EXPAND_MODULES<|

|>EXPAND_LIBRARY_NAME<|.a : $(MAKEFILE) rtw_proj.tmw
$(MODULES_|>EXPAND_LIBRARY_NAME<|:%.o=$(BLD)/%.o)
    @$(BLANK)
    @echo ### Creating $@
    $(AR) -r $@ $(MODULES_|>EXPAND_LIBRARY_NAME<|:%.o=$(BLD)/%.o)
|>END_EXPAND_LIBRARIES<|

|>START_PRECOMP_LIBRARIES<|MODULES_|>EXPAND_LIBRARY_NAME<| = \
|>START_EXPAND_MODULES<|    |>EXPAND_MODULE_NAME<|.o \
|>END_EXPAND_MODULES<|

|>EXPAND_LIBRARY_NAME<|.a : $(MAKEFILE) rtw_proj.tmw
$(MODULES_|>EXPAND_LIBRARY_NAME<|:%.o=$(BLD)/%.o)
    @$(BLANK)
    @echo ### Creating $@
    $(AR) -r $@ $(MODULES_|>EXPAND_LIBRARY_NAME<|:%.o=$(BLD)/%.o)
|>END_PRECOMP_LIBRARIES<|