We're using the latest version of CMake(3.17), trying to compile a top level .m file into an executable on Matlab 2015b
I've done
find_package(Matlab OPTIONAL_COMPONENTS MEX_COMPILER MCC_COMPILER)
and it finds matlab. I'm able to make MEX files using matlab_add_mex() (and access them from matlab), but the next step is to take the top level .m file and compile it to an executable so it can be sent off to a compute farm to run very large input vectors.
At the commandline, we just do mcc -m simulation.m -I <required include paths> etc and it works. I want this to work in our CMake build environment with dependencies properly calculated (as best I can)
I assume I need to use add_custom_command() like what is mentioned here (https://gitlab.kitware.com/cmake/cmake/issues/18183), and I assume I need to calculate the dependencies correctly.
Using this cme.exe line, I can get the dependencies out to a file:
matlab -wait -nosplash -nojvm -nodesktop -r "[fList,~] = matlab.codetools.requiredFilesAndProducts('simulation.m');;for file = fList;fprintf(2,'%s\n',file{:});end;exit" -logfile output.txt
Is there a better way to do this? This ends up launching matlab and blopping the output to a file, rather than stdout or whatever. It's pretty dang slow to start up, as well.
I'm contemplating writing a python script or C program that embeds matlab that gets the information then prints it to stdout or just using mcc on the script that is supposed to calculate the dependencies, but that seems really, really convoluted for something that seems like a standard step in any repeatable build process.
So, any pointers? I can't find a way to get the dependencies except inside a matlab command line, and I'd hope that CMake had m->exe (in addition to mex) in its wheelhouse.
fwiw, I took the following and put it into a file get_dependencies.m:
function print_dependencies(filename)
[fList,~] = matlab.codetools.requiredFilesAndProducts(filename)
for file = fList
fprintf(1,'%s\n',file{:})
end
end
and compiled it using
mcc -m get_dependencies.m
And when it runs, it whines about undefined variables:
Undefined variable "matlab" or class "matlab.codetools.requiredFilesAndProducts".
Related
I have a function on image processing written in Matlab. I want to convert it into an executable file so that I can use that function in other applications. I tried Matlab coders, but since I'm using a Trial version, I don't have the Matlab Coder. What can be done?
Can the same code written in Octave be converted into an executable file?
img2=rgb2gray(i1);
imshow(img2);
img3=imtophat(img2,strel('disk',15));
img4=imadjust(img3);
layer=img4(:,:,1);
img5=layer>100 & layer<250;
img6=imfill(img5,'holes');
img7=bwareaopen(img6,5);
[L,ans]=bwlabeln(img7);
imshow(img7);
I=imread(i1);
Ians=CarDentIdentification(I);
% Display the original image and the segmented image side-by-side.
imshowpair(I,Ians,'montage')
I'm not sure how well this works on Windows or Mac but on UNIX systems, I've been able to call my GNU octave scripts as executables by adding this line to the top of my octave script
#!/usr/bin/octave
The "#!" gets picked up by your OS's program loader, and indicates that the following file is actually a script. The loader then looks to the given file path for the location of the interpreter. If your Octave interpreter is not at "/usr/bin/octave", you'd replace that section with the correct location.
After that you need to tell your OS that this script is an executable file. In bash you do that with this command.
chmod +x octaveFile.m
This let's you call your octave script just like any other executable. In my case, I then called my scripts from python using subprocess.call('octaveFile.m').
Note that this is not a MATLAB or Octave feature. This is done by the operating system, so results may vary.
I have a MATLAB script that I have to compile for deployment. I'm using the command 'mcc', however, I also need to include the toolboxes: PRTools (http://37steps.com/software/) and dd_tools (http://prlab.tudelft.nl/david-tax/dd_tools.html). I'm trying to include using the command addpath(), it does not work. I have no idea how to include those toolboxes. I tried to use:
if ~isdeployed
addpath PRTools
addpath dd_tools
end
but it does not work as well.
For deployment with mcc, you should add the paths to your MATLAB path (using pathtool or addpath) before compiling the application rather than calling addpath from within your code.
mcc statically analyzes your code to determine what needs to be included in the executable. Part of this static code analysis includes finding all function calls within your code and locating the corresponding source files. Since you are calling addpath from within your code, MATLAB is unable to properly locate all of the toolbox functions (since they are added to the path dynamically at run-time and the code is analyzed statically) and will omit these files.
If you add them to your MATLAB path first, mcc will be able to statically analyze your code, locate all needed toolbox functions, and include them in the resulting executable.
A cleaner alternative to modifying your path is to use the -I option when calling mcc to specify a specific folder to include.
-I Add a new folder path to the list of included folders. Each -I option adds a folder to the beginning of the list of paths to search. For example,
-I <directory1> -I <directory2>
sets up the search path so that directory1 is searched first for MATLAB files, followed by directory2. This option is important for standalone compilation where the MATLAB path is not available.
For your case this would be something like
mcc -m main.m -I PRTools -I dd_tools
I am trying to profile a CUDA code that is embedded in a mex file, called from MATLAB. Running on a win7 x64 machine, MATLAB r2014b
The code is structured as follows:
MATLAB test.m
->contains some standard code generating variables (and calling 1 or 2 minor own MATLAB fucntions)
-> calls testcuda.mex
->contains small, standard, no library C++ code
-> calls either test1.cu or test2.cu
->.cu files end in cudaDeviceReset();
I did the following, as stated in several places on the internet:
Compiled mex files. Test them. They work.
Add exit in the end of test.m.
Launch the NVIDIA Visual Profiler. File -> New Session.
add the full path of the Matlab executable file, for example C:\Program Files\MATLAB\R2014b\bin\matlab.exe
Working directory: add the full path of the Matlab .m file. C:\CUDA_MATLABtests\MyToolbox
Arguments: -nojvm -nosplash -r test
However, when I run the profiler,I get
======== Warning: No CUDA application was profiled, exiting
And nothing more.
I am missing some instruction?
Is there any particular code structure that would make the profiler not to profile?
A Matlab installation comes with two binaries, a launcher in <matlabroot>\bin and the main application in <matlabroot>\bin\<arch>. The later is the executable which also executes the mex functions in it's address space.
When a debugging tool needs to start the application directly, you have to start the one in <matlabroot>\bin\<arch>.
When a debugging tool automatically attaches to child processes as well, it is typically sufficient to start the binary in <matlabroot>\bin setting the -wait parameter. Seeing the launcher application terminating, debugging tools often stop.
Never use the binary in <matlabroot>\bin\<arch> directly unless you have to.
I am trying to compile a Matlab function using the mcc function. My function writes a line of text to a file.
function hello()
ofid = fopen('hello.txt','w');
fprintf(ofid, 'Hello there, this is matlab.\n');
fclose(ofid);
end
It runs as expected when called from the Matlab console. However, when I compile the file to an executable using mcc
/opt/matlab/matlab2008a/bin/mcc -m hello.m
and run it as
./hello
It seems to run forever and produces no hello.txt file. Both the executable as well as the Matlab function files are in the Matlab working directory.
I am unable to see what can be possibly wrong in my use of mcc. Please help.
Typically, you need to setup the MATLAB runtime environment when executing mcc compiled applications.
You'll probably get more mileage the first time by using deploytool (from the command line) to compile your hello.m program here. MATLAB's application builder will produce a run_hello.sh file that you can peruse through to see how they setup their libraries. Then, to execute your program you would actually call it like this:
./run_hello.sh /Applications/MATLAB/MATLAB_Runtime/v90/
Note: I have just included a generic location for the MATLAB runtime environment, but the actual location will vary depending on your platform and version of MATLAB you built the application with.
I've created a deployment project which works rather well and now I want to add it to source control repository for others to use.
The main problem I'm facing is that the .prj file which deploytool creates contains absolute paths which will not work on other computers. So far I've tried the following:
Create the stand alone exe using just mcc without deploytool. This works great but I could find a way to create the final _pkg.exe which contains everything. mcc doesn't seem to be able to create this file and there doesn't seem to be any other tool which does. Is this really the case?
Edit the .prj file to include relative paths instead of absolute paths. This only works partially because the .prj file contains a section called MATLABPath which is always replaced with the current setpath of matlab. anyone which uses this file will have to check it out since it is being changed when used.
Find a way to generate the .prj file. the mcc documentation say: Project files created using either mcc or deploytool are eligible to use this option. suggesting there is a way to create a .prj file using mcc but I wasn't able to find how this can be done.
Is there a solution to this situation?
We ran into the same thing with Matlab Builder JA. Not only are the paths absolute, Matlab also adds other toolboxes that it finds on the path, which is irritating, as the build machine doesn't have licenses for a lot of them.
So what we do is:
Edit the prj file by hand to get rid of the absolute paths
Check it into source control and build with mcc
NEVER EVER check in the prj file after it has been touched by deploytool (do all changes by hand in an editor)
Our revision control lets you modify files without an explicit checkout, so using deploytool is not a problem. But why would you want to?
Not sure what the final packager does, but if it just bundles the MCR with the compiled binary, I would just write a replacement.
I personally use Visual Studio 2005 project to maintain my deployment projects and then convert the VCPROJ to PRJ on the fly using build command step
http://younsi.blogspot.com/2011/11/matlab-relative-path-issue-in-prj.html
Here's the mcc option documentation.
What I've found most useful is creating a standalone exe using mcc:
mcc -C -m <function.m> -a <fig> -a <dll> -a <etc> -d <outputPath>
The -C option tells mcc to generate the ctf file (which is the archive of all the compiled MATLAB stuff) as a separate file. I've had trouble on some target computers using a single exe with everything compiled in.
The -m option tells mcc to make an exe.
The -a options tell mcc to include the specified file in the package. For instance, if your script uses two fig files and a data file, you need a -a for each to make sure they get put in the output package.
To tell mcc to use a project file (I've never done this myself):
mcc -F <projectfile>
Also, if you're using R2009a on Windows, there's a known bug that requires some manifest manipulation.