📄 directcommands.cpp
字号:
wxString compilerCmd = mg.CreateSingleFileCompileCmd(ctCompileObjectCmd,
0,
0,
s_filename,
o_filename,
wxEmptyString);
wxString linkerCmd = mg.CreateSingleFileCompileCmd(ctLinkConsoleExeCmd,
0,
0,
wxEmptyString,
o_filename,
wxEmptyString);
if (!compilerCmd.IsEmpty())
{
switch (m_pCompiler->GetSwitches().logging)
{
case clogFull:
ret.Add(wxString(COMPILER_SIMPLE_LOG) + compilerCmd);
break;
case clogSimple:
ret.Add(wxString(COMPILER_SIMPLE_LOG) + _("Compiling: ") + filename);
break;
default:
break;
}
AddCommandsToArray(compilerCmd, ret);
}
if (!linkerCmd.IsEmpty())
{
switch (m_pCompiler->GetSwitches().logging)
{
case clogFull:
ret.Add(wxString(COMPILER_SIMPLE_LOG) + linkerCmd);
break;
default:
ret.Add(wxString(COMPILER_SIMPLE_LOG) + _("Linking console executable: ") + exe_filename);
break;
}
AddCommandsToArray(linkerCmd, ret);
}
return ret;
}
wxArrayString DirectCommands::GetCompileCommands(ProjectBuildTarget* target, bool force)
{
wxArrayString ret;
if (target)
ret = GetTargetCompileCommands(target, force);
else
{
// add pre-build commands
AppendArray(GetPreBuildCommands(0L), ret);
size_t counter = ret.GetCount();
for (int x = 0; x < m_pProject->GetBuildTargetsCount(); ++x)
{
ProjectBuildTarget* bt = m_pProject->GetBuildTarget(x);
if (bt->GetIncludeInTargetAll()) // only if target gets build with "all"
{
wxArrayString targetcompile = GetTargetCompileCommands(bt, force);
AppendArray(targetcompile, ret);
}
}
bool needPost = ret.GetCount() != counter;
// remove pre-build commands if no compile needed and not always run pre-build commands
if (!needPost && !m_pProject->GetAlwaysRunPreBuildSteps())
ret.Clear();
// add post-build commands
if (needPost || m_pProject->GetAlwaysRunPostBuildSteps())
AppendArray(GetPostBuildCommands(0L), ret);
}
return ret;
}
wxArrayString DirectCommands::GetTargetCompileCommands(ProjectBuildTarget* target, bool force)
{
wxArrayString ret;
ret.Add(wxString(COMPILER_SIMPLE_LOG) + _("Switching to target: ") + target->GetTitle());
// NOTE: added this to notify compiler about the active target.
// this is needed when targets use different compiler each
// and C::B tries to parse the compiler's output.
// previous behaviour, used the project's compiler for parsing
// all targets output, which failed when a target's compiler
// was different than the project's...
ret.Add(wxString(COMPILER_TARGET_CHANGE) + target->GetTitle());
m_pCurrTarget = target;
// make sure all project files are saved
if (!m_pProject->SaveAllFiles())
wxMessageBox(_("Could not save all files. Build might be incomplete..."));
// add pre-build commands
AppendArray(GetPreBuildCommands(target), ret);
if (target->GetTargetType() == ttCommandsOnly)
{
// commands-only target
// we just have to run the post-build step
// runs *only* when:
// 1) "always run post-build step" is checked
// or
// 2) we have specified additional output files and the external-dep check fails
wxString added = target->GetAdditionalOutputFiles();
if (target->GetAlwaysRunPostBuildSteps() || // or always run post-build steps
(!added.IsEmpty() && // additional output files assigned
AreExternalDepsOutdated(wxEmptyString, added, target->GetExternalDeps()))) // or external dependencies say relink
{
AppendArray(GetPostBuildCommands(target), ret);
}
return ret;
}
// set list of #include directories
DepsSearchStart(target);
// iterate all files of the project/target and add them to the build process
size_t counter = ret.GetCount();
MyFilesArray files = GetProjectFilesSortedByWeight(target, true, false);
for (unsigned int i = 0; i < files.GetCount(); ++i)
{
ProjectFile* pf = files[i];
pfDetails pfd(this, target, pf);
bool doBuild = false;
if (pf->autoDeps)
doBuild = force || IsObjectOutdated(pfd);
else
{
wxString msg;
msg.Printf(_("File %s has custom dependencies set."
"This feature only works when using GNU \"make\""
"for the build process..."), pfd.source_file_native.c_str());
ret.Add(wxString(COMPILER_SIMPLE_LOG) + msg);
}
if (doBuild)
{
// compile file
wxArrayString filecmd = GetCompileFileCommand(target, pf);
AppendArray(filecmd, ret);
}
}
// add link command
wxArrayString link = GetLinkCommands(target, ret.GetCount() != counter);
AppendArray(link, ret);
bool needPost = ret.GetCount() != counter;
// remove pre-build commands if no compile needed and not always run pre-build commands
if (ret.GetCount() == counter && !target->GetAlwaysRunPreBuildSteps())
ret.Clear();
// add post-build commands
if (needPost || target->GetAlwaysRunPostBuildSteps())
AppendArray(GetPostBuildCommands(target), ret);
return ret;
}
wxArrayString DirectCommands::GetPreBuildCommands(ProjectBuildTarget* target)
{
wxArrayString buildcmds = target ? target->GetCommandsBeforeBuild() : m_pProject->GetCommandsBeforeBuild();
if (!buildcmds.IsEmpty())
{
Compiler* compiler = target ? CompilerFactory::Compilers[target->GetCompilerIndex()] : m_pCompiler;
wxString title = target ? target->GetTitle() : m_pProject->GetTitle();
switch (compiler->GetSwitches().logging)
{
case clogFull:
{
wxArrayString tmp;
for (size_t i = 0; i < buildcmds.GetCount(); ++i)
{
wxArrayString tmp2;
AddCommandsToArray(buildcmds[i], tmp2);
for (size_t n = 0; n < tmp2.GetCount(); ++n)
{
tmp.Add(wxString(COMPILER_SIMPLE_LOG) + tmp2[n]);
tmp.Add(tmp2[n]);
}
}
buildcmds = tmp;
}
break;
case clogSimple:
buildcmds.Insert(wxString(COMPILER_SIMPLE_LOG) + _("Running pre-build step: ") + title, 0);
default:
break;
}
}
return buildcmds;
}
wxArrayString DirectCommands::GetPostBuildCommands(ProjectBuildTarget* target)
{
wxArrayString buildcmds = target ? target->GetCommandsAfterBuild() : m_pProject->GetCommandsAfterBuild();
if (!buildcmds.IsEmpty())
{
wxString title = target ? target->GetTitle() : m_pProject->GetTitle();
switch (m_pCompiler->GetSwitches().logging)
{
case clogFull:
{
wxArrayString tmp;
for (size_t i = 0; i < buildcmds.GetCount(); ++i)
{
wxArrayString tmp2;
AddCommandsToArray(buildcmds[i], tmp2);
for (size_t n = 0; n < tmp2.GetCount(); ++n)
{
tmp.Add(wxString(COMPILER_SIMPLE_LOG) + tmp2[n]);
tmp.Add(tmp2[n]);
}
}
buildcmds = tmp;
}
break;
case clogSimple:
buildcmds.Insert(wxString(COMPILER_SIMPLE_LOG) + _("Running post-build step: ") + title, 0);
default:
break;
}
}
return buildcmds;
}
wxArrayString DirectCommands::GetLinkCommands(ProjectBuildTarget* target, bool force)
{
wxArrayString ret;
if (target)
ret = GetTargetLinkCommands(target, force);
else
{
for (int x = 0; x < m_pProject->GetBuildTargetsCount(); ++x)
{
ProjectBuildTarget* bt = m_pProject->GetBuildTarget(x);
if (bt->GetIncludeInTargetAll()) // only if target gets build with "all"
{
wxArrayString targetlink = GetTargetLinkCommands(bt, force);
AppendArray(targetlink, ret);
}
}
}
return ret;
}
wxArrayString DirectCommands::GetTargetLinkCommands(ProjectBuildTarget* target, bool force)
{
wxLogNull ln;
wxArrayString ret;
MakefileGenerator mg(m_pCompilerPlugin, m_pProject, _T(""), 0); // don't worry! we just need a couple of utility funcs from it
wxFileName out = UnixFilename(target->GetOutputFilename());
wxString output = target->GetOutputFilename();
Manager::Get()->GetMacrosManager()->ReplaceEnvVars(output);
wxString linkfiles;
wxString resfiles;
time_t outputtime;
depsTimeStamp(output.mb_str(), &outputtime);
if (!outputtime)
force = true;
if (AreExternalDepsOutdated(out.GetFullPath(), target->GetAdditionalOutputFiles(), target->GetExternalDeps()))
force = true;
wxString prependHack; // part of the following hack
if (target->GetTargetType() == ttStaticLib)
{
// QUICK HACK: some linkers (e.g. bcc, dmc) require a - or + in front of
// object files for static library. What we 'll do here until we redesign
// the thing, is to accept this symbol as part of the $link_objects macro
// like this:
// $+link_objects
// $-link_objects
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -