exponenta event banner

Добавление пользовательских схем инструментов в процесс построения MATLAB ® Coder™

В этом примере показано, как зарегистрировать и использовать цепочку инструментов для компиляции исполняемого файла. В этом примере используется компилятор Intel ®, но приведенные ниже концепции и API могут использоваться для любой цепочки инструментов. Зарегистрированную цепочку инструментов можно выбрать из списка цепочек инструментов, и будет создан файл make-файла для создания кода с использованием этой цепочки инструментов .

О coderrand Функция

В этом примере создается код для coderrand функция. Эта функция MATLAB ® просто генерирует случайное скалярное значение из стандартного равномерного распределения на открытом интервале (0,1 ).

type coderrand
function y = coderrand %#codegen

%   Copyright 2012 The MathWorks, Inc.

y = rand();

Информация о цепочке инструментов

Инструментальная цепочка - это набор инструментов, необходимых для компиляции и связывания сгенерированного кода для указанной платформы. В цепочке инструментов имеется несколько инструментов, таких как компилятор, компоновщик и архиватор. Каждый из этих инструментов может иметь несколько вариантов, которые могут быть сгруппированы в такие конфигурации, как Faster Builds, Faster Runs, Debug. Объект цепочки инструментов описывает основные сведения о цепочке инструментов. Объект toolchain имеет методы для описания всего вышеперечисленного. Объект может быть сохранен в файле MATLAB и использоваться совместно во всех установках.

В этом примере используется файл определения цепочки инструментов intel_tc.m.

tc = intel_tc
tc = 
###########################################################################
# Toolchain Name: Intel v14 | nmake makefile (64-bit Windows)
# Supported Toolchain Version: 14
# Toolchain Specification Format Version: 2021a
# Toolchain Specification Revision: 1.0
###########################################################################

# Supported Host Platform = win64
# Supported Languages = C/C++

# ---------------
# Setup/Cleanup
# ---------------
MATLAB Setup: (none)
MATLAB Cleanup: (none)
Shell Setup: 
	call %ICPP_COMPILER14%\bin\compilervars.bat intel64
Shell Cleanup: (none)

# ------------
# Attributes
# ------------
RequiresBatchFile        = true
RequiresCommandFile      = true
TransformPathsWithSpaces = true


# ----------------------------------------------------------------------
# Macros intrinsic to the toolchain or assumed to be defined elsewhere
# ----------------------------------------------------------------------
# ldebug
# conflags
# cflags

# --------
# MACROS
# --------
MW_EXTERNLIB_DIR    = $(MATLAB_ROOT)\extern\lib\win64\microsoft
MW_LIB_DIR          = $(MATLAB_ROOT)\lib\win64
CFLAGS_ADDITIONAL   = -D_CRT_SECURE_NO_WARNINGS
CPPFLAGS_ADDITIONAL = -EHs -D_CRT_SECURE_NO_WARNINGS
LIBS_TOOLCHAIN      = $(conlibs)
CVARSFLAG           = 

###########################################################################
# Build Tool: Intel C Compiler
###########################################################################

Language              : 'C'
OptionsRegistry       : {'C Compiler', 'CFLAGS'}
InputFileExtensions   : {Source}
OutputFileExtensions  : {Object}
DerivedFileExtensions : {}
SupportedOutputs      : {*}
CommandPattern        : '|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|'

# ---------
# Command
# ---------
CC = icl
CC_PATH =

# ------------
# Directives
# ------------
CompileFlag        = 
Debug              = -Zi
ErrorPattern       = 
FileNamePattern    = 
FileSeparator      = \
Include            = 
IncludeSearchPath  = -I
LineNumberPattern  = 
OutputFlag         = -Fo
PreprocessFile     = 
PreprocessorDefine = -D
WarningPattern     = 

# -----------------
# File Extensions
# -----------------
Header = .h
Object = .obj
Source = .c

###########################################################################
# Build Tool: Intel C/C++ Linker
###########################################################################

Language              : 'C'
OptionsRegistry       : {'Linker', 'LDFLAGS', 'Shared Library Linker', 'SHAREDLIB_LDFLAGS'}
InputFileExtensions   : {}
OutputFileExtensions  : {'Executable', 'Shared Library'}
DerivedFileExtensions : {}
SupportedOutputs      : {coder.make.enum.BuildOutput.EXECUTABLE, coder.make.enum.BuildOutput.SHARED_LIBRARY}
CommandPattern        : '|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|'

# ---------
# Command
# ---------
LD = xilink
LD_PATH =

# ------------
# Directives
# ------------
Debug                    = 
FileSeparator            = \
Library                  = -L
LibrarySearchPath        = -I
LibrarySearchPathRuntime = 
OutputFlag               = -out:

# -----------------
# File Extensions
# -----------------
Executable     = .exe
Shared Library = .dll

###########################################################################
# Build Tool: Intel C++ Compiler
###########################################################################

