www.gusucode.com > private工具箱matlab源码程序 > private/create_build_info.m

    function buildInfo = create_build_info(fileNameInfo)
% Create an RTW.BuildInfo object to and populate it with the data in
% fileNameInfo structure.

global gMachineInfo gTargetInfo;

buildInfo = RTW.BuildInfo;
linkFlags = '';
compilerName = '.';
compileFlags = '';
compilerSpecificSrc = {};
includePaths = {};
includePathsGroup = {};

libFiles = {};
libPaths = {};
libGroup = {};

%Setup compiler and linker flags
if isunix
    if gTargetInfo.codingFasterRun
        compileFlags = [compileFlags ' COPTIMFLAGS="-O2"'];
    end
    if(gTargetInfo.codingOpenMP)
        compileFlags = [compileFlags ' CFLAGS="-fopenmp -fPIC"'];
    end
    if ismac
        linkFlags = '-Wl,-rpath,@loader_path ';
    end
elseif gTargetInfo.codingMSVCMakefile
    compileFlags = '/c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD';
    if gTargetInfo.codingOpenMP
        compileFlags = [compileFlags ' /openmp'];
    end
    if gTargetInfo.codingFasterRun
        compileFlags = ['/O2 ' compileFlags];
    end
    linkFlags = '/nologo /dll /MANIFEST /OPT:NOREF /export:mexFunction ';
    compilerName = 'microsoft';
elseif gTargetInfo.codingMinGWMakefile
    compilerName = 'mingw64';
    if gTargetInfo.codingFasterRun
        compileFlags = [compileFlags ' COPTIMFLAGS="-O2"'];
    end
elseif gTargetInfo.codingLccMakefile
    if(strcmp(computer,'PCWIN64'))
        lccRoot = fullfile(matlabroot,'sys','lcc64','lcc64');
        compilerName = 'microsoft'; %LCC64 is using microsoft libraries.

		compileFlags = '-dll -noregistrylookup  -c -Zp8 -DLCC_WIN64 -DMATLAB_MEX_FILE -DMX_COMPAT_32 -nodeclspec';
		linkFlags = ['-dll',' -L"',lccRoot,'\lib64" -entry LibMain -map sfun.map'];
		if gTargetInfo.codingMakeDebug
		    % Add -g2 to add debug info
			compileFlags = ['-g2 ',compileFlags];
		else
			% -s strips out the debug info
			linkFlags = ['-s ',linkFlags];
		end
        defFileName = [gMachineInfo.machineName,'_',gMachineInfo.targetName,'.def'];
        if(gTargetInfo.codingLibrary)
            mexFileName = [gMachineInfo.machineName,'_',gMachineInfo.targetName,'.lib'];
        else
            mexFileName= [gMachineInfo.machineName,'_',gMachineInfo.targetName,'.',mexext];
        end
        str = ['LIBRARY ',mexFileName,10,...
            'EXPORTS',10,...
            'mexFunction'];
        sfprivate('str2file',str,fullfile(fileNameInfo.targetDirName,defFileName));
        includePaths{end+1} = fullfile(lccRoot,'include64');
    else
    lccRoot =  fullfile(matlabroot,'sys','lcc');
        compilerName = 'lcc';

    if gTargetInfo.codingMakeDebug
        compileFlags = '-g4 -c -Zp8 -DMATLAB_MEX_FILE -noregistrylookup';
		linkFlags = ['-dll',' -L"',lccRoot,'\lib"'];
	else
		compileFlags = '-c -Zp8 -DMATLAB_MEX_FILE -noregistrylookup';
		linkFlags = ['-s -dll',' -L"',lccRoot,'\lib"'];
    end
        defFileName = [lccRoot,'\mex\lccdef.def'];
        includePaths{end+1} = fullfile(lccRoot,'include');

    end

    includePathsGroup{end+1} = 'LCC';
    if(~gTargetInfo.codingLibrary && gTargetInfo.codingSFunction)
        compilerSpecificSrc{1} = [lccRoot,'\mex\lccstub.c'];
        [libPaths{end+1}, libFiles{end+1}, extLib] = fileparts(defFileName);
        libFiles{end} = [libFiles{end} extLib];
        libGroup{end+1} = 'LCC_DEF';
    end
