Чтобы сконфигурировать или настроить шаблон make-файла (TMF), вы должны ознакомиться с тем, как make
команда работает и как она обрабатывает make-файл (.mk
файл). Вы также должны понять правила сборки make-файлов. Для получения информации по этим темам см. документацию, предоставляемую утилитой make, которую вы используете.
Шаблон make-файла содержит лексемы. Процесс сборки расширяет лексемы и создает make-файлы:
- Компилирует и связывает код, сгенерированный из компонентов модели.model
.mk
rtwshared.mk
- Скомпилирует сгенерированный общий код утилиты.
make-файлы (
) используйте команды, специфичные для вашего компьютера разработчика.model_or_sharedutils
.mk
The make_rtw
команда (или другая команда, обеспечиваемая некоторыми целями) направляет процесс генерации
. The model_or_sharedutils
.mkmake_rtw
команда обрабатывает TMF, заданный на панели Code Generation диалогового окна Параметры конфигурации. make_rtw
копирует TMF, линию за линией, расширяя каждый встречающуюся лексему. Шаблон Make Лексем Expanded by make_rtw приводит список лексем и их расширений.
Эти лексемы используются несколькими способами расширенным make-файлом:
Управление условным поведением в файле make. Условия используются для управления списками исходных файлов, именами библиотек, целевым объектом, который будет создан, и другой информацией, связанной со сборкой.
Чтобы предоставить определения макросов для компиляции файлов, например, -DINTEGER_CODE=1
.
Шаблоны лексем make-файла расширены make_rtw
Лексема | Расширение |
---|---|
Общее назначение | |
| Флаги Linker автоматически добавляются блоками. |
| Альтернативный полный путь для MATLAB® исполняемый; значение отличается от значения для |
| Альтернативный полный путь для установки MATLAB; значение отличается от значения для |
| Опции переданы в |
| True (1), когда вы выбираете параметр конфигурации модели Single output/update function, в противном случае False (0). Используется для определения макроса |
| Флаги компилятора в группе, отличной от
|
| Тип компьютера. Смотрите |
| Определения макросов препроцессора в группе, отличной от Определение макроса препроцессора в Для примера некоторые файлы make-файлов шаблонов содержат следующие операторы: ... NUMST = |>NUMST<| ... CPP_REQ_DEFINES1 = ... -DNUMST=$(NUMST) ... NUMST = |>NUMST<| и NUMST является определением макроса препроцессора в buildInfo , тогда процесс сборки не расширяет его в DEFINES_OTHER .Процесс сборки выдает предупреждение, если
|
| Расположение предварительно скомпилированного файла библиотеки. The |
| Имя библиотеки. Для примеров смотрите Расположение библиотеки управления и Именование во время сборки и Изменение Make-файла шаблона для rtwmakecfg. |
| Суффикс библиотеки. The |
| True (1) для включения генерации кода поддержки режима external mode, в противном случае False (0). |
| Индекс транспортного механизма (для примера, |
| True (1), если для режима external mode выбрано статическое выделение памяти. Ложь (0), если выбрано динамическое выделение памяти. |
| Размер статического буфера выделения памяти для режима external mode. |
| True (1), когда параметр конфигурации модели Create block установлен в SIL , в противном случае False (0). Используется для управления целевым файлом make сборки. |
| True (1), когда выбран параметр конфигурации <reservedrangesplaceholder1> модели, в противном случае False (0). Используется для определения макроса |
| True (1), когда параметр конфигурации модели Support floating-point numbers очищен, в противном случае False (0). |
|
|
| True (1), когда выбран параметр конфигурации <reservedrangesplaceholder1> модели, в противном случае False (0). MAT_FILE является необходимым определением макроса при компиляции исходного кода, а также используется для включения кода регистрации в процесс сборки. |
| Расположение исполняемой программы MATLAB. |
| Путь к месту установки MATLAB. |
|
|
| Расширение файла MEX. Смотрите |
| Дополнительные сгенерированные исходные модули. Например, можно разделить большую модель на два файла, |
| Имена файлов объектов ( |
| Имя Simulink® блок, строящаяся в настоящее время. |
| True (1), если режим решателя является многозадачным, в противном случае False (0). |
| Количество непрерывных состояний. |
| Количество шагов расчета в модели. |
| Версия релиза MATLAB. |
| Список библиотек S-функций, доступных для связывания. |
| Имя исходного файла решателя, например |
| Объект решателя ( |
|
|
| True (1), если частоты дискретизации непрерывной задачи и первой дискретной задачи равны, в противном случае False (0). |
S-функция и информационная поддержка сборки Примечание Для примеров лексем в этом разделе смотрите Изменение шаблона Makefile для rtwmakecfg. | |
| Список имен папок, добавляемых в путь включения. Кроме того, ADD_INCLUDES макрос должен быть добавлен в INCLUDES линия. |
| Список имен библиотек. |
| Имена библиотечных модулей в |>START_EXPAND_LIBRARIES<| и |>START_PRECOMP_LIBRARIES<| списки библиотек. |
| Правила make-файла. |
| Список предварительно скомпилированных имен библиотек. |
Модель-ссылка Примечание Для примеров лексем в этом разделе смотрите Предоставление поддержки ссылок на модели в TMF. | |
| Для параллельных сборок, текущая рабочая папка (pwd ) на момент запуска сборки. |
| Имя файла библиотеки, сгенерированного для текущей модели. |
| Список моделей, на которые ссылается верхняя часть. |
| Список ссылочных библиотек модели, с которыми связана верхняя модель. |
| Имя файла ответа, с которым связана верхняя модель. Эта лексема действительна только для окружений сборки, поддерживающих файлы отклика linker. Пример его использования см. в . |
| Тип создаваемого целевого объекта. Возможные значения:
|
| Относительный путь от расположения сгенерированного make-файла до рабочей папки MATLAB. |
| Папка генерации кода на момент запуска сборки. Эта лексема необходима для параллельных построений. |
Эти лексемы расширяются путем подстановки значений параметров, известных процессу сборки. Для примера, если исходная модель содержит блоки с двумя различными шагами расчета, оператор TMF
NUMST = |>NUMST<|
расширяется до:
NUMST = 2
В дополнение к вышесказанному make_rtw
расширяет лексемы из других источников:
Специфичное для цели лексемы, заданное в целевых опциях диалогового окна Параметров конфигурации
Структуры в rtwoptions
раздел системного целевого файла. Структуры в rtwoptions
массив структур, содержащий поле makevariable
расширяются.
Следующий пример извлечен из
. Раздел, начинающийся с matlabroot
/ rtw/c/grt/grt.tlcBEGIN_RTW_OPTIONS
содержит код MATLAB, который настраивает rtwoptions
. Следующая директива вызывает |>EXT_MODE<|
лексема, который будет расширен до 1
(on) или 0
(off), в зависимости от того, как вы устанавливаете опции режима external mode.
rtwoptions(2).makevariable = 'EXT_MODE'
После создания
из вашего TMF процесс сборки вызывает model_or_sharedutils
.mkmake
команда. Для вызова make
процесс сборки выдает эту команду.
makecommand -f model_or_sharedutils.mk
определяется makecommand
MAKECMD
макрос в целевом файле системы TMF (см. «Структура шаблона make-файла»). Можно задать дополнительные опции для make
при помощи команды model параметра конфигурации Make. (См. разделы «Задание Команда и шаблонов MakeFiles и Make Options».)
Для примера укажите OPT_OPTS=-O2
в командном поле Make приводит к make_rtw
чтобы сгенерировать следующую make
команда.
makecommand -f model_or_sharedutils.mk OPT_OPTS=-O2
Комментарий в верхней части TMF задает доступное make
опции команды. Если эти опции не обеспечивают достаточную гибкость, можно сконфигурировать собственный TMF.
Утилита make позволяет управлять почти каждым аспектом создания программы в реальном времени. Существует несколько различных версий make
доступно. Генератор кода обеспечивает Фонд свободного программного обеспечения GNU®
make
для обоих UNIX®[1] и платформы ПК в подпапках для конкретной платформы в
matlabroot/bin
Возможно использование других версий make
с генератором кода, хотя рекомендуется использовать GNU Make. Чтобы быть совместимым с генератором кода, проверьте, что ваша версия make
поддерживает следующий формат команды.
makecommand -f model_or_sharedutils.mk
TMF имеет несколько разделов, включая следующие:
Abstract
- Описывает цели make-файла. Вот репрезентативный абстракт из TMF ERT в
:matlabroot
/ toolbox/coder/compile/tmf
# Abstract: # Template makefile for building a Windows-based stand-alone embedded # real-time version of Simulink model using generated C code and the # Microsoft Visual C/C++ compiler for x64. # # Note that this template is automatically customized by the build # procedure to create "<model>.mk" # # The following defines can be used to modify the behavior of the # build: # OPT_OPTS - Optimization option. See DEFAULT_OPT_OPTS in # vctools.mak for default. # OPTS - User specific options. # CPP_OPTS - C++ compiler options. # USER_SRCS - Additional user sources, such as files needed by # S-functions. # USER_INCLUDES - Additional include paths # (i.e. USER_INCLUDES="-Iwhere-ever -Iwhere-ever2") # # To enable debugging: # set DEBUG_BUILD = 1, which will trigger OPTS=-Zi (may vary with # compiler version, see compiler doc) # # This template makefile is designed to be used with a system target # file that contains 'rtwgensettings.BuildDirSuffix' see ert.tlc
Macros read by make_rtw
section - Определяет макросы, которые говорят make_rtw
как обработать TMF. Вот представитель Macros read by make_rtw
раздел из TMF GRT в
:matlabroot
/ toolbox/coder/compile/tmf
#------------------------ Macros read by make_rtw ----------------------------- # # The following macros are read by the build procedure: # # MAKECMD - This is the command used to invoke the make utility # HOST - What platform this template makefile is targeted for # (i.e. PC or UNIX) # BUILD - Invoke make from the build procedure (yes/no)? # SYS_TARGET_FILE - Name of system target file. MAKECMD = nmake HOST = PC BUILD = yes SYS_TARGET_FILE = any BUILD_SUCCESS = ^#^#^# Created # Opt in to simplified format by specifying compatible Toolchain TOOLCHAIN_NAME = [\ "Microsoft Visual C++ 2019 v16.0 | nmake (64-bit Windows)", \ "Microsoft Visual C++ 2017 v15.0 | nmake (64-bit Windows)", \ "Microsoft Visual C++ 2015 v14.0 | nmake (64-bit Windows)"]
Макросы в этом разделе могут включать:
MAKECMD
- Задает команду, используемую для вызова утилиты make. Для примера, если MAKECMD
= mymake
, затем make
вызывается команда
mymake -f
model_or_sharedutils
.mk
HOST
- определяет платформу, на которую нацелен этот TMF. Это может быть PC
, UNIX
,
(см. MATLAB computer_name
computer
команда), или ANY
.
BUILD
- Инструкции make_rtw
должен ли он ссылаться или нет make
из процедуры сборки. Задайте yes
или no
.
SYS_TARGET_FILE
- Задает имя системного целевого файла или значение any
. Это используется для проверки непротиворечивости по make_rtw
для проверки целевого системного файла, заданного на панели Target selection панели Code Generation диалогового окна Параметры конфигурации. Если вы задаете any
можно использовать TMF с любым системным целевым файлом.
BUILD_SUCCESS
- Когда make-файл создает статическую библиотеку, он создает BUILD_SUCCESS
строка, заданная, например, этим правилом в ert_vcx64.tmf
:
$(PRODUCT) : $(OBJS) $(LIBS) $(MODELREF_LINK_LIBS) @cmd /C "echo ### Linking ..." $(LD) $(LDFLAGS) $(LIBS) \ @$(CMD_FILE) @$(MODELREF_LINK_RSPFILE) -dll -def:$(MODEL).def -out:$@ @cmd /C "echo $(BUILD_SUCCESS) dynamically linked library $(PRODUCT)"
Когда процесс сборки находит BUILD_SUCCESS
строка, она опрашивает существование обновленного файла статической библиотеки. Процесс сборки не связывает файл библиотеки с исполняемым файлом, пока процесс сборки не сможет подтвердить наличие файла библиотеки с обновленной временной меткой в файловой системе.
Если процесс сборки не находит BUILD_SUCCESS
в журнале компиляции процесс сборки принимает, что обновленный архив библиотеки доступен в файловой системе. При необходимости процесс сборки связывает библиотеку с исполняемым файлом.
Tokens expanded by make_rtw
section - Определяет лексемы, которые make_rtw
расширяется. Вот краткий отрывок от представителя Tokens expanded by make_rtw
раздел от ERT TMFs в
:matlabroot
/ toolbox/coder/compile/tmf/
#---------------------- Tokens expanded by make_rtw ---------------------------- # # The following tokens, when wrapped with "|>" and "<|" are expanded by the # build procedure. # # MODEL_NAME - Name of the Simulink block diagram # MODEL_MODULES - Any additional generated source modules # MAKEFILE_NAME - Name of makefile created from template makefile <model>.mk # MATLAB_ROOT - Path to where MATLAB is installed. ... MODEL = |>MODEL_NAME<| MODULES = |>MODEL_MODULES<| PRODUCT = |>PRODUCT<| MAKEFILE = |>MAKEFILE_NAME<| MATLAB_ROOT = |>MATLAB_ROOT<| ...
Дополнительные сведения о лексемах TMF см. в разделах Шаблон make-файла Лексемах Развернутый по make_rtw.
Последующие разделы варьируются в зависимости от компилятора, хоста и цели. Некоторые общие разделы включают Model and reference models
, External mode
, Tool Specifications
или Tool Definitions
, Include Path
, C Flags
, Additional Libraries
, и Source Files
.
Rules
Раздел - Содержит правила создания, используемые при создании исполняемого файла из сгенерированного исходного кода. Правила сборки обычно характерны для вашей версии make. The Rules
за разделом могут следовать связанные разделы, такие как Dependencies
.
Использование макросов и шаблонов, соответствующих выражениям в шаблоне make-файла
Ошибка тайм-аута при создании общего служебного кода с пользовательским шаблоном make-файла
В этом разделе описывается механика настройки пользовательского шаблона make-файла (TMF) и включения его в процесс сборки. В нем также рассматриваются методы модификации TMF и ФАЙЛА MATLAB механизмов, связанных с TMF.
Перед созданием пользовательского TMF необходимо прочитать Соглашения о именовании папок и файлов, чтобы понять структуру папок и требования к пути MATLAB для пользовательских целей.
Чтобы настроить или создать новый TMF, скопируйте существующий GRT или ERT TMF из matlabroot
/toolbox/coder/compile/tmf
.
Поместите копию в ту же папку, что и связанный системный целевой файл. Обычно это mytarget/mytarget
папка в структуре целевой папки. Затем переименуйте свой TMF (для примера, mytarget.tmf
) и измените его.
Чтобы позволить процессу сборки найти и выбрать ваш TMF, вы должны предоставить информацию в системном заголовке файла целевого файла (см. System Target File Structure). Для цели, которая реализует один TMF, стандартным способом определения TMF, который будет использоваться в процессе сборки, является использование директивы TMF заголовка файла целевого системного файла.
TMF: mytarget.tmf
В этом разделе показан, на примере, как использовать макросы и выражения, соответствующие файловому шаблону, в TMF, чтобы сгенерировать команды в
.model_or_sharedutils
.mk
Делайте служебные процессы
и генерирует набор команд на основе правил зависимостей, определенных в model_or_sharedutils
.mk
. После model_or_sharedutils
.mkmake
генерирует набор команд для создания или перестроения test
, make
выполняет их.
Например, чтобы создать программу под названием test
, make
необходимо связать файлы объектов. Однако, если файлы объектов не существуют или устарели, make
необходимо скомпилировать исходный код. Таким образом, существует зависимость между исходным и объектным файлами.
Каждая версия make
немного отличается своими функциями и тем, как заданы правила. Например, рассмотрим программу, называемую test
который создается из двух источников, file1.c
и file2.c
. Использование большинства версий make
, правила зависимости были бы
test: file1.o file2.o cc -o test file1.o file2.o file1.o: file1.c cc -c file1.c file2.o: file2.c cc -c file2.c
В этом примере UNIX[2] окружение принято. В среде ПК расширения файлов и команды compile и link отличаются.
При обработке первого правила
test: file1.o file2.o
make
видит, что строить test
, он должен построить file1.o
и file2.o
. Как создать file1.o
, make
обрабатывает правило
file1.o: file1.c
Если file1.o
не существует, или если file1.o
старше file1.c
, make
компилирует file1.c
.
Формат TMF следует вышеописанному примеру. Наши TMF используют дополнительные функции make
такие как макросы и выражения, соответствующие шаблону файла. В большинстве версий make
, макрос задан как
MACRO_NAME = value
Ссылки на макросы делаются с помощью $(MACRO_NAME)
. Когда make
видит эту форму выражения, она заменяет value
для $(MACRO_NAME)
.
Можно использовать выражения соответствия шаблона, чтобы сделать правила зависимостей более общими. Для примера использование GNU[3] Сделайте, вы можете заменить два "file1.o: file1.c
«и» file2.o: file2.c
"правила с одним правилом
%.o : %.c cc -c $<
Обратите внимание, что $<
в предыдущем примере является специальным макросом, который приравнивается к файлу зависимостей (то есть file1.c
или file2.c
). Таким образом, используя макросы и "%
"символ соответствия шаблона, предыдущий пример может быть сокращен до
SRCS = file1.c file2.c OBJS = $(SRCS:.c=.o) test: $(OBJS) cc -o $@ $(OBJS) %.o : %.c cc -c $<
Обратите внимание, что $@
макрос выше является другим специальным макросом, который приравнивается к имени текущего целевого объекта зависимостей, в этом случае test
.
Этот пример генерирует список объектов (OBJS
) из списка источников (SRCS
) с помощью функции подстановки текста для макро-расширения. Он заменяет расширение исходного файла (для примера, .c
) с расширением файла объекта (.o
). Этот пример также обобщил правило сборки для программы, test
, для использования специального "$@
"макрос.
TMF обеспечивают лексемы, которые позволяют добавлять следующие элементы к сгенерированным make-файлам:
Исходные папки
Включить папки
Имена библиотек во время выполнения
Объекты модуля во время выполнения
S-функции могут добавить эту информацию в make-файл при помощи rtwmakecfg.m
Файл функция. Эта функция особенно полезна при построении модели, которая содержит один или несколько ваших блоков S-Function, таких как блоки драйверов устройств.
Чтобы добавить информацию, относящуюся к S-функции, в make-файл,
Создайте функцию rtwmakecfg
в файловой rtwmakecfg.m
. Генератор кода связывает этот файл с вашей S-функцией на основе расположения его папки.
Измените TMF цели так, чтобы он поддерживал расширение макроса для информации, возвращенной rtwmakecfg
функций.
После фазы TLC процесса сборки, при генерации make-файла из TMF, процесс сборки ищет rtwmakecfg.m
файл в папке, содержащей компонент S-функции. Если он находит файл, процесс сборки вызывает rtwmakecfg
функция. Для получения дополнительной информации смотрите Использовать rtwmakecfg.m API для настройки сгенерированных make-файлов.
Если вы хотите, чтобы ваша пользовательская целевая система на основе ERT поддерживала непрерывное время, необходимо обновить файл make-файла (TMF) шаблона и статический основной программный модуль (для примера, mytarget_main.c
) для вашей цели.
Изменения шаблона make-файла. Добавьте NCSTATES
расширение токена после NUMST
расширение токена следующим образом:
NUMST = |>NUMST<| NCSTATES = |>NCSTATES<|
В сложение добавить NCSTATES
на CPP_REQ_DEFINES
макрос, как в следующем примере:
CPP_REQ_DEFINES = -DMODEL=$(MODEL) -DNUMST=$(NUMST) -DNCSTATES=$(NCSTATES) \ -DMAT_FILE=$(MAT_FILE) -DINTEGER_CODE=$(INTEGER_CODE) \ -DONESTEPFCN=$(ONESTEPFCN) -DTERMFCN=$(TERMFCN) \ -DHAVESTDIO -DMULTI_INSTANCE_CODE=$(MULTI_INSTANCE_CODE) \
Изменения основного программного модуля. Основной программный модуль задает статическую главную функцию, которая управляет планированием задач для поддерживаемых режимов постановки одно- и многоскоростных моделей. NUMST
(количество шагов расчета в модели) определяет, вызывает ли основная функция многократный или односкоростной код. Однако, когда модель использует непрерывное время, не полагайтесь на NUMST
непосредственно.
Когда у модели есть непрерывное время и флаг TID01EQ
верно, и непрерывное время, и самое быстрое дискретное время рассматриваются как одна скорость в сгенерированном коде. Код, сопоставленный с самой быстрой дискретной скоростью, охраняется основной проверкой временного шага. Когда модель имеет только две скорости, и TID01EQ
true, сгенерированный код имеет односкоростной интерфейс вызова.
Чтобы поддержать модели, которые имеют непрерывное время, обновите статический основной модуль, чтобы взять TID01EQ
принять во внимание следующее:
Перед NUMST
ссылается в файле, добавьте следующий код:
#if defined(TID01EQ) && TID01EQ == 1 && NCSTATES == 0 #define DISC_NUMST (NUMST - 1) #else #define DISC_NUMST NUMST #endif
Замените образцы NUMST
в файле по DISC_NUMST
.
Смотрите Support Model Referencing для получения важной информации об изменениях TMF, которые вы, возможно, должны будете сделать, чтобы поддержать функции ссылки на модели генератора кода.
Примечание
Если вы используете TMF без переменной MODELREFS
Возможно, файл использовался с предыдущим релизом программного обеспечения Simulink. Если вы хотите, чтобы ваш TMF поддерживал ссылки на модель, добавьте MODELREFS
в файл создания.
Если процесс сборки использует пользовательский файл make-файла шаблона для создания файла make-файла для общего кода утилиты, процесс сборки создает ошибку timeout, когда применяются все эти условия:
Параметр конфигурации GenCodeOnly
является 'off'
.
The BUILD_SUCCESS
сообщение выводится во время make
вызов rtwshared.mk
.
The make
вызов rtwshared.mk
не обновляет конечный продукт (обычно rtwshared.lib
).
Чтобы избежать ошибки, обновите пользовательский шаблон make-файла так, чтобы make
вызов генерирует BUILD_SUCCESS
сообщение только, когда конечный продукт сгенерирован (как идентифицировано make
переменная PRODUCT
). Кроме того, если процесс сборки не использует сгенерированный make-файл, отключите генерацию make-файла, установив параметр конфигурации GenerateMakefile
на 'off'
.
[1] UNIX является зарегистрированным товарным знаком The Open Group в США и других странах.
[2] UNIX является зарегистрированным товарным знаком The Open Group в США и других странах.
[3] GNU является зарегистрированным товарным знаком Фонда свободного программного обеспечения.