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

simulink

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.

Best Answer

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. https://www.mathworks.com/help/releases/R2017b/rtw/ug/customizing-post-code-generation-build-processing.html
  • 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. Read this for more info: https://www.mathworks.com/help/releases/R2017b/rtw/ref/packngo.html
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. https://www.mathworks.com/help/releases/R2020b/rtw/ref/codebuild.html