exponenta event banner

Файл определения цепочки инструментов с комментарием

Шаги, связанные с записью файла определения цепочки инструментов

В этом примере показано, как создать файл определения цепочки инструментов, и объясняется каждый из соответствующих шагов. Пример основан на файле определения, используемом в разделе Добавление пользовательских схем инструментов в процесс построения MATLAB ® Coder™. Дополнительные сведения о рабочем процессе см. в разделе Типичный рабочий процесс.

Запись функции, создающей объект ToolchainInfo

function tc = intel_tc
% INTEL_TC Creates an Intel v12.1 ToolchainInfo object.
% This can be used as a template to add other toolchains on Windows.

tc = coder.make.ToolchainInfo('BuildArtifact','nmake makefile');
tc.Name             = 'Intel v12.1 | nmake makefile (64-bit Windows)';
tc.Platform         = 'win64';
tc.SupportedVersion = '12.1';

tc.addAttribute('TransformPathsWithSpaces');
tc.addAttribute('RequiresCommandFile');
tc.addAttribute('RequiresBatchFile');

Предыдущий код:

  • Определяет функцию, intel_tc, что создает coder.make.ToolchainInfo объект и назначает его дескриптору, tc.

  • Переопределяет BuildArtifact для создания makefile для nmake, а не для gmake.

  • Присваивает значения Name, Platform, и SupportedVersion свойства для информационных и экранных целей.

  • Добавление трех пользовательских атрибутов к Attributes свойства, необходимые для данной цепочки инструментов.

  • 'TransformPathsWithSpaces' преобразует пути, содержащие пробелы, в короткие пути Windows ® .

  • 'RequiresCommandFile' создает командный файл компоновщика, который вызывает компоновщика. Это позволяет избежать проблем с вызовами, количество которых превышает ограничение командной строки, равное 256 символам.

  • 'RequiresBatchFile' создает .bat который вызывает приложение Builder.

Установка

% ------------------------------
% Setup
% ------------------------------
% Below we are using %ICPP_COMPILER12% as root folder where Intel Compiler is
% installed. You can either set an environment variable or give full path to the
% compilervars.bat file
tc.ShellSetup{1} = 'call %ICPP_COMPILER12%\bin\compilervars.bat intel64';

Предыдущий код:

  • Назначает системный вызов ShellSetup собственность.

  • coder.make.ToolchainInfo.setup метод выполняет эти системные вызовы до запуска инструментов, указанных в PrebuildTools собственность.

  • Требования compilervars.bat, поставляемый с компиляторами Intel ®, для получения набора переменных среды для компиляторов и линкеров Intel.

Макрос