end

%Get user specified compile and Link Flags
if gTargetInfo.codingSFunction
    compileFlags = [compileFlags ' ' fileNameInfo.customCompilerFlags];
    linkFlags = [linkFlags ' ' fileNameInfo.customLinkerFlags];
end

buildInfo.addCompileFlags(compileFlags,'OPTS')
%LDFLAGS
buildInfo.addLinkFlags(linkFlags);

MLROOT = buildInfo.Settings.Matlabroot;


%Add paths to be included to the buildInfo'
%ML_INCLUDES, SL_INCLUDES, SF_INCLUDES, USER_INCLUDES,AUX_INCLUDES
%------------------------------------------|-----------------------|
%            IncludePath                   |  Group                |
%                                          |                       |

if gTargetInfo.codingMSVCMakefile || gTargetInfo.codingLccMakefile
    % We cannot fix this in create_file_name_info() since the targetDirName field is used not only for makefiles.
    targetDirNameFixed = fix_windows_paths_for_make_file(fileNameInfo.targetDirName);
else
    targetDirNameFixed = fileNameInfo.targetDirName;
end

includeInfo =  [ ...
    {fullfile(MLROOT,'extern','include');    'ML_INCLUDES'}, ...
    {fullfile(MLROOT,'simulink','include');  'SL_INCLUDES'}, ...
    {fullfile(MLROOT,'simulink','include','sf_runtime');  'SL_INCLUDES'}, ...
    {fileNameInfo.rtwHeadersInclude;         'SF_INCLUDES'},...
    {fileNameInfo.sfRuntimeIncludeDir;       'SF_INCLUDES'},...
    {fullfile(MLROOT,'rtw','c','src');       'SL_INCLUDES'}, ...
    {targetDirNameFixed;                     'SF_INCLUDES'}, ...
    [fileNameInfo.userIncludeDirs;           repmat({'USER_INCLUDES'},size(fileNameInfo.userIncludeDirs))]...
    [fileNameInfo.auxInfo.includePaths;      repmat({'AUX_INCLUDES'},size(fileNameInfo.auxInfo.includePaths))]...
    ];
includePathsGroup = [includePathsGroup includeInfo(2,:)];
includePaths = [includePaths includeInfo(1,:)];

assert(length(includePaths) == length(includePathsGroup));

includePathsGroup(cellfun(@isempty,includePaths)) = [];
includePaths(cellfun(@isempty,includePaths)) = [];

if ~isempty(includePaths)
    buildInfo.addIncludePaths(includePaths,includePathsGroup);
end


%Add source files info to buildInfo
numSrcFiles = 0;
for i = 1:length(gMachineInfo.charts)
    for j = 1:length(gMachineInfo.specializations{i})
        if ~gMachineInfo.codingLLVM{i}(j)
            numSrcFiles = numSrcFiles + 1;
        end
    end
end
chartSourceFiles = cell(1, numSrcFiles);

idx = 1;
for i = 1:length(gMachineInfo.charts)
    for j = 1:length(gMachineInfo.specializations{i})
        if ~gMachineInfo.codingLLVM{i}(j)
            chartSourceFiles{idx} = fileNameInfo.chartSourceFiles{i}{j};
            idx = idx + 1;
        end
    end
end

srcFiles=  cell(1,numel(chartSourceFiles) + 1);
srcFilesGroup = cell(size(srcFiles));
srcFiles(1) = {fileNameInfo.machineSourceFile};
srcFilesGroup(1) = {'MODEL_SRC'};
srcFiles(2:end) = chartSourceFiles;
srcFilesGroup(2:end) = {'MODULE_SRCS'};

% Add the extra file for the custom code if the file
% has been generated and the coverage instrumenter 
% didn't run (g1375168: always added if exist even if it's a library).
if gTargetInfo.codingSFunction && ...
        gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.hasExtraCustomCodeFiles && ...
        isempty(gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter)
    srcFiles{end+1} = fileNameInfo.customCodeSourceFile;
    srcFilesGroup{end+1} = 'MODEL_SRC';