Language              : 'C++'
OptionsRegistry       : {'C++ Compiler', 'CPPFLAGS'}
InputFileExtensions   : {Source}
OutputFileExtensions  : {Object}
DerivedFileExtensions : {}
SupportedOutputs      : {*}
CommandPattern        : '|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|'

# ---------
# Command
# ---------
CPP = icl
CPP_PATH =

# ------------
# Directives
# ------------
CompileFlag        = 
Debug              = -Zi
ErrorPattern       = 
FileNamePattern    = 
FileSeparator      = \
Include            = 
IncludeSearchPath  = -I
LineNumberPattern  = 
OutputFlag         = -Fo
PreprocessFile     = 
PreprocessorDefine = -D
WarningPattern     = 

# -----------------
# File Extensions
# -----------------
Header = .hpp
Object = .obj
Source = .cpp

###########################################################################
# Build Tool: Intel C/C++ Linker
###########################################################################

Language              : 'C++'
OptionsRegistry       : {'C++ Linker', 'CPP_LDFLAGS', 'C++ Shared Library Linker', 'CPP_SHAREDLIB_LDFLAGS'}
InputFileExtensions   : {}
OutputFileExtensions  : {'Executable', 'Shared Library'}
DerivedFileExtensions : {}
SupportedOutputs      : {coder.make.enum.BuildOutput.EXECUTABLE, coder.make.enum.BuildOutput.SHARED_LIBRARY}
CommandPattern        : '|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|'

# ---------
# Command
# ---------
CPP_LD = xilink
CPP_LD_PATH =

# ------------
# Directives
# ------------
Debug                    = 
FileSeparator            = \
Library                  = -L
LibrarySearchPath        = -I
LibrarySearchPathRuntime = 
OutputFlag               = -out:

# -----------------
# File Extensions
# -----------------
Executable     = .exe
Shared Library = .dll

###########################################################################
# Build Tool: Intel C/C++ Archiver
###########################################################################

Language              : 'C'
OptionsRegistry       : {'Archiver', 'ARFLAGS'}
InputFileExtensions   : {}
OutputFileExtensions  : {Static Library}
DerivedFileExtensions : {}
SupportedOutputs      : {coder.make.enum.BuildOutput.STATIC_LIBRARY}
CommandPattern        : '|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|'

# ---------
# Command
# ---------
AR = xilib
AR_PATH =

# ------------
# Directives
# ------------
Debug             = 
FileSeparator     = \
LibrarySearchPath = 
OutputFlag        = -out:

# -----------------
# File Extensions
# -----------------
Static Library = .lib

###########################################################################
# Build Tool: Download
###########################################################################

Language              : ''
OptionsRegistry       : {'Download', 'DOWNLOAD_FLAGS'}
InputFileExtensions   : {}
OutputFileExtensions  : {}
DerivedFileExtensions : {}
SupportedOutputs      : {coder.make.enum.BuildOutput.EXECUTABLE}
CommandPattern        : '|>TOOL<| |>TOOL_OPTIONS<|'

# ---------
# Command
# ---------
DOWNLOAD =
DOWNLOAD_PATH =

# ------------
# Directives
# ------------
(none)

# -----------------
# File Extensions
# -----------------
(none)

###########################################################################
# Build Tool: Execute
###########################################################################

Language              : ''
OptionsRegistry       : {'Execute', 'EXECUTE_FLAGS'}
InputFileExtensions   : {}
OutputFileExtensions  : {}
DerivedFileExtensions : {}
SupportedOutputs      : {coder.make.enum.BuildOutput.EXECUTABLE}
CommandPattern        : '|>TOOL<| |>TOOL_OPTIONS<|'

# ---------
# Command
# ---------
EXECUTE = $(PRODUCT)
EXECUTE_PATH =

# ------------
# Directives
# ------------
(none)

# -----------------
# File Extensions
# -----------------
(none)

###########################################################################
# Build Tool: NMAKE Utility
###########################################################################

Language              : ''
OptionsRegistry       : {'Make Tool', 'MAKE_FLAGS'}
InputFileExtensions   : {}
OutputFileExtensions  : {}
DerivedFileExtensions : {}
SupportedOutputs      : {*}
CommandPattern        : '|>TOOL<| |>TOOL_OPTIONS<|'

# ---------
# Command
# ---------
MAKE = nmake
MAKE_PATH =

# ------------
# Directives
# ------------
Comment                = #
DeleteCommand          = @del
DisplayCommand         = @echo
FileSeparator          = \
ImpliedFirstDependency = $<
ImpliedTarget          = $@
IncludeFile            = !include
LineContinuation       = \
MoveCommand            = @ren
ReferencePattern       = \$\($1\)
RunScriptCommand       = @cmd /C

# -----------------
# File Extensions
# -----------------
Makefile = .mk

###########################################################################
# Build Configuration : Faster Runs
# Description         : Minimize run time
###########################################################################

