This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/share/CodeBlocks/templates/wizard/matlab_csf/wizard.script

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;
}