% ------------------------------
% Macros
% ------------------------------
tc.addMacro('MW_EXTERNLIB_DIR',['$(MATLAB_ROOT)\extern\lib\' tc.Platform '\microsoft']);
tc.addMacro('MW_LIB_DIR',['$(MATLAB_ROOT)\lib\' tc.Platform]);
tc.addMacro('CFLAGS_ADDITIONAL','-D_CRT_SECURE_NO_WARNINGS');
tc.addMacro('CPPFLAGS_ADDITIONAL','-EHs -D_CRT_SECURE_NO_WARNINGS');
tc.addMacro('LIBS_TOOLCHAIN','$(conlibs)');
tc.addMacro('CVARSFLAG','');

tc.addIntrinsicMacros({'ldebug','conflags','cflags'});

Предыдущий код:

  • Использование coder.make.ToolchainInfo.addMacro для определения макросов и назначения им значений.

  • Использование coder.make.ToolchainInfo.addIntrinsicMacros для определения макросов, значения которых указаны в цепочке инструментов, за пределами области программного обеспечения MathWorks ®.

Компилятор C

% ------------------------------
% C Compiler
% ------------------------------
 
tool = tc.getBuildTool('C Compiler');

tool.setName('Intel C Compiler');
tool.setCommand('icl');
tool.setPath('');

tool.setDirective('IncludeSearchPath','-I');
tool.setDirective('PreprocessorDefine','-D');
tool.setDirective('OutputFlag','-Fo');
tool.setDirective('Debug','-Zi');

tool.setFileExtension('Source','.c');
tool.setFileExtension('Header','.h');
tool.setFileExtension('Object','.obj');

tool.setCommandPattern('|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|');

Предыдущий код:

  • Создание объекта инструмента построения для компилятора C

  • Назначение значений свойствам объекта инструмента построения

  • Создает директивы и расширения файлов с помощью пар имя-значение

  • Задание шаблона команды.

  • Вы можете использовать setCommandPattern способ управления использованием символов пробела в командах. Например, две полосы в OUTPUT_FLAG<||>OUTPUT не допускается использование символа пробела между флагом вывода и выводом.

Компилятор C++

% ------------------------------
% C++ Compiler
% ------------------------------

tool = tc.getBuildTool('C++ Compiler');

tool.setName('Intel C++ Compiler');
tool.setCommand('icl');
tool.setPath('');

tool.setDirective('IncludeSearchPath','-I');
tool.setDirective('PreprocessorDefine','-D');
tool.setDirective('OutputFlag','-Fo');
tool.setDirective('Debug','-Zi');

tool.setFileExtension('Source','.cpp');
tool.setFileExtension('Header','.hpp');
tool.setFileExtension('Object','.obj');

tool.setCommandPattern('|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|');

Предыдущий код:

  • Создание объекта инструмента построения для компилятора C++

  • Очень похож на объект инструмента сборки для компилятора C

Компоновщик

% ------------------------------
% Linker
% ------------------------------

tool = tc.getBuildTool('Linker');

tool.setName('Intel C/C++ Linker');
tool.setCommand('xilink');
tool.setPath('');

tool.setDirective('Library','-L');
tool.setDirective('LibrarySearchPath','-I');
tool.setDirective('OutputFlag','-out:');
tool.setDirective('Debug','');

tool.setFileExtension('Executable','.exe');
tool.setFileExtension('Shared Library','.dll');

tool.DerivedFileExtensions = horzcat(tool.DerivedFileExtensions,{ ...
                                            ['_' tc.Platform '.lib'],...
                                            ['_' tc.Platform '.exp']});

tool.setCommandPattern('|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|');

Предыдущий код:

  • Создание объекта инструмента построения для компоновщика

  • Присваивает значения coder.make.BuildTool.DerivedFileExtensions

Archiver

% ------------------------------
% Archiver
% ------------------------------

tool = tc.getBuildTool('Archiver');

tool.setName('Intel C/C++ Archiver');
tool.setCommand('xilib');
tool.setPath('');

tool.setDirective('OutputFlag','-out:');

tool.setFileExtension('Static Library','.lib');

tool.setCommandPattern('|>TOOL<| |>TOOL_OPTIONS<| |>OUTPUT_FLAG<||>OUTPUT<|');

Предыдущий код:

  • Создает объект инструмента построения для архиватора.

Строитель

% ------------------------------
% Builder
% ------------------------------

tc.setBuilderApplication(tc.Platform);

Предыдущий код:

  • Дает значение coder.make.ToolchainInfo.Platform в качестве аргумента для установки значения BuilderApplication. При этом устанавливаются значения по умолчанию приложения Builder на основе платформы. Например, когда Platform является win64, эта строка устанавливает для команды delete значение 'del'; команда display to 'echo', разделитель файлов для '\'и директива о включении в '!include'.

Конфигурации сборки

% --------------------------------------------
% BUILD CONFIGURATIONS
% --------------------------------------------

optimsOffOpts = {'/c /Od'};
optimsOnOpts = {'/c /O2'};
cCompilerOpts    = '$(cflags) $(CVARSFLAG) $(CFLAGS_ADDITIONAL)';
cppCompilerOpts  = '$(cflags) $(CVARSFLAG) $(CPPFLAGS_ADDITIONAL)';
linkerOpts       = {'$(ldebug) $(conflags) $(LIBS_TOOLCHAIN)'};
sharedLinkerOpts = horzcat(linkerOpts,'-dll -def:$(DEF_FILE)');
archiverOpts     = {'/nologo'};

% Get the debug flag per build tool
debugFlag.CCompiler   = '$(CDEBUG)';   
debugFlag.CppCompiler = '$(CPPDEBUG)';
debugFlag.Linker      = '$(LDDEBUG)';  
debugFlag.Archiver    = '$(ARDEBUG)';  

cfg = tc.getBuildConfiguration('Faster Builds');
cfg.setOption('C Compiler',horzcat(cCompilerOpts,optimsOffOpts));
cfg.setOption('C++ Compiler',horzcat(cppCompilerOpts,optimsOffOpts));
cfg.setOption('Linker',linkerOpts);
cfg.setOption('Shared Library Linker',sharedLinkerOpts);
cfg.setOption('Archiver',archiverOpts);

cfg = tc.getBuildConfiguration('Faster Runs');
cfg.setOption('C Compiler',horzcat(cCompilerOpts,optimsOnOpts));
cfg.setOption('C++ Compiler',horzcat(cppCompilerOpts,optimsOnOpts));
cfg.setOption('Linker',linkerOpts);
cfg.setOption('Shared Library Linker',sharedLinkerOpts);
cfg.setOption('Archiver',archiverOpts);

cfg = tc.getBuildConfiguration('Debug');
cfg.setOption('C Compiler',horzcat(cCompilerOpts,optimsOffOpts,debugFlag.CCompiler));
cfg.setOption ...
('C++ Compiler',horzcat(cppCompilerOpts,optimsOffOpts,debugFlag.CppCompiler));
cfg.setOption('Linker',horzcat(linkerOpts,debugFlag.Linker));
cfg.setOption('Shared Library Linker',horzcat(sharedLinkerOpts,debugFlag.Linker));
cfg.setOption('Archiver',horzcat(archiverOpts,debugFlag.Archiver));

tc.setBuildConfigurationOption('all','Make Tool','-f $(MAKEFILE)');

Предыдущий код:

  • Создает каждый объект конфигурации построения.

  • Задает значение каждой опции для данного объекта конфигурации построения.