function amtmex(varargin)
%AMTMEX Compile Mex/Oct interfaces
% Usage: amtmex;
% amtmex(...);
%
% `amtmex` compiles the C backend in order to speed up the execution of
% the toolbox. The C backend is linked to Matlab and Octave through mex
% and Octave C++ interfaces.
%
% The action of `amtmex` is determined by one of the following flags:
%
% 'compile' Compile stuff. This is the default.
%
% 'clean' Removes the compiled functions.
% AUTHOR : Peter Søndergaard.
% TESTING: NA
% REFERENCE: NA
bp=mfilename('fullpath');
bp=bp(1:end-6);
defnopos.flags.command={'compile','clean'};
[flags,kv]=ltfatarghelper({},defnopos,varargin);
% Remember the current directory.
curdir=pwd;
if isoctave
extname='oct';
ext='oct';
else
extname='mex';
ext=mexext;
end;
% -------------- Handle cleaning --------------------------------
if flags.do_clean
if ~isoctave
% Delete files permanently (bypass trashcan on Windows/Mac
% but remember the old state
oldstate = recycle('off');
end;
fprintf('========= Cleaning %s interfaces ==========\n', extname);
if isoctave
deletefiles([bp,'oct'],'*.oct');
deletefiles([bp,'oct'],'*.o');
else
deletefiles([bp,'mex'],['*.',mexext]);
end;
if ~isoctave
recycle(oldstate);
end;
end;
% -------------- Handle compiling --------------------------------
if flags.do_compile
fprintf('========= Compiling %s interfaces ==========\n', extname);
if compile_amt(bp)>1;
fprintf('ERROR: The %s interfaces was not built.\n', extname);
else
disp('Done.');
end;
end;
% Jump back to the original directory.
cd(curdir);
function deletefiles(base,files)
L=dir([base,filesep,files]);
for ii=1:numel(L)
s=[base,filesep,L(ii).name];
delete(s);
end;
function status=compile_amt(bp)
% If we exit early, it is because of an error, so set status=1
status=1;
if isoctave
cd([bp,'oct']);
ext='oct';
% Get the list of files.
L=dir('*.cc');
endchar=2;
else
cd([bp,'mex']);
ext=mexext;
% Get the list of files.
L=dir('comp_*.c');
endchar=1;
end;
for ii=1:numel(L)
filename = L(ii).name;
objname = [filename(1:end-endchar),ext];
objdirinfo = dir(objname);
% Make-like behaviour: build only the files where the src file is
% newer than the object file, or the object file is missing.
if isempty(objdirinfo) || (objdirinfo.datenum<L(ii).datenum)
fprintf('Compiling %s\n',filename);
if isoctave
mkoctfile('-I.','-I../src','-L../src',filename);
else
mex('-I.','-I../src','-L../src',filename);
end;
end;
end;
status=0;