How to use batch files to create an executable for a model which has model references?

Illustration
Vashu_hn - 2021-10-08T12:02:48+00:00
Question: How to use batch files to create an executable for a model which has model references?

Let's say we have models r1 and r2 where r1 is a model reference inside r2. When we generate code (Simulink coder - Generate code only) for r2, everything works fine and we get the artifacts. In the artifacts, we have a 'r2.bat' file in 'r2_grt_rtw\'. When we run 'r2_grt_rtw\r2.bat' the make process fails as it does not know how to make or find 'r1' model libs. Now, the 'r2_grt_rtw\r2.bat' build will pass if we manually make 'r1.bat' found in 'slprj\grt\r1' and we also need to build the shared lib using 'slprj\grt\_sharedutils\rtwshared.bat'. (See reproduction steps for more clarity) Questions: How to automate this such that the making of model references & shared libs i.e. executing 'slprj\grt\r1\r1.bat' & 'slprj\grt\_sharedutils\rtwshared.bat' becomes part of 'r2_grt_rtw\r2.bat' ?? If the first question is not feasible then how can we add custom hooks into 'r2_grt_rtw\r2.bat' or 'r2_grt_rtw\r2.mk' through Simulink Coder, to achieve the execution of 'slprj\grt\r1\r1.bat', 'slprj\grt\_sharedutils\rtwshared.bat' & may be more model references batch scripts ?? My assumption is that hooks in a makefile can help us in executing make commands for referenced models.

Expert Answer

Profile picture of Prashant Kumar Prashant Kumar answered . 2025-11-20

Please see the following points:
  • Through a suitable hook - like postCodeGen - you can programmatically construct a master script to call the individual makefiles / bat scripts. 
  • You can access the list of referenced models by querying 'buildInfo.ModelRefs'. BuildInfo is one of the auto-generated artifacts in the form of a MAT file, which you can load and access its data.
  • Here's some pseudocode that will compose paths of Model Reference libraries (and rtwsharedlib)
% Extract referenced model info
mdls = args.buildInfo.ModelRefs;

% Find the path of the directory code generation was started from
startDir = args.buildInfo.Settings.LocalAnchorDir;

% Initialize empty cell for path info
paths = cell(size(mdls));

% Additional Code for the Relative Directory
% Determine your current working directory
currentDir = pwd;

% Remove the starting directory from the current directory, this will leave
% only the path from the starting directory to the current folder.
pathFromAnchor = currentDir(2+length(startDir):end);

% Extract all the folders between the starting directory and the current
% directory
folders = strsplit(pathFromAnchor,'\');

% Create the relative path to the start directory based on the number of
% folders between the start and current directories.
relativePath = repmat('../',1,length(folders));

% If there are model references loop over them and construct the path for
% each reference

if ~isempty(mdls)
  for i = 1:length(mdls)
      libname = mdls(i).Name;
      fullpath = replace(mdls(i).Path,'$(START_DIR)\', relativePath);
      paths{i} = [fullpath,'\',libname];
  end
end

 
So, to conclude, using the above script as reference, you should be able to compose a script to build the generate code.
 
Alternatively, you can use the 'PackNGo' feature to obtain the list of files. You would need to use 'packType = hierarchical' and then add the makefiles to the buildInfo before calling PackNGo. 
 
Also, for your information, starting R2020b, a new API has been introduced i.e. 'codebuild' which can successfully generate a CMakeLists.txt for the complete application. This is exactly you are looking for. But this only exists starting R2020b.


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!