ARFLAGS              = /nologo 
CFLAGS               = $(cflags) $(CVARSFLAG) $(CFLAGS_ADDITIONAL) /c /O2 
CPPFLAGS             = $(cflags) $(CVARSFLAG) $(CPPFLAGS_ADDITIONAL) /c /O2 
CPP_LDFLAGS          = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) 
CPP_SHAREDLIB_LDFLAGS =
DOWNLOAD_FLAGS       =
EXECUTE_FLAGS        =
LDFLAGS              = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) 
MEX_CPPFLAGS         =
MEX_CPPLDFLAGS       =
MEX_CFLAGS           =
MEX_LDFLAGS          =
MAKE_FLAGS           = -f $(MAKEFILE) 
SHAREDLIB_LDFLAGS    = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) -dll -def:$(DEF_FILE) 

###########################################################################
# Build Configuration : Faster Builds
# Description         : Minimize compilation and linking time
###########################################################################

ARFLAGS              = /nologo 
CFLAGS               = $(cflags) $(CVARSFLAG) $(CFLAGS_ADDITIONAL) /c /Od 
CPPFLAGS             = $(cflags) $(CVARSFLAG) $(CPPFLAGS_ADDITIONAL) /c /Od 
CPP_LDFLAGS          = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) 
CPP_SHAREDLIB_LDFLAGS =
DOWNLOAD_FLAGS       =
EXECUTE_FLAGS        =
LDFLAGS              = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) 
MEX_CPPFLAGS         =
MEX_CPPLDFLAGS       =
MEX_CFLAGS           =
MEX_LDFLAGS          =
MAKE_FLAGS           = -f $(MAKEFILE) 
SHAREDLIB_LDFLAGS    = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) -dll -def:$(DEF_FILE) 

###########################################################################
# Build Configuration : Debug
# Description         : Build with debug information
###########################################################################

ARFLAGS              = /nologo $(ARDEBUG) 
CFLAGS               = $(cflags) $(CVARSFLAG) $(CFLAGS_ADDITIONAL) /c /Od $(CDEBUG) 
CPPFLAGS             = $(cflags) $(CVARSFLAG) $(CPPFLAGS_ADDITIONAL) /c /Od $(CPPDEBUG) 
CPP_LDFLAGS          = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) $(CPPLDDEBUG) 
CPP_SHAREDLIB_LDFLAGS =
DOWNLOAD_FLAGS       =
EXECUTE_FLAGS        =
LDFLAGS              = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) $(LDDEBUG) 
MEX_CPPFLAGS         =
MEX_CPPLDFLAGS       =
MEX_CFLAGS           =
MEX_LDFLAGS          =
MAKE_FLAGS           = -f $(MAKEFILE) 
SHAREDLIB_LDFLAGS    = $(ldebug) $(conflags) $(LIBS_TOOLCHAIN) -dll -def:$(DEF_FILE) $(LDDEBUG) 



save intel_tc tc

Регистрация цепочки инструментов

Цепочки инструментов регистрируются через RTW.TargetRegistry. Для регистрации цепочки инструментов можно также использовать rtwTargetInfo которая будет загружена системой автоматически.

copyfile myRtwTargetInfoCustom.txt rtwTargetInfo.m
type rtwTargetInfo
function rtwTargetInfo(tr)
%RTWTARGETINFO Registration file for custom toolchains.

% Copyright 2012-2016 The MathWorks, Inc.

tr.registerTargetInfo(@loc_createToolchain);

end

% -------------------------------------------------------------------------
% Create the ToolchainInfoRegistry entries
% -------------------------------------------------------------------------
function config = loc_createToolchain

config(1)                       = coder.make.ToolchainInfoRegistry;
config(1).Name                  = 'Intel v14 | nmake makefile (64-bit Windows)';
config(1).FileName              = fullfile(fileparts(mfilename('fullpath')), 'intel_tc.mat');
config(1).TargetHWDeviceType    = {'*'};
config(1).Platform              =  {computer('arch')};

end

Теперь можно сбросить TargetRegistry чтобы забрать новый rtwTargetInfo.

RTW.TargetRegistry.getInstance('reset');

Выбор цепочки инструментов

Теперь можно создать объект конфигурации, настроенный для создания исполняемого файла с помощью новой цепочки инструментов.

cfg = coder.config('exe');
cfg.CustomSource = 'coderrand_main.c';
cfg.CustomInclude = pwd;
cfg.Toolchain = 'Intel v14';

Если компиляторы Intel не установлены, можно использовать следующую команду для создания только кода и make-файла.

cfg.GenCodeOnly = true;

Запустить codegen для создания кода и make-файла с использованием новой цепочки инструментов.

codegen -config cfg coderrand 
Code generation successful.

Один раз codegen завершено, и у вас установлены компиляторы Intel, вы можете использовать system('coderrand.exe') для запуска исполняемого файла.

Очистка

Вы можете сбросить TargetRegistry для удаления цепочки инструментов, зарегистрированной выше.

delete ./rtwTargetInfo.m
RTW.TargetRegistry.getInstance('reset');