Файл определения набора инструментальных средств с комментариями

Шаги, вовлеченные в написание файла определения набора инструментальных средств

В этом примере показано, как создать файл определения набора инструментальных средств, и поясняется каждый из вовлеченных шагов. Пример основан на файле определения, используемом в Add Custom Toolchains to MATLAB ® Coder™ Build Process. Для получения дополнительной информации о рабочем процессе см. «Типичный рабочий процесс».

Написание функции, которая создает объект 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 свойство для создания файла make для nmake вместо для gmake.

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

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

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

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

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

Setup

% ------------------------------
% 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 свойство.

  • The 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
% ------------------------------

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, для '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)');

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

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

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