Добавление пользовательского набора инструментальных средств

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

О coderrand Функция

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

type coderrand
function y = coderrand %#codegen

%   Copyright 2012 The MathWorks, Inc.

y = rand();

Информация о наборе инструментальных средств

Набор инструментальных средств является набором инструментов, который требуется для компиляции и соединения сгенерированного кода для заданной платформы. Набор инструментальных средств имеет несколько инструментов, таких как компилятор, компоновщик и архиватор. Каждый из этих инструментов может выбрать несколько вариантов, которые могут быть сгруппированы в настройки как Более быстрые Сборки, Более быстрые Запуски, Отладка. Объект набора инструментальных средств описывает основную информацию набора инструментальных средств. Объект набора инструментальных средств имеет методы, чтобы описать все вышеупомянутое. Объект может быть сохранен в файл 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: 2020b
# 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
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
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 

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

Очистка

Можно сбросить TargetRegistry удалить набор инструментальных средств, который вы указали выше.

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