📄 makefilegenerator.cpp
字号:
void MakefileGenerator::DoAddMakefileLibs(wxString& buffer)
{
buffer << _T("### Targets libraries") << _T('\n');
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target)
break;
// create target's options only if it has at least one linkable file
if (!IsTargetValid(target))
continue;
wxString tmp;
DoGetMakefileLibs(tmp, target);
buffer << target->GetTitle() << _T("_LIBS=") << tmp << _T('\n');
}
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileLibDirs(wxString& buffer)
{
buffer << _T("### Targets library directories") << _T('\n');
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target)
break;
// create target's options only if it has at least one linkable file
if (!IsTargetValid(target))
continue;
wxString tmp;
DoGetMakefileLibDirs(tmp, target);
buffer << target->GetTitle() << _T("_LIBDIRS=") << tmp << _T('\n');
}
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileCFlags(wxString& buffer)
{
buffer << _T("### Targets compiler flags") << _T('\n');
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target)
break;
// create target's options only if it has at least one linkable file
if (!IsTargetValid(target))
continue;
wxString tmp;
DoGetMakefileCFlags(tmp, target);
buffer << target->GetTitle() << _T("_CFLAGS=") << tmp << _T('\n');
}
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileLDFlags(wxString& buffer)
{
buffer << _T("### Targets linker flags") << _T('\n');
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target)
break;
// create target's options only if it has at least one linkable file
if (!IsTargetValid(target))
continue;
wxString tmp;
DoGetMakefileLDFlags(tmp, target);
buffer << target->GetTitle() << _T("_LDFLAGS=") << tmp;
buffer << _T('\n');
}
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileTargets(wxString& buffer)
{
buffer << _T("### The targets of this project") << _T('\n');
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target)
break;
// create target's options only if it has at least one linkable file
if (!IsTargetValid(target))
continue;
UpdateCompiler(target);
// the filename is already adapted based on the project type
wxString out = UnixFilename(target->GetOutputFilename());
if (!m_GeneratingMakefile)
Manager::Get()->GetMacrosManager()->ReplaceEnvVars(out);
ConvertToMakefileFriendly(out);
// QuoteStringIfNeeded(out);
buffer << target->GetTitle() << _T("_BIN=") << out << _T('\n');
if (target->GetTargetType() == ttDynamicLib)
{
wxFileName fname(target->GetOutputFilename());
if (!fname.GetName().StartsWith(m_CompilerSet->GetSwitches().libPrefix))
fname.SetName(m_CompilerSet->GetSwitches().libPrefix + fname.GetName());
fname.SetExt(m_CompilerSet->GetSwitches().libExtension);
out = UnixFilename(fname.GetFullPath());
Manager::Get()->GetMacrosManager()->ReplaceEnvVars(out);
ConvertToMakefileFriendly(out);
QuoteStringIfNeeded(out);
buffer << target->GetTitle() << _T("_STATIC_LIB=") << out << _T('\n');
fname.SetExt(_T("def"));
out = UnixFilename(fname.GetFullPath());
Manager::Get()->GetMacrosManager()->ReplaceEnvVars(out);
ConvertToMakefileFriendly(out);
QuoteStringIfNeeded(out);
buffer << target->GetTitle() << _T("_LIB_DEF=") << out << _T('\n');
}
}
buffer << _T('\n');
}
void MakefileGenerator::DoAddPhonyTargets(wxString& buffer)
{
wxString tmp;
tmp << _T("all all-before all-custom all-after clean clean-custom distclean distclean-custom ");
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!IsTargetValid(target))
continue;
tmp << _T("depend_") << target->GetTitle() << _T(" ")
<< target->GetTitle() << _T("-before ")
<< target->GetTitle() << _T("-after ");
}
buffer << _T(".PHONY: ") << tmp << _T('\n');
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileTarget_All(wxString& buffer)
{
wxString tmp;
wxString deps;
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target)
continue;
UpdateCompiler(target);
if (target->GetIncludeInTargetAll())
{
// create target's options only if it has at least one linkable file
// or custom commands...
if (IsTargetValid(target))
{
tmp << target->GetTitle() << _T(" ");
// to include dependencies, the target must have linkable files...
// if (m_LinkableTargets.Index(target) != -1 && m_CompilerSet->GetSwitches().needDependencies)
// deps << _T("-include $(") << target->GetTitle() << _T("_DEPS)") << _T('\n');
}
}
}
if (!tmp.IsEmpty()) // include target "all" first, so it is the default target
buffer << _T("all: all-before ") << tmp << _T("all-after") << _T('\n');
if (!deps.IsEmpty()) // include dependencies too
buffer << deps;
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileCommands(const wxString& desc, const wxString& prefix, const wxArrayString& commands, wxString& buffer)
{
if (!m_CompilerSet)
return;
if (commands.GetCount())
{
// run any user-defined commands *before* build
if (!prefix.IsEmpty())
buffer << prefix << _T(": ") << _T('\n');
if (m_CompilerSet->GetSwitches().logging == clogSimple)
buffer << _T('\t') << _T("@echo ") << desc << _T('\n');
for (unsigned int i = 0; i < commands.GetCount(); ++i)
{
wxString tmp = commands[i];
Manager::Get()->GetMacrosManager()->ReplaceMacros(tmp);
buffer << _T('\t') << m_Quiet << tmp << _T('\n');
}
buffer << _T('\n');
}
}
void MakefileGenerator::DoAddMakefileTargets_BeforeAfter(wxString& buffer)
{
DoAddMakefileCommands(_T("Running project pre-build step"), _T("all-before"), m_Project->GetCommandsBeforeBuild(), buffer);
DoAddMakefileCommands(_T("Running project post-build step"), _T("all-after"), m_Project->GetCommandsAfterBuild(), buffer);
wxString tmp;
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target || !IsTargetValid(target))
continue;
tmp.Clear();
tmp << target->GetTitle() << _T("-before");
DoAddMakefileCommands(_("Running pre-build step"), tmp, target->GetCommandsBeforeBuild(), buffer);
tmp.Clear();
tmp << target->GetTitle() << _T("-after");
DoAddMakefileCommands(_("Running post-build step"), tmp, target->GetCommandsAfterBuild(), buffer);
}
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileTarget_Clean(wxString& buffer)
{
wxString tmp;
wxString tmp1;
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target)
break;
// create target's options only if it has at least one linkable file
if (!IsTargetValid(target))
continue;
UpdateCompiler(target);
buffer << _T("clean_") << target->GetTitle() << _T(":") << _T('\n');
if (m_CompilerSet->GetSwitches().logging == clogSimple)
buffer << _T('\t') << _T("@echo Cleaning target \"") << target->GetTitle() << _T("\"...") << _T('\n');
buffer << _T('\t') << m_Quiet << _T("$(RM) $(") << target->GetTitle() << _T("_BIN) ");
buffer << _T("$(") << target->GetTitle() << _T("_OBJS) ");
buffer << _T("$(") << target->GetTitle() << _T("_RESOURCE) ");
if (target->GetTargetType() == ttDynamicLib)
{
buffer << _T("$(") << target->GetTitle() << _T("_STATIC_LIB) ");
buffer << _T("$(") << target->GetTitle() << _T("_LIB_DEF) ");
}
buffer << _T('\n') << _T('\n');
tmp << _T("clean_") << target->GetTitle() << _T(" ");
buffer << _T("distclean_") << target->GetTitle() << _T(":") << _T('\n');
if (m_CompilerSet->GetSwitches().logging == clogSimple)
buffer << _T('\t') << _T("@echo Dist-cleaning target \"") << target->GetTitle() << _T("\"...") << _T('\n');
buffer << _T('\t') << m_Quiet << _T("$(RM) $(") << target->GetTitle() << _T("_BIN) ");
buffer << _T("$(") << target->GetTitle() << _T("_OBJS) ");
buffer << _T("$(") << target->GetTitle() << _T("_DEPS) ");
buffer << _T("$(") << target->GetTitle() << _T("_RESOURCE) ");
if (target->GetTargetType() == ttDynamicLib)
{
buffer << _T("$(") << target->GetTitle() << _T("_STATIC_LIB) ");
buffer << _T("$(") << target->GetTitle() << _T("_LIB_DEF) ");
}
buffer << _T('\n') << _T('\n');
tmp1 << _T("distclean_") << target->GetTitle() << _T(" ");
}
buffer << _T("clean: ") << tmp << _T('\n');
buffer << _T('\n');
buffer << _T("distclean: ") << tmp1 << _T('\n');
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileTarget_Dist(wxString& buffer)
{
wxString tmp = _T("${PROJECT_FILENAME} ${MAKEFILE} ${ALL_PROJECT_FILES}");
Manager::Get()->GetMacrosManager()->ReplaceMacros(tmp);
wxFileName fname(m_Project->GetFilename());
wxString projname = UnixFilename(fname.GetFullName());
Manager::Get()->GetMacrosManager()->ReplaceEnvVars(projname);
ConvertToMakefileFriendly(projname);
QuoteStringIfNeeded(projname);
buffer << _T("dist:") << _T('\n');
buffer << _T('\t') << _T("@zip ") << projname << _T(".zip ") << tmp << _T('\n');
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileTarget_Depend(wxString& buffer)
{
wxString tmp;
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
if (!target)
continue;
// create target's options only if it has at least one linkable file
if (!IsTargetValid(target))
continue;
UpdateCompiler(target);
if (!m_CompilerSet->GetSwitches().needDependencies)
continue;
buffer << _T("depend_") << target->GetTitle() << _T("_DIRS:") << _T('\n');
DoAddMakefileCreateDirs(buffer, target, false, true, false);
buffer << _T('\n');
buffer << _T("depend_") << target->GetTitle() << _T(": depend_") << target->GetTitle() << _T("_DIRS $(") << target->GetTitle() << _T("_DEPS)") << _T('\n');
buffer << _T('\n');
tmp << _T(" depend_") << target->GetTitle();
}
buffer << _T("depend:") << tmp << _T('\n');
buffer << _T('\n');
}
void MakefileGenerator::DoAddMakefileTarget_Link(wxString& buffer)
{
int targetsCount = m_Project->GetBuildTargetsCount();
for (int x = 0; x < targetsCount; ++x)
{
ProjectBuildTarget* target = m_Project->GetBuildTarget(x);
UpdateCompiler(target);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -