Toolchain Definition File with Commentary
Steps Involved in Writing a Toolchain Definition File
This example shows how to create a toolchain definition file and explains each of the steps involved. The example is based on the definition file used in Add Custom Toolchains to MATLAB® Coder™ Build Process. For more information about the workflow, see Typical Workflow.
Write a Function That Creates a ToolchainInfo Object
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');
The preceding code:
Defines a function,
intel_tc, that creates acoder.make.ToolchainInfoobject and assigns it to a handle,tc.Overrides the
BuildArtifactproperty to create a makefile for nmake instead of for gmake.Assigns values to the
Name,Platform, andSupportedVersionproperties for informational and display purposes.Adds three custom attributes to
Attributesproperty that are required by this toolchain.'TransformPathsWithSpaces'converts paths that contain spaces to short Windows® paths.'RequiresCommandFile'generates a linker command file that calls the linker. This avoids problems with calls that exceed the command line limit of 256 characters.'RequiresBatchFile'creates a.batfile that calls the builder application.
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';
The preceding code:
Assigns a system call to the
ShellSetupproperty.The
coder.make.ToolchainInfo.setupmethod runs these system calls before it runs tools specified byPrebuildToolsproperty.Calls
compilervars.bat, which is shipped with the Intel® compilers, to get the set of environment variables for Intel compiler and linkers.
Macros
% ------------------------------ % 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'}); |
The preceding code:
Uses
coder.make.ToolchainInfo.addMacromethod to define macros and assign values to them.Uses
coder.make.ToolchainInfo.addIntrinsicMacrosto define macros whose values are specified by the toolchain, outside the scope of your MathWorks® software.
C Compiler
% ------------------------------ % 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<|');
The preceding code:
Creates a build tool object for the C compiler
Assigns values to the build tool object properties
Creates directives and file extensions using name-value pairs
Sets a command pattern.
You can use
setCommandPatternmethod to control the use of space characters in commands. For example, the two bars inOUTPUT_FLAG<||>OUTPUTdo not permit a space character between the output flag and the output.
C++ Compiler
% ------------------------------ % 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<|');
The preceding code:
Creates a build tool object for the C++ compiler
Is very similar to the build tool object for the C compiler
Linker
% ------------------------------ % 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<|');
The preceding code:
Creates a build tool object for the linker
Assigns values to the
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<|');
The preceding code:
Creates a build tool object for the archiver.
Builder
% ------------------------------ % Builder % ------------------------------ tc.setBuilderApplication(tc.Platform);
The preceding code:
Gives the value of
coder.make.ToolchainInfo.Platformas the argument for setting the value ofBuilderApplication. This sets the default values of the builder application based on the platform. For example, whenPlatformiswin64, this line sets the delete command to'del'; the display command to'echo', the file separator to'\', and the include directive to'!include'.
Build Configurations
% -------------------------------------------- % 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)');
The preceding code:
Creates each build configuration object.
Sets the value of each option for a given build configuration object.