void EditConfigurationDialog::RenameConfiguration(const wxString &oldName, const wxString &newName) { ProjectSettingsPtr settings = ManagerST::Get()->GetProjectSettings(m_projectName); if(settings){ BuildConfigPtr bldConf = settings->GetBuildConfiguration(oldName); if(bldConf){ settings->RemoveConfiguration(oldName); bldConf->SetName(newName); settings->SetBuildConfiguration(bldConf); //save changes ManagerST::Get()->SetProjectSettings(m_projectName, settings); //update the control m_configurationsList->Clear(); ProjectSettingsCookie cookie; BuildConfigPtr bldConf = settings->GetFirstBuildConfiguration(cookie); while(bldConf){ m_configurationsList->Append(bldConf->GetName()); bldConf = settings->GetNextBuildConfiguration(cookie); } if(m_configurationsList->GetCount()>0) m_configurationsList->SetSelection(0); } } }
void MacBundler::showSettingsDialogFor(ProjectPtr project) { // project->GetSettings()->GetGlobalSettings(); // project->GetSettings()->GetBuildConfiguration(name); ProjectSettingsCookie cookie; ProjectSettingsPtr settings = project->GetSettings(); if(not settings) { wxMessageBox(_("Cannot continue, impossible to access project settings.")); return; } std::map<wxString, BuildConfigPtr> configs; wxArrayString choices; // TODO: allow putting the rules in the config root and not in every target BuildConfigPtr buildConfig = settings->GetFirstBuildConfiguration(cookie); while(buildConfig) { configs[buildConfig->GetName()] = buildConfig; choices.Add(buildConfig->GetName()); buildConfig = settings->GetNextBuildConfiguration(cookie); } bool accepted = false; bool generateInfoPlistFile = false; bool generateIcon = false; wxArrayString targetsToSet; wxString iconName(wxT("icon.icns")); { BundleConfigDialog configDlg(project, m_mgr->GetTheApp()->GetTopWindow(), choices, m_mgr); configDlg.ShowModal(); accepted = configDlg.getResults(targetsToSet, &generateInfoPlistFile, &generateIcon); iconName = configDlg.getIconDestName(); if(accepted and generateInfoPlistFile) { wxFileName projPath = project->GetFileName(); projPath.SetFullName(wxT("")); const wxString projectDirName = projPath.GetFullPath(); const wxString infoPlistFile = projectDirName + wxT("/Info.plist"); if(wxFileExists(infoPlistFile)) { int out = wxMessageBox(wxString::Format(_("The following file:\n%s\nalready exists, overwrite it?\n"), infoPlistFile.c_str()), _("Warning"), wxYES_NO); if(out == wxYES) { wxTextFile file; file.Open(infoPlistFile); file.Clear(); configDlg.writeInfoPlistFile(file); file.Close(); } } else { wxTextFile file; if(not file.Create(infoPlistFile)) { wxMessageBox(_("Could not create Info.plist file\n") + infoPlistFile); } else { configDlg.writeInfoPlistFile(file); file.Close(); } } if(wxFileExists(infoPlistFile)) { // FIXME: if the file was already present, it will be added again and appear twice in the file tree wxArrayString paths; paths.Add(infoPlistFile); m_mgr->CreateVirtualDirectory(project->GetName(), wxT("osx")); m_mgr->AddFilesToVirtualFolder(project->GetName() + wxT(":osx"), paths); } } // nend if create info.plist if(accepted and generateIcon) { wxString iconSourcePath = configDlg.getIconSource(); if(not iconSourcePath.IsEmpty()) { // sips doesn't like double slashes in path names iconSourcePath.Replace(wxT("//"), wxT("/")); wxFileName projPath = project->GetFileName(); projPath.SetFullName(wxT("")); const wxString projectDirName = projPath.GetFullPath(); wxString iconFileDest = projectDirName + wxT("/") + configDlg.getIconDestName(); // sips doesn't like double slashes in path names iconFileDest.Replace(wxT("//"), wxT("/")); std::cout << "Copying icon '" << iconSourcePath.mb_str() << "' to project\n"; if(iconSourcePath.EndsWith(wxT(".icns"))) { if(not wxCopyFile(iconSourcePath, iconFileDest)) { wxMessageBox(_("Sorry, could not copy icon")); } } else { wxString cmd = wxT("sips -s format icns '") + iconSourcePath + wxT("' --out '") + iconFileDest + wxT("'"); std::cout << cmd.mb_str() << std::endl; wxExecute(cmd, wxEXEC_SYNC); if(not wxFileExists(iconFileDest)) { wxMessageBox(_("Sorry, could not convert selected icon to icns format")); } } // FIXME: if the file was already present, it will be added again and appear twice in the file tree if(wxFileExists(iconFileDest)) { wxArrayString paths; paths.Add(iconFileDest); m_mgr->CreateVirtualDirectory(project->GetName(), wxT("osx")); m_mgr->AddFilesToVirtualFolder(project->GetName() + wxT(":osx"), paths); } } // end if icon not null } // end if generate icon } if(!accepted) return; for(int n = 0; n < targetsToSet.GetCount(); n++) { BuildConfigPtr buildConfig = configs[targetsToSet[n]]; wxString outputFileName = buildConfig->GetOutputFileName(); wxString output = wxT("$(ProjectName).app/Contents/MacOS/$(ProjectName)"); buildConfig->SetOutputFileName(wxT("$(IntermediateDirectory)/") + output); buildConfig->SetCommand(wxT("./") + output); if(generateInfoPlistFile or generateIcon) { // get existing custom makefile targets, if any wxString customPreBuild = buildConfig->GetPreBuildCustom(); wxString deps, rules; deps = customPreBuild.BeforeFirst(wxT('\n')); rules = customPreBuild.AfterFirst(wxT('\n')); rules = rules.Trim(); rules = rules.Trim(false); deps = deps.Trim(); deps = deps.Trim(false); if(generateInfoPlistFile) { // augment existing rules with new rules to manage Info.plist file deps.Append(wxT(" $(IntermediateDirectory)/$(ProjectName).app/Contents/Info.plist")); rules.Append(wxString(wxT("\n## rule to copy the Info.plist file into the bundle\n")) + wxT("$(IntermediateDirectory)/$(ProjectName).app/Contents/Info.plist: Info.plist\n") + wxT("\tmkdir -p '$(IntermediateDirectory)/$(ProjectName).app/Contents' && cp -f " "Info.plist '$(IntermediateDirectory)/$(ProjectName).app/Contents/Info.plist'")); } if(generateIcon) { // augment existing rules with new rules to manage Info.plist file deps.Append(wxT(" $(IntermediateDirectory)/$(ProjectName).app/Contents/Resources/") + iconName); rules.Append( wxT("\n## rule to copy the icon file into the " "bundle\n$(IntermediateDirectory)/$(ProjectName).app/Contents/Resources/") + iconName + wxT(": ") + iconName + wxT("\n\tmkdir -p '$(IntermediateDirectory)/$(ProjectName).app/Contents/Resources/' && cp -f ") + iconName + wxT(" '$(IntermediateDirectory)/$(ProjectName).app/Contents/Resources/") + iconName + wxT("'")); } // set the new rules rules = rules.Trim(); rules = rules.Trim(false); deps = deps.Trim(); deps = deps.Trim(false); wxString prebuilstep; prebuilstep << deps << wxT("\n"); prebuilstep << rules; prebuilstep << wxT("\n"); // Set the content only if there is real content to add wxString tmpPreBuildStep(prebuilstep); tmpPreBuildStep.Trim().Trim(false); buildConfig->SetPreBuildCustom(prebuilstep); } // end if settings->SetBuildConfiguration(buildConfig); } // end for project->SetSettings(settings); }
void VcImporter::AddConfiguration(ProjectSettingsPtr settings, wxXmlNode* config) { // configuration name wxString name = XmlUtils::ReadString(config, wxT("Name")); name = name.BeforeFirst(wxT('|')); name.Replace(wxT(" "), wxT("_")); BuildConfigPtr le_conf(new BuildConfig(NULL)); le_conf->SetName(name); le_conf->SetIntermediateDirectory(XmlUtils::ReadString(config, wxT("IntermediateDirectory"))); // get the compiler settings wxXmlNode* cmpNode = XmlUtils::FindNodeByName(config, wxT("Tool"), wxT("VCCLCompilerTool")); // get the include directories le_conf->SetIncludePath(SplitString(XmlUtils::ReadString(cmpNode, wxT("AdditionalIncludeDirectories")))); le_conf->SetPreprocessor(XmlUtils::ReadString(cmpNode, wxT("PreprocessorDefinitions"))); // Select the best compiler for the import process (we select g++ by default) le_conf->SetCompilerType(m_compiler); // Get the configuration type long type = XmlUtils::ReadLong(config, wxT("ConfigurationType"), 1); wxString projectType; wxString errMsg; switch(type) { case 2: // dll projectType = Project::DYNAMIC_LIBRARY; break; case 4: // static library projectType = Project::STATIC_LIBRARY; break; case 1: // exe default: projectType = Project::EXECUTABLE; break; } le_conf->SetProjectType(projectType); // if project type is DLL or Executable, copy linker settings as well if(settings->GetProjectType(le_conf->GetName()) == Project::EXECUTABLE || settings->GetProjectType(le_conf->GetName()) == Project::DYNAMIC_LIBRARY) { wxXmlNode* linkNode = XmlUtils::FindNodeByName(config, wxT("Tool"), wxT("VCLinkerTool")); if(linkNode) { wxString outputFileName(XmlUtils::ReadString(linkNode, wxT("OutputFile"))); #ifndef __WXMSW__ outputFileName.Replace(wxT(".dll"), wxT(".so")); outputFileName.Replace(wxT(".exe"), wxT("")); #endif le_conf->SetOutputFileName(outputFileName); // read in the additional libraries & libpath wxString libs = XmlUtils::ReadString(linkNode, wxT("AdditionalDependencies")); // libs is a space delimited string wxStringTokenizer tk(libs, wxT(" ")); libs.Empty(); while(tk.HasMoreTokens()) { libs << tk.NextToken() << wxT(";"); } le_conf->SetLibraries(libs); le_conf->SetLibPath(XmlUtils::ReadString(linkNode, wxT("AdditionalLibraryDirectories"))); } } else { // static library wxXmlNode* libNode = XmlUtils::FindNodeByName(config, wxT("Tool"), wxT("VCLibrarianTool")); if(libNode) { wxString outputFileName(XmlUtils::ReadString(libNode, wxT("OutputFile"))); outputFileName.Replace(wxT("\\"), wxT("/")); wxString outputFileNameOnly = outputFileName.AfterLast(wxT('/')); wxString outputFilePath = outputFileName.BeforeLast(wxT('/')); if(m_compilerLowercase.Contains(wxT("gnu"))) { if(outputFileNameOnly.StartsWith(wxT("lib")) == false) { outputFileNameOnly.Prepend(wxT("lib")); } outputFileName.Clear(); outputFileName << outputFilePath << wxT("/") << outputFileNameOnly; outputFileName.Replace(wxT(".lib"), wxT(".a")); } le_conf->SetOutputFileName(outputFileName); } } // add the configuration settings->SetBuildConfiguration(le_conf); }