Compiler* CompilerFactory::CreateCompilerCopy(Compiler* compiler, const wxString& newName) { if (!compiler) return nullptr; // abort if an existing compiler with the same name exists // this also avoids the possibility of throwing an exception // in the compiler->CreateCopy() call below... for (size_t i = 0; i < Compilers.GetCount(); ++i) { if (Compilers[i]->GetName() == newName) return nullptr; } Compiler* newC = compiler->CreateCopy(); if (!newName.IsEmpty()) { Compiler::m_CompilerIDs.Remove(newC->GetID()); newC->SetName(newName); newC->m_ID = newName; newC->MakeValidID(); } newC->ReloadOptions(); RegisterCompiler(newC); newC->LoadSettings(_T("/user_sets")); Manager::Get()->GetLogManager()->DebugLog(F(_T("Added compiler \"%s\""), newC->GetName().wx_str())); return newC; // return the index for the new compiler }
WizCompilerPanel::WizCompilerPanel(const wxString& compilerID, const wxString& validCompilerIDs, wxWizard* parent, const wxBitmap& bitmap, bool allowCompilerChange, bool allowConfigChange) : WizPageBase(_T("CompilerPage"), parent, bitmap), m_AllowConfigChange(allowConfigChange) { m_pCompilerPanel = new CompilerPanel(this, GetParent()); wxArrayString valids = GetArrayFromString(validCompilerIDs, _T(";"), true); wxString def = compilerID; if (def.IsEmpty()) def = CompilerFactory::GetDefaultCompilerID(); int id = 0; wxComboBox* cmb = m_pCompilerPanel->GetCompilerCombo(); cmb->Clear(); for (size_t i = 0; i < CompilerFactory::GetCompilersCount(); ++i) { Compiler* compiler = CompilerFactory::GetCompiler(i); if (compiler) { for (size_t n = 0; n < valids.GetCount(); ++n) { // match not only if IDs match, but if ID inherits from it too if (CompilerFactory::CompilerInheritsFrom(compiler, valids[n])) { cmb->Append(compiler->GetName()); if (compiler->GetID().IsSameAs(def)) id = (cmb->GetCount() - 1) < 0 ? 0 : (cmb->GetCount() - 1); break; } } } } cmb->SetSelection(id); cmb->Enable(allowCompilerChange); m_pCompilerPanel->EnableConfigurationTargets(m_AllowConfigChange); ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("scripts")); m_pCompilerPanel->SetWantDebug(cfg->ReadBool(_T("/generic_wizard/want_debug"), true)); m_pCompilerPanel->SetDebugName(cfg->Read(_T("/generic_wizard/debug_name"), _T("Debug"))); m_pCompilerPanel->SetDebugOutputDir(cfg->Read(_T("/generic_wizard/debug_output"), _T("bin") + wxString(wxFILE_SEP_PATH) + _T("Debug"))); m_pCompilerPanel->SetDebugObjectOutputDir(cfg->Read(_T("/generic_wizard/debug_objects_output"), _T("obj") + wxString(wxFILE_SEP_PATH) + _T("Debug"))); m_pCompilerPanel->SetWantRelease(cfg->ReadBool(_T("/generic_wizard/want_release"), true)); m_pCompilerPanel->SetReleaseName(cfg->Read(_T("/generic_wizard/release_name"), _T("Release"))); m_pCompilerPanel->SetReleaseOutputDir(cfg->Read(_T("/generic_wizard/release_output"), _T("bin") + wxString(wxFILE_SEP_PATH) + _T("Release"))); m_pCompilerPanel->SetReleaseObjectOutputDir(cfg->Read(_T("/generic_wizard/release_objects_output"), _T("obj") + wxString(wxFILE_SEP_PATH) + _T("Release"))); }
WizBuildTargetPanel::WizBuildTargetPanel(const wxString& targetName, bool isDebug, wxWizard* parent, const wxBitmap& bitmap, bool showCompiler, const wxString& compilerID, const wxString& validCompilerIDs, bool allowCompilerChange) : WizPageBase(_T("BuildTargetPage"), parent, bitmap) { m_pBuildTargetPanel = new BuildTargetPanel(this); m_pBuildTargetPanel->SetTargetName(targetName); m_pBuildTargetPanel->SetEnableDebug(isDebug); m_pBuildTargetPanel->ShowCompiler(showCompiler); if (showCompiler) { wxArrayString valids = GetArrayFromString(validCompilerIDs, _T(";"), true); wxString def = compilerID; if (def.IsEmpty()) def = CompilerFactory::GetDefaultCompiler()->GetName(); int id = 0; wxComboBox* cmb = m_pBuildTargetPanel->GetCompilerCombo(); cmb->Clear(); for (size_t i = 0; i < CompilerFactory::GetCompilersCount(); ++i) { for (size_t n = 0; n < valids.GetCount(); ++n) { Compiler* compiler = CompilerFactory::GetCompiler(i); if (compiler) { if (compiler->GetID().Matches(valids[n])) { cmb->Append(compiler->GetName()); if (compiler->GetID().IsSameAs(def)) id = cmb->GetCount(); break; } } } } cmb->SetSelection(id); cmb->Enable(allowCompilerChange); } }
AutoDetectCompilers::AutoDetectCompilers(wxWindow* parent) { //ctor wxXmlResource::Get()->LoadObject(this, parent, _T("dlgAutoDetectCompilers"),_T("wxScrollingDialog")); wxListCtrl* list = XRCCTRL(*this, "lcCompilers", wxListCtrl); if (list) { list->Connect(wxEVT_MOTION, wxMouseEventHandler(AutoDetectCompilers::OnMouseMotion)); list->ClearAll(); list->InsertColumn(0, _("Compiler"), wxLIST_FORMAT_LEFT, 380); list->InsertColumn(1, _("Status"), wxLIST_FORMAT_LEFT, 100); for (size_t i = 0; i < CompilerFactory::GetCompilersCount(); ++i) { Compiler* compiler = CompilerFactory::GetCompiler(i); if (!compiler) continue; list->InsertItem(list->GetItemCount(), compiler->GetName()); wxString path = compiler->GetMasterPath(); wxString path_no_macros = compiler->GetMasterPath(); Manager::Get()->GetMacrosManager()->ReplaceMacros(path_no_macros); int idx = list->GetItemCount() - 1; int highlight = 0; if (path.IsEmpty() && Manager::Get()->GetConfigManager(wxT("compiler"))->Exists(wxT("/sets/") + compiler->GetID() + wxT("/name"))) { // Here, some user-interaction is required not to show this // dialog again on each new start-up of C::B. list->SetItem(idx, 1, _("Invalid")); // So we better clearly HIGHLIGHT this entry: highlight = 1; } else // The compiler is *probably* invalid, but at least a master-path is set { list->SetItem(idx, 1, _("Not found")); highlight = -1; } // Inspect deeper and probably try to auto-detect invalid compilers: if (compiler->GetParentID().IsEmpty()) // built-in compiler { // Try auto-detection (which is for built-in compilers only) bool detected = compiler->AutoDetectInstallationDir() == adrDetected; wxString pathDetected( compiler->GetMasterPath() ); // In case auto-detection was successful: if (detected) { // No path setup before OR path detected as it was setup before if (path.IsEmpty() || path == pathDetected || path_no_macros == pathDetected) list->SetItem(idx, 1, _("Detected")); // OK else list->SetItem(idx, 1, _("User-defined")); // OK highlight = 0; } // In case auto-detection failed but a path was setup before: else if ( !path.IsEmpty() ) { // Check, if the master path is valid: if ( wxFileName::DirExists(path_no_macros) && !(path == pathDetected || path_no_macros == pathDetected) ) { list->SetItem(idx, 1, _("User-defined")); // OK highlight = 0; } // Assume the user did the setup on purpose, so reset the old settings anyways: compiler->SetMasterPath(path); } } else // no built-in, but user-defined (i.e. copied) compiler { // Check, if the master path is valid: if ( !path.IsEmpty() && wxFileName::DirExists(path_no_macros) ) { list->SetItem(idx, 1, _("User-defined")); // OK highlight = 0; } } if (highlight == 1) list->SetItemBackgroundColour(idx, *wxRED); else if (highlight == -1) list->SetItemTextColour(idx, *wxLIGHT_GREY); } // Resize columns so one can read the whole stuff: list->SetColumnWidth(0, wxLIST_AUTOSIZE); list->SetColumnWidth(1, wxLIST_AUTOSIZE); } XRCCTRL(*this, "lblDefCompiler", wxStaticText)->SetLabel(CompilerFactory::GetDefaultCompiler()->GetName()); }
void DebuggerManager::FindTargetsDebugger() { if (Manager::Get()->GetProjectManager()->IsLoadingOrClosing()) return; m_activeDebugger = nullptr; m_menuHandler->SetActiveDebugger(nullptr); if (m_registered.empty()) { m_menuHandler->MarkActiveTargetAsValid(false); return; } ProjectManager* projectMgr = Manager::Get()->GetProjectManager(); LogManager* log = Manager::Get()->GetLogManager(); cbProject* project = projectMgr->GetActiveProject(); ProjectBuildTarget *target = nullptr; if (project) { const wxString &targetName = project->GetActiveBuildTarget(); if (project->BuildTargetValid(targetName)) target = project->GetBuildTarget(targetName); } Compiler *compiler = nullptr; if (!target) { if (project) compiler = CompilerFactory::GetCompiler(project->GetCompilerID()); if (!compiler) compiler = CompilerFactory::GetDefaultCompiler(); if (!compiler) { log->LogError(_("Can't get the compiler for the active target, nor the project, nor the default one!")); m_menuHandler->MarkActiveTargetAsValid(false); return; } } else { compiler = CompilerFactory::GetCompiler(target->GetCompilerID()); if (!compiler) { log->LogError(wxString::Format(_("Current target '%s' doesn't have valid compiler!"), target->GetTitle().c_str())); m_menuHandler->MarkActiveTargetAsValid(false); return; } } wxString dbgString = compiler->GetPrograms().DBGconfig; wxString::size_type pos = dbgString.find(wxT(':')); wxString name, config; if (pos != wxString::npos) { name = dbgString.substr(0, pos); config = dbgString.substr(pos + 1, dbgString.length() - pos - 1); } if (name.empty() || config.empty()) { log->LogError(wxString::Format(_("Current compiler '%s' doesn't have correctly defined debugger!"), compiler->GetName().c_str())); m_menuHandler->MarkActiveTargetAsValid(false); return; } for (RegisteredPlugins::iterator it = m_registered.begin(); it != m_registered.end(); ++it) { PluginData &data = it->second; if (it->first->GetSettingsName() == name) { ConfigurationVector &configs = data.GetConfigurations(); int index = 0; for (ConfigurationVector::iterator itConf = configs.begin(); itConf != configs.end(); ++itConf, ++index) { if ((*itConf)->GetName() == config) { m_activeDebugger = it->first; m_activeDebugger->SetActiveConfig(index); m_useTargetsDefault = true; WriteActiveDebuggerConfig(wxEmptyString, -1); RefreshUI(); m_menuHandler->MarkActiveTargetAsValid(true); return; } } } } wxString targetTitle(target ? target->GetTitle() : wxT("<nullptr>")); log->LogError(wxString::Format(_("Can't find the debugger config: '%s:%s' for the current target '%s'!"), name.c_str(), config.c_str(), targetTitle.c_str())); m_menuHandler->MarkActiveTargetAsValid(false); }