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');