Чтобы настроить или настроить make-файл шаблона (TMF), необходимо знать, как make работает команда и как она обрабатывает make-файл (.mk файл). Также следует понимать правила построения makefile. Для получения информации по этим темам см. документацию, предоставленную с используемой утилитой make.
Файл макета шаблона содержит маркеры. Процесс построения расширяет маркеры и создает makefile:
- Компилирует и связывает код, созданный из компонентов модели.model.mk
rtwshared.mk - Компилирует созданный общий служебный код.
Файлы макияжа () используйте команды, специфичные для компьютера разработчика.model_or_sharedutils.mk
make_rtw команда (или другая команда, предоставляемая с некоторыми целями) управляет процессом генерации . model_or_sharedutils.mkmake_rtw обрабатывает TMF, указанный на панели «Создание кода» диалогового окна «Параметры конфигурации». make_rtw последовательно копирует TMF, расширяя каждый обнаруженный маркер. В шаблоне Makefile Tokens Expansed by make_rtw перечислены маркеры и их расширения.
Эти маркеры используются несколькими способами в расширенном makefile:
Управление условным поведением в make-файле. Условия используются для управления списками исходных файлов, именами библиотек, предназначенными для построения целевыми объектами и другой информацией, связанной с построением.
Чтобы предоставить определения макросов для компиляции файлов, например, -DINTEGER_CODE=1.
Шаблоны маркеров Makefile расширены по make_rtw
| Символ | Расширение |
|---|---|
| Общее назначение | |
| Флаги компоновщика автоматически добавляются блоками. |
| Альтернативное полное имя пути для исполняемого файла MATLAB ®; значение отличается от значения для |
| Альтернативное полное имя пути для установки MATLAB; значение отличается от значения для |
| Параметры переданы в |
| True (1) при выборе параметра конфигурации модели Single output/update function, в противном случае False (0). Используется для определения макроса |
| Флаги компилятора в группе, отличной от
|
| Тип компьютера. См. MATLAB |
| Определения макросов препроцессора в группе, отличной от Определение макроса препроцессора в Например, некоторые makefile-шаблоны содержат следующие инструкции: ... NUMST = |>NUMST<| ... CPP_REQ_DEFINES1 = ... -DNUMST=$(NUMST) ... NUMST = |>NUMST<| и NUMST является определением макроса препроцессора в buildInfo, то процесс построения не расширяет его в DEFINES_OTHER.Процесс построения выдает предупреждение, если
|
| Расположение предварительно скомпилированного файла библиотеки. |
| Имя библиотеки. Примеры см. в разделе Расположение библиотеки управления и именование при построении и изменении Makefile шаблона для rtwmakecfg. |
| Библиотечный суффикс. |
| True (1) для включения генерации кода поддержки внешнего режима, в противном случае False (0). |
| Индекс транспортного механизма (например, |
| True (1), если для внешнего режима выбрано статическое выделение памяти. False (0), если выбрано динамическое выделение памяти. |
| Размер статического буфера выделения памяти для внешнего режима. |
| True (1), когда параметру конфигурации модели Create block присвоено значение SIL, в противном случае False (0). Используется для управления целью makefile сборки. |
| True (1), когда выбран параметр конфигурации модели Terminate function required, в противном случае False (0). Используется для определения макроса |
| True (1), когда параметр конфигурации модели Support (Поддержка чисел с плавающей запятой) очищен, в противном случае False (0). |
|
|
| True (1), когда выбран параметр конфигурации модели MAT-файл регистрации, в противном случае False (0). MAT_FILE является обязательным определением макроса при компиляции исходного кода, а также используется для включения кода регистрации в процесс построения. |
| Расположение исполняемой программы MATLAB. |
| Путь к месту установки MATLAB. |
|
|
| Расширение файла MEX. См. MATLAB |
| Дополнительные сгенерированные исходные модули. Например, можно разделить большую модель на два файла: |
| Имена файлов объектов ( |
| Имя формируемой в настоящее время блок-схемы Simulink ®. |
| True (1), если решатель работает в многозадачном режиме, в противном случае False (0). |
| Количество непрерывных состояний. |
| Количество образцов в модели. |
| Версия версии MATLAB. |
| Список библиотек S-функций, доступных для связывания. |
| Имя исходного файла решателя, например: |
| Объект решателя ( |
|
|
| True (1), если частоты дискретизации непрерывной задачи и первой дискретной задачи равны, в противном случае False (0). |
Информационная поддержка S-функций и построения Примечание Примеры маркеров в этом разделе см. в разделе Изменение Makefile шаблона для rtwmakecfg. | |
| Список имен папок, добавляемых к пути включения. Кроме того, ADD_INCLUDES макрос должен быть добавлен в INCLUDES линия. |
| Список имен библиотек. |
| Имена библиотечных модулей в |>START_EXPAND_LIBRARIES<| и |>START_PRECOMP_LIBRARIES<| списки библиотек. |
| Правила Makefile. |
| Список предварительно скомпилированных имен библиотек. |
Опорная поддержка модели Примечание Примеры маркеров в этом разделе см. в разделе Обеспечение поддержки ссылок на модель в TMF. | |
| Для параллельных построений текущая рабочая папка (pwd) в момент начала построения. |
| Имя файла библиотеки, созданного для текущей модели. |
| Список моделей, на которые ссылается верхняя модель. |
| Список библиотек ссылочных моделей, с которыми связана верхняя модель. |
| Имя файла ответа, с которым связана верхняя модель. Этот маркер допустим только для сред построения, поддерживающих файлы ответов компоновщика. Пример его использования см. в разделе . |
| Тип создаваемой цели. Возможные значения:
|
| Относительный путь от местоположения созданного make-файла к рабочей папке MATLAB. |
| Папка создания кода на момент запуска построения. Этот маркер необходим для параллельных построений. |
Эти маркеры расширяются путем подстановки значений параметров, известных процессу построения. Например, если исходная модель содержит блоки с двумя различными временами выборки, инструкция TMF
NUMST = |>NUMST<|
расширяется до:
NUMST = 2
В дополнение к вышесказанному, make_rtw расширяет маркеры из других источников:
Специфичные для цели маркеры, определенные в параметрах цели диалогового окна Параметры конфигурации (Configuration Parameters)
Структуры в rtwoptions раздел целевого файла системы. Структуры в rtwoptions структурный массив, содержащий поле makevariable расширяют.
Следующий пример извлечен из . Раздел, начинающийся с matlabroot/rtw/c/grt/grt.tlcBEGIN_RTW_OPTIONS содержит код MATLAB, устанавливающий rtwoptions. Следующая директива вызывает |>EXT_MODE<| токен будет расширен до 1 (на) или 0 (выкл.), в зависимости от способа установки параметров внешнего режима.
rtwoptions(2).makevariable = 'EXT_MODE'
После создания из вашего TMF процесс сборки вызывает model_or_sharedutils.mkmake команда. Призвать make, процесс сборки выдает эту команду.
makecommand -f model_or_sharedutils.mk
определяется makecommandMAKECMD макрос в системном целевом файле TMF (см. Структура Makefile шаблона). Можно указать дополнительные параметры для make с помощью параметра конфигурации модели Make. (См. разделы «Задание команд и шаблонов Makefiles» и «Параметры создания».)
Например, указание OPT_OPTS=-O2 в поле Создать причины команды make_rtw для создания следующего make команда.
makecommand -f model_or_sharedutils.mk OPT_OPTS=-O2
Комментарий в верхней части TMF указывает доступное make параметры команды. Если эти параметры не обеспечивают достаточной гибкости, можно настроить собственный TMF.
Утилита Make позволяет контролировать практически все аспекты построения программы в реальном времени. Существует несколько различных версий make доступно. Генератор кода предоставляет Free Software Foundation GNU
®make как для платформ UNIX ® [1], так и для ПК в папках для конкретных платформ в
matlabroot/bin
Возможно использование других версий make с генератором кода, хотя рекомендуется использовать GNU Make. Чтобы быть совместимым с генератором кода, убедитесь, что версия make поддерживает следующий формат команды.
makecommand -f model_or_sharedutils.mk
TMF имеет несколько секций, включая следующие:
Abstract - Описывает цели makefile. Вот репрезентативный реферат из 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 раздел из файлов GRT TMF в :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_namecomputer команда), или ANY.
BUILD - Инструкции make_rtw следует ли ссылаться на него или нет make из процедуры построения. Определить yes или no.
SYS_TARGET_FILE - указывает имя системного целевого файла или значение any. Используется для проверки непротиворечивости make_rtw проверка целевого файла системы, указанного на панели Выбор целевого файла (Target selection) панели Создание кода (Code Generation) диалогового окна Параметры конфигурации (Configuration Parameters). При указании any, можно использовать TMF с любым системным целевым файлом.
BUILD_SUCCESS - Когда makefile создает статическую библиотеку, он создает 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 в :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 см. в разделе Шаблоны маркеров Makefile, развернутые по make_rtw.
Последующие разделы зависят от компилятора, хоста и цели. Некоторые общие разделы включают Model and reference models, External mode, Tool Specifications или Tool Definitions, Include Path, C Flags, Additional Libraries, и Source Files.
Rules раздел - содержит правила создания, используемые при построении исполняемого файла из созданного исходного кода. Правила построения обычно специфичны для вашей версии make. Rules за разделом могут следовать связанные разделы, такие как Dependencies.
Использование макросов и выражений соответствия шаблонов в Makefile шаблона
Ошибка тайм-аута при построении общего служебного кода с помощью пользовательского Makefile шаблона
В этом разделе описывается механика настройки пользовательского файла шаблона (TMF) и его включения в процесс построения. В нем также обсуждаются методы изменения файловых механизмов TMF и MATLAB, связанных с TMF.
Перед созданием пользовательского TMF необходимо ознакомиться с правилами именования папок и файлов, чтобы понять структуру папок и требования к пути MATLAB для пользовательских целей.
Чтобы настроить или создать новый TMF, скопируйте существующий GRT или ERT TMF из matlabroot/toolbox/coder/compile/tmf.
Поместите копию в ту же папку, что и связанный системный целевой файл. Обычно, это mytarget/mytarget в целевой структуре папок. Затем переименуйте TMF (например, mytarget.tmf) и измените его.
Чтобы процесс сборки мог найти и выбрать TMF, необходимо предоставить информацию в заголовке целевого файла системы (см. раздел Структура целевого файла системы). Для целевого объекта, реализующего один 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]. В среде ПК расширения файлов и команды компиляции и связывания различаются.
При обработке первого правила
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] Make, можно заменить два "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 предоставляют маркеры, позволяющие добавлять следующие элементы в созданные makefile:
Исходные папки
Включить папки
Имена библиотек времени выполнения
Объекты модуля времени выполнения
S-функции могут добавлять эту информацию в make-файл с помощью rtwmakecfg.m файловая функция. Эта функция особенно полезна при построении модели, содержащей один или несколько блоков S-функций, таких как блоки драйверов устройств.
Чтобы добавить информацию, относящуюся к S-функции, в make-файл,
Создание функции rtwmakecfg в файле rtwmakecfg.m. Генератор кода связывает этот файл с функцией S в зависимости от расположения папки.
Измените TMF целевого объекта таким образом, чтобы он поддерживал расширение макросов для информации, возвращаемой rtwmakecfg функции.
После фазы TLC процесса сборки при генерации make-файла из TMF процесс сборки выполняет поиск rtwmakecfg.m в папке, содержащей компонент S-функции. Если он находит файл, процесс построения вызывает rtwmakecfg функция. Дополнительные сведения см. в разделе Использование API rtwmakecfg.m для настройки созданных Makefiles.
Если необходимо, чтобы пользовательская цель на основе ERT поддерживала непрерывное время, необходимо обновить файл создания шаблона (TMF) и статический основной программный модуль (например, mytarget_main.c) для вашей цели.
Изменения Makefile шаблона. Добавить 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.
Важные сведения об изменениях TMF, которые могут потребоваться для поддержки ссылочных функций модели генератора кода, см. в разделе Ссылка на модель поддержки.
Примечание
При использовании TMF без переменной MODELREFS, возможно, файл использовался с предыдущей версией программного обеспечения Simulink. Если необходимо, чтобы TMF поддерживал ссылки на модели, добавьте MODELREFS в файл make.
Если в процессе построения для создания make-файла общего служебного кода используется пользовательский файл шаблона, то при выполнении всех следующих условий в процессе построения возникает ошибка тайм-аута:
Параметр конфигурации GenCodeOnly является 'off'.
BUILD_SUCCESS выводится во время make позвонить в rtwshared.mk.
make позвонить в rtwshared.mk не обновляет конечный продукт (обычно rtwshared.lib).
Чтобы избежать ошибки, обновите файл создания пользовательского шаблона так, чтобы make вызов генерирует BUILD_SUCCESS сообщение только тогда, когда генерируется конечный продукт (как определено make переменная PRODUCT). Кроме того, если в процессе построения не используется созданный makefile, отключите создание makefile, задав параметр конфигурации. GenerateMakefile кому 'off'.
[1] UNIX является зарегистрированным товарным знаком Открытой группы в США и других странах.
[2] UNIX является зарегистрированным товарным знаком Открытой группы в США и других странах.
[3] GNU является зарегистрированным товарным знаком Фонда свободного программного обеспечения.