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

V
Vashu_hn · Oct 8, 2021 · 2.1K views
Question
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 PhD Expert
Answered Nov 20, 2025
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.
Have a different question? Ask here

Get a Free Consultation or a Sample Assignment Review!