225 lines
8.1 KiB
Plaintext
225 lines
8.1 KiB
Plaintext
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Matlab S-Function project wizard
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// globals
|
|
MatlabPath <- _T("");
|
|
|
|
function BeginWizard()
|
|
{
|
|
local intro_msg = _T("Welcome to the new Matlab C-S-Function project wizard!\n\n" +
|
|
"This wizard will guide you to create a new project\n" +
|
|
"creating a Matlab C-S-Function using the GCC\n" +
|
|
"or Matlab LCC compiler.\n\n" +
|
|
"For GCC you must have converted the Matlab DLL's into\n" +
|
|
"GCC compatible libraries using the DLLTOOL before.\n" +
|
|
"On Windows, this wizard expects the GCC libraries at the location:\n" +
|
|
"[MATLAB]/extern/lib/win32/gcc\n\n" +
|
|
"When you're ready to proceed, please click \"Next\"...");
|
|
|
|
local matlabpath_descr = _T("Please select the location of Matlab on your computer.\n" +
|
|
"This is the top-level folder where Matlab was installed.");
|
|
|
|
Wizard.AddInfoPage(_T("MatlabCSFIntro"), intro_msg); // intro
|
|
Wizard.AddProjectPathPage();
|
|
Wizard.AddCompilerPage(_T(""), _T("gcc;lcc"), true, false); // compiler selection but no path selection
|
|
Wizard.AddGenericSelectPathPage(_T("MatlabPath"), matlabpath_descr, _T("Please select Matlab's location:"), _T("$(#matlab)"));
|
|
Wizard.AddPage(_T("MatlabHint"));
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Matlab's path page
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function OnLeave_MatlabPath(fwd)
|
|
{
|
|
if (fwd)
|
|
{
|
|
local dir = Wizard.GetTextControlValue(_T("txtFolder")); // txtFolder is the text control in GenericSelectPathPage
|
|
local dir_nomacro = ReplaceMacros(dir, true);
|
|
if (!IO.DirectoryExists(dir_nomacro))
|
|
{
|
|
ShowError(_T("Please select a valid path to Matlab..."));
|
|
return false;
|
|
}
|
|
// Verify Matlab extern includes
|
|
if (!IO.DirectoryExists(dir_nomacro + _T("/extern/include")))
|
|
{
|
|
ShowError(_T("The Matlab path you entered seems valid, but this wizard\n" +
|
|
"can't locate the Matlab extern include path in the sub-directory /extern/include"));
|
|
return false;
|
|
}
|
|
// Verify Matlab extern tmwtypes.h (Simulink types)
|
|
if (!IO.FileExists(dir_nomacro + _T("/extern/include/tmwtypes.h")))
|
|
{
|
|
ShowError(_T("The Matlab extern path seems valid, but this wizard\n" +
|
|
"can't locate the Matlab twmtypes.h in it."));
|
|
return false;
|
|
}
|
|
// Verify Simulink includes
|
|
if (!IO.DirectoryExists(dir_nomacro + _T("/simulink/include")))
|
|
{
|
|
ShowError(_T("The Matlab path you entered seems valid, but this wizard\n" +
|
|
"can't locate the Simulink include path in the sub-directory\n"
|
|
"/simulink/include"));
|
|
return false;
|
|
}
|
|
// Verify Matlab extern tmwtypes.h (Simulink types)
|
|
if (!IO.FileExists(dir_nomacro + _T("/simulink/include/simstruc.h")))
|
|
{
|
|
ShowError(_T("The Matlab-Simulink include path seems valid, but this wizard\n" +
|
|
"can't locate the Matlab simstruc.h in it."));
|
|
return false;
|
|
}
|
|
|
|
if (Wizard.GetCompilerID().Matches(_T("lcc")))
|
|
{
|
|
// Verify LCC includes
|
|
if (!IO.DirectoryExists(dir_nomacro + _T("/sys/lcc/include")))
|
|
{
|
|
ShowError(_T("The Matlab path you entered seems valid, but this wizard\n" +
|
|
"can't locate the LCC include path in the sub-directory\n" +
|
|
"/sys/lcc/include"));
|
|
return false;
|
|
}
|
|
if (PLATFORM == PLATFORM_MSW)
|
|
{
|
|
// Verify LCC libraries
|
|
if (!IO.DirectoryExists(dir_nomacro + _T("/extern/lib/win32/lcc")))
|
|
{
|
|
ShowError(_T("The Matlab path you entered seems valid, but this wizard\n" +
|
|
"can't locate the LCC library path in the sub-directory\n" +
|
|
"/extern/lib/win32/lcc"));
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
else if (Wizard.GetCompilerID().Matches(_T("gcc")))
|
|
{
|
|
if (PLATFORM == PLATFORM_MSW)
|
|
{
|
|
// Verify GCC libraries
|
|
if (!IO.DirectoryExists(dir_nomacro + _T("/extern/lib/win32/gcc")))
|
|
{
|
|
ShowError(_T("The Matlab path you entered seems valid, but this wizard\n" +
|
|
"can't locate the GCC library path in the sub-directory\n" +
|
|
"/extern/lib/win32/gcc"));
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
MatlabPath = dir;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// return the files this project contains
|
|
function GetFilesDir()
|
|
{
|
|
local result = _T("matlab_csf/files");
|
|
if (Wizard.GetCompilerID().Matches(_T("lcc")))
|
|
result += _T(";matlab_csf/lccstub");
|
|
|
|
return result;
|
|
}
|
|
|
|
// setup the already created project
|
|
function SetupProject(project)
|
|
{
|
|
// enable compiler warnings (project-wide)
|
|
if (Wizard.GetCompilerID().Matches(_T("lcc")))
|
|
{
|
|
if (!CompilerFactory.IsValidCompilerID(_T("lcc")))
|
|
{
|
|
ShowError(_T("The wizard has detected that your version of Code::Blocks does not\n" +
|
|
"support the LCC compiler which is required for this project.\n" +
|
|
"The wizard cannot continue. Please update Code::Blocks."));
|
|
return false;
|
|
}
|
|
|
|
// set project options for LCC
|
|
project.SetModeForPCH(pchSourceDir);
|
|
project.AddCompilerOption(_T("-Zp8")); // 8 byte alignment
|
|
project.AddCompilerOption(_T("-noregistrylookup")); // do not query the registry for libpath
|
|
|
|
project.AddLinkerOption(_T("-s"));
|
|
project.AddLinkerOption(_T("-tmpdir \".\""));
|
|
if (PLATFORM == PLATFORM_MSW)
|
|
{
|
|
project.AddLinkerOption(_T("-libpath ") + MatlabPath + _T("\\extern\\lib\\win32\\lcc"));
|
|
project.AddLinkerOption(MatlabPath + _T("\\extern\\lib\\win32\\lcc\\mexFunction.def"));
|
|
}
|
|
}
|
|
else if (Wizard.GetCompilerID().Matches(_T("gcc")))
|
|
{
|
|
// set project options for GCC
|
|
project.SetModeForPCH(pchSourceDir);
|
|
project.AddCompilerOption(_T("-malign-double")); // 8 byte alignment
|
|
project.AddCompilerOption(_T("-fno-exceptions")); // exception free code
|
|
|
|
project.AddLinkerOption(_T("-shared"));
|
|
project.AddLinkerOption(_T("-Wl,--out-implib=sfuntmpl")+DOT_EXT_STATICLIB);
|
|
if (PLATFORM == PLATFORM_MSW)
|
|
{
|
|
project.AddLibDir(MatlabPath + _T("/extern/lib/win32/gcc"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ShowError(_T("The selected compiler is not compatible with Matlab.\n" +
|
|
"The wizard cannot continue."));
|
|
return false;
|
|
}
|
|
|
|
// set common project options (the same for both compilers)
|
|
project.AddCompilerOption(_T("-DNDEBUG"));
|
|
project.AddCompilerOption(_T("-DMATLAB_MEX_FILE"));
|
|
|
|
project.AddIncludeDir(MatlabPath + _T("\\extern\\include"));
|
|
project.AddIncludeDir(MatlabPath + _T("\\simulink\\include"));
|
|
|
|
project.AddLinkLib(_T("libmx"));
|
|
project.AddLinkLib(_T("libmex"));
|
|
project.AddLinkLib(_T("libmatlb"));
|
|
project.AddLinkLib(_T("libmat"));
|
|
|
|
// Debug
|
|
local target = project.GetBuildTarget(Wizard.GetDebugName());
|
|
if (!IsNull(target))
|
|
{
|
|
target.SetTargetType(ttDynamicLib);
|
|
// the s-function DLL must have the same name as the file/function
|
|
target.SetOutputFilename(_T("sfuntmpl") + DOT_EXT_DYNAMICLIB);
|
|
target.SetWorkingDir(_T("."));
|
|
|
|
if (Wizard.GetCompilerID().Matches(_T("lcc")))
|
|
{
|
|
// It only works that way because the LCC resource compiler does not
|
|
// support creating it's "object files" (*.res) in any sub-directory
|
|
target.SetObjectOutput(_T(".")); //
|
|
}
|
|
}
|
|
|
|
// Release
|
|
target = project.GetBuildTarget(Wizard.GetReleaseName());
|
|
if (!IsNull(target))
|
|
{
|
|
target.SetTargetType(ttDynamicLib);
|
|
// the s-function DLL must have the same name as the file/function
|
|
target.SetOutputFilename(_T("sfuntmpl") + DOT_EXT_DYNAMICLIB);
|
|
target.SetWorkingDir(_T("."));
|
|
|
|
if (Wizard.GetCompilerID().Matches(_T("lcc")))
|
|
{
|
|
// It only works that way because the LCC resource compiler does not
|
|
// support creating it's "object files" (*.res) in any sub-directory
|
|
target.SetObjectOutput(_T(".")); //
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|