В этом примере показано, как зарегистрироваться и использовать набор инструментальных средств для компиляции исполняемого файла. Этот пример использует компилятор 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, отладка. Объект набора инструментальных средств описывает основную информацию набора инструментальных средств. Объект набора инструментальных средств имеет методы для описания всего вышеописанного. Объект можно сохранить в файл 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');
Теперь можно создать объект config, который сконфигурирован для создания исполняемого файла с помощью нового набора инструментальных средств.
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');