exponenta event banner

Использование API rtwmakecfg.m для настройки созданных Makefiles

Как подход к цепочке инструментов, так и подход makefile шаблона для построений позволяют добавлять следующие элементы в созданные makefile:

  • Исходные папки

  • Включить папки

  • Имена библиотек

  • Объекты модуля

О функции rtwmakecfg

Использование rtwmakecfg эта информация добавляется в make-файл во время операции построения S-функций. rtwmakecfg функция полезна при указании добавленных источников и библиотек для построения модели, содержащей один или несколько блоков S-функций.

Чтобы добавить информацию, относящуюся к S-функции, в make-файл:

  1. Создание языка MATLAB ®rtwmakecfg функции в rtwmakecfg.m файл. Генератор кода связывает этот файл с функцией S в зависимости от расположения папки. Создание функции rtwmakecfg описывает требования для rtwmakecfg функция и данные, которые она возвращает.

  2. Если используется подход makefile шаблона, измените TMF целевого объекта таким образом, чтобы он поддерживал расширение макросов для информации, которая rtwmakecfg функция возвращает. Изменение Makefile шаблона для rtwmakecfg описывает необходимые изменения. Если используется подход toolchain, информация, возвращаемая функцией rtwmakecfg, используется созданным make-файлом; дальнейшая настройка не требуется.

После фазы TLC процесса построения при генерации make-файла генератор кода выполняет поиск rtwmakecfg.m в папке, содержащей файл MEX S-функции. Если он находит файл, процесс построения вызывает rtwmakecfg функция.

Создание функции rtwmakecfg

Создать rtwmakecfg.m файл, содержащий rtwmakecfg функция в той же папке, что и компонент S-функции (MEX-файл с расширением, зависящим от платформы, например .mexext в системах Microsoft ® Windows ®). Функция должна возвращать структурированный массив, содержащий эти поля.

ОбластьОписание
makeInfo.includePathМассив ячеек, указывающий дополнительные имена папок включения, организованный как вектор строки. Процесс построения расширяет имена папок в инструкции по включению в созданный make-файл.
makeInfo.sourcePathМассив ячеек, указывающий дополнительные имена исходных папок, организованный как вектор строки. Включите имена папок файлов, введенных в поле S-функциональных модулей в диалоговом окне S-Function Block Parameters или в SFunctionModules параметр блока, если они находятся не в той же папке, что и S-функция. Процесс построения расширяет имена папок в правила создания в созданном make-файле.
makeInfo.sourcesМассив ячеек, указывающий дополнительные имена исходных файлов (C или C++), организованный как вектор строки. Не включайте имя S-функции или файлы, введенные в поле S-функциональных модулей в диалоговом окне S-Function Block Parameters или в SFunctionModules параметр блока. Процесс построения расширяет имена файлов в переменные создания, содержащие исходные файлы. Укажите только имена файлов (с расширением). Укажите информацию о пути с помощью sourcePath поле.
makeInfo.linkLibsObjsМассив ячеек, указывающий дополнительные полные пути к файлам объектов или библиотек, с которыми связан созданный код. Процесс построения не компилирует указанные объекты и библиотеки. Однако он включает их при связывании конечного исполняемого файла. Это включение может быть полезно для включения библиотек, которые не требуется перекомпилировать процессу построения или для которых исходные файлы недоступны. Этот элемент можно также использовать для интеграции исходных файлов с языков, отличных от C и C++. Такая интеграция возможна, если сначала создать совместимый с C файл объекта или библиотеку вне процесса построения.
makeInfo.precompileЛогический флаг, указывающий, указаны ли библиотеки в rtwmakecfg.m файл существует в указанном расположении (precompile==1) или если в процессе построения необходимо создать библиотеки в папке сборки (precompile==0).
makeInfo.libraryСтруктурный массив, который задает дополнительные библиотеки времени выполнения и объекты модуля, организованные как вектор строки. Процесс построения расширяет информацию в правила создания в созданном make-файле. Список полей библиотеки см. в следующей таблице.

makeInfo.library поле состоит из следующих элементов.

ЭлементОписание
makeInfo.library(n).NameСимвольный массив, указывающий имя библиотеки (без расширения).
makeInfo.library(n).LocationСимвольный массив, указывающий папку, в которой находится библиотека при предварительной компиляции. Дополнительные сведения см. в описании makeInfo.precompile в предыдущей таблице. Цель может использовать TargetPreCompLibLocation для переопределения этого значения. См. раздел Указание расположения предварительно скомпилированных библиотек.
makeInfo.library(n).ModulesМассив ячеек, указывающий базовые имена исходных файлов C или C++ (без расширения), составляющих библиотеку. Не включайте расширение файла. make-файл добавляет расширение объекта.

Примечание

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 содержит пробелы, при построении путь не преобразуется в его не-пространственный эквивалент. Если поддерживаемые среды построения не поддерживают пробелы в путях, обратитесь к разделу Поддержка процессов построения имен папок с пробелами или специальными символами.

Изменение Makefile шаблона для rtwmakecfg

Чтобы развернуть информацию, которая rtwmakecfg генерирует, изменяет следующие разделы в TMF цели:

  • Include Path

  • C Flags и/или Additional Libraries

  • Rules

Возможно, эти примеры кода TMF не применимы к утилите make. Дополнительные примеры см. в документах GRT или ERT TMF, расположенных в matlabroot/toolbox/coder/compile/tmf.

Добавить имена папок в путь включения Makefile

Следующий пример кода TMF добавляет имена папок к пути включения в созданный make-файл:

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

Также, ADD_INCLUDES макрос должен быть добавлен в INCLUDES линия.

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

Добавление имен библиотек в Makefile

Следующий пример кода TMF добавляет имена библиотек в созданный make-файл.

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 добавляет правила в созданный файл make.

|>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<|