end

if ~gTargetInfo.codingLibrary && gTargetInfo.codingSFunction
    srcFiles{end+1} = fileNameInfo.machineRegistryFile;
    srcFilesGroup{end+1} = 'MODEL_REG';
end

for i=1:numel(fileNameInfo.auxInfo.sourceFiles)
    srcFiles{end+1} = fileNameInfo.auxInfo.sourceFiles{i}; %#ok<*AGROW>
    srcFilesGroup{end+1} = 'AUX_SRCS';
end

if ~isempty(compilerSpecificSrc)
    srcFiles = [compilerSpecificSrc srcFiles];
    srcFilesGroup = [{'COMPILER_SRC'} srcFilesGroup];
end

if ~isempty(gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter)
    % The custom code is instrumented then it's compiled as "chart source"
    instrFiles = [gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter.InstrumentedFiles(:); gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter.ExtraFiles(:)];
    for i=1:numel(instrFiles)
        [~, nameStr, extStr] = fileparts(instrFiles{i});
        extStr = lower(extStr);
        if(strcmp(extStr, '.c') || strcmp(extStr,'.cpp'))
            srcFiles{end+1} = [nameStr, extStr]; 
            srcFilesGroup{end+1} = 'CHART_SRCS';
        else
            error('Stateflow:UnexpectedError',['Unrecognized file extension: ' extStr]);
        end
    end
end

buildInfo.addSourceFiles(srcFiles,fileNameInfo.targetDirName,srcFilesGroup);

if ~slfeature('CustomCodeIntegration')
    %Get the custom user Sources Information
    userAbsSources = {};
    userSources    = {};
    usrSrcPath = {};
    if isempty(gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter)
    % The custom code is not instrumented then it's compiled as "user source"
    for i=1:length(fileNameInfo.userAbsSources)
        [pathStr, ~, extStr] = fileparts(fileNameInfo.userAbsSources{i});
        extStr = lower(extStr);
        if(strcmp(extStr, '.c') || strcmp(extStr,'.cpp'))
            userAbsSources{end+1} = fileNameInfo.userAbsSources{i};
            userSources{end+1}    = fileNameInfo.userSources{i};
            usrSrcPath{end+1} = pathStr;
        else
            error('Stateflow:UnexpectedError',['Unrecognized file extension: ' extStr]);
        end
    end
    end
    buildInfo.addSourceFiles(userSources,usrSrcPath,'USER_SRCS');
    buildInfo.addSourceFiles(userAbsSources,usrSrcPath,'USER_ABS_SRCS');
end
%Add source paths to buildInfo
buildInfo.addSourcePaths(fileNameInfo.targetDirName);

%Link BuildInfo options
priority = 100;
precompiled = false;
linkonly  =false;

if (~slfeature('CustomCodeIntegration') && ~isempty(fileNameInfo.userLibraries) )
    %USER_LIBS = \
    for i=1:length(fileNameInfo.userLibraries)
        [libPaths{end+1}, libFiles{end+1}, extLib] = fileparts(fileNameInfo.userLibraries{i});
        libFiles{end} = [libFiles{end} extLib];
        libGroup{end+1} = 'USER_LIBS';
    end
end
numLinkMachines = length(fileNameInfo.linkLibFullPaths);
for i = 1:numLinkMachines
    [libPaths{end+1}, libFiles{end+1}, extLib] = fileparts(fileNameInfo.linkLibFullPaths{i});
    libFiles{end} = [libFiles{end} extLib];
    libGroup{end+1} = 'LINK_MACHINE_LIBS';
    
    %Compute the object list file for the libraries
    [libPaths{end+1}, libFiles{end+1}, extLib] = fileparts(fileNameInfo.linkObjListFullPaths{i});
    libFiles{end} = [libFiles{end} extLib];
    libGroup{end+1} = 'LINK_MACHINE_OBJLIST';
end

%     ...AUX_LNK_OBJS =
for i=1:length(fileNameInfo.auxInfo.linkObjects)
    [libPaths{end+1}, libFiles{end+1}, extLib] = fileparts(fileNameInfo.auxInfo.linkObjects{i});
    libFiles{end} = [libFiles{end} extLib];
    libGroup{end+1} = 'AUX_LNK_OBJS';
end


% sf_runtime lib
[libPaths{end+1}, libFiles{end+1}, extLib] = fileparts(fileNameInfo.sfRuntimeLib);
libFiles{end} = [libFiles{end} extLib];
libGroup{end+1} = 'TMWLIB';

if slfeature('CustomCodeIntegration') && CGXE.Utils.isfile(fileNameInfo.customCodeDLL)
    [ccDLLPath, ccDLLFile, ccDLLExt] = fileparts(fileNameInfo.customCodeDLL);
    libFiles{end+1} = [ccDLLFile ccDLLExt];
    libPaths{end+1} = ccDLLPath;
    libGroup(end+1) = {'CCLIB'};
end
    
if ispc
    %TMWLIB
    libMexDir = fullfile(matlabroot,'extern','lib',computer('arch'),compilerName);
    libMATLABDir = fullfile(fileNameInfo.matlabRoot,'lib',computer('arch'));

    libFiles(end+1:end+12) = {'libmx.lib','libmex.lib','libmat.lib','libfixedpoint.lib', ...
        'libut.lib', 'libmwmathutil.lib','libemlrt.lib','libmwsl_log_load_blocks.lib', 'libmwsimulink.lib',...
        'libmwsl_sfcn_cov_bridge.lib', 'libmwsl_simtarget_core.lib', 'libmwsl_simtarget_instrumentation.lib'};
    libPaths(end+1:end+12) = {libMexDir};
    libGroup(end+1:end+12) = {'TMWLIB'};
    if gTargetInfo.codingMinGWMakefile
        libFiles{end+1} = 'libmwipp';
        libPaths{end+1} = fullfile(matlabroot,'bin',computer('arch'));
        libGroup{end+1} = 'TMWLIB';
    else
        libFiles{end+1} = 'libmwipp.lib';
        libPaths{end+1} = libMATLABDir;
        libGroup(end+1) = {'TMWLIB'};
    end
    
    buildInfo.addLinkObjects(libFiles,libPaths,priority,precompiled,linkonly,libGroup);

elseif isunix
    MLSysLibPath = fullfile(matlabroot,'bin',computer('arch'));
    arch = lower(computer);

    % ...FIXEDPOINTLIB UTLIB EMLRTLIB MWMATHUTILLIB BLASLIB
    libFiles(end+1:end+11) = {'fixedpoint','ut','emlrt','mwmathutil','mwblas', 'mwsl_log_load_blocks', 'mwsimulink', 'mwsl_sfcn_cov_bridge', 'mwlapack', 'mwsl_simtarget_core', 'mwsl_simtarget_instrumentation'};
    libPaths(end+1:end+11) = {MLSysLibPath};
    libGroup(end+1:end+11) = {'TMWLIB'};

    % ...IPPLIB = -L$matlabroot$/bin/$arch$ -lmwipp
    libFiles{end+1} = 'mwipp';
    libPaths{end+1} = fullfile(matlabroot,'bin',arch);
    libGroup{end+1} = 'TMWLIB';
    if(gTargetInfo.codingOpenMP)
        % ...PARLIB = -L$matlabroot$/sys/os/$arch$ -liomp5
        libFiles{end+1} = 'iomp5';
        libPaths{end+1} = fullfile(matlabroot,'sys','os',arch);
        libGroup{end+1} = 'PARLIB';
    end
    buildInfo.addLinkObjects(libFiles,libPaths,priority,precompiled,linkonly,libGroup);
end

% Add AUX link flags to buildInfo
auxLinkFlags = '';
if ~isempty(fileNameInfo.auxInfo.linkFlags)
    for i = 1:length(fileNameInfo.auxInfo.linkFlags)
        flag = fileNameInfo.auxInfo.linkFlags{i};
        auxLinkFlags = [auxLinkFlags,' ',flag];
    end
end
buildInfo.addLinkFlags(auxLinkFlags,'AUXLDFLAGS');