123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- #include "cmXCodeScheme.h"
- #include <iomanip>
- #include <iostream>
- #include <sstream>
- #include "cmGeneratedFileStream.h"
- #include "cmGeneratorTarget.h"
- #include "cmXMLSafe.h"
- cmXCodeScheme::cmXCodeScheme(cmXCodeObject* xcObj, const TestObjects& tests,
- const std::vector<std::string>& configList,
- unsigned int xcVersion)
- : Target(xcObj)
- , Tests(tests)
- , TargetName(xcObj->GetTarget()->GetName())
- , ConfigList(configList)
- , XcodeVersion(xcVersion)
- {
- }
- void cmXCodeScheme::WriteXCodeSharedScheme(const std::string& xcProjDir,
- const std::string& container)
- {
-
-
- std::string xcodeSchemeDir = xcProjDir;
- xcodeSchemeDir += "/xcshareddata/xcschemes";
- cmSystemTools::MakeDirectory(xcodeSchemeDir.c_str());
- std::string xcodeSchemeFile = xcodeSchemeDir;
- xcodeSchemeFile += "/";
- xcodeSchemeFile += this->TargetName;
- xcodeSchemeFile += ".xcscheme";
- cmGeneratedFileStream fout(xcodeSchemeFile.c_str());
- fout.SetCopyIfDifferent(true);
- if (!fout) {
- return;
- }
- WriteXCodeXCScheme(fout, container);
- }
- void cmXCodeScheme::WriteXCodeXCScheme(std::ostream& fout,
- const std::string& container)
- {
- cmXMLWriter xout(fout);
- xout.SetIndentationElement(std::string(3, ' '));
- xout.StartDocument();
- xout.StartElement("Scheme");
- xout.BreakAttributes();
- xout.Attribute("LastUpgradeVersion", WriteVersionString());
- xout.Attribute("version", "1.3");
- WriteBuildAction(xout, container);
- WriteTestAction(xout, FindConfiguration("Debug"), container);
- WriteLaunchAction(xout, FindConfiguration("Debug"), container);
- WriteProfileAction(xout, FindConfiguration("Release"));
- WriteAnalyzeAction(xout, FindConfiguration("Debug"));
- WriteArchiveAction(xout, FindConfiguration("Release"));
- xout.EndElement();
- }
- void cmXCodeScheme::WriteBuildAction(cmXMLWriter& xout,
- const std::string& container)
- {
- xout.StartElement("BuildAction");
- xout.BreakAttributes();
- xout.Attribute("parallelizeBuildables", "YES");
- xout.Attribute("buildImplicitDependencies", "YES");
- xout.StartElement("BuildActionEntries");
- xout.StartElement("BuildActionEntry");
- xout.BreakAttributes();
- xout.Attribute("buildForTesting", "YES");
- xout.Attribute("buildForRunning", "YES");
- xout.Attribute("buildForProfiling", "YES");
- xout.Attribute("buildForArchiving", "YES");
- xout.Attribute("buildForAnalyzing", "YES");
- WriteBuildableReference(xout, this->Target, container);
- xout.EndElement();
- xout.EndElement();
- xout.EndElement();
- }
- void cmXCodeScheme::WriteTestAction(cmXMLWriter& xout,
- const std::string& configuration,
- const std::string& container)
- {
- xout.StartElement("TestAction");
- xout.BreakAttributes();
- xout.Attribute("buildConfiguration", configuration);
- xout.Attribute("selectedDebuggerIdentifier",
- "Xcode.DebuggerFoundation.Debugger.LLDB");
- xout.Attribute("selectedLauncherIdentifier",
- "Xcode.DebuggerFoundation.Launcher.LLDB");
- xout.Attribute("shouldUseLaunchSchemeArgsEnv", "YES");
- xout.StartElement("Testables");
- for (auto test : this->Tests) {
- xout.StartElement("TestableReference");
- xout.BreakAttributes();
- xout.Attribute("skipped", "NO");
- WriteBuildableReference(xout, test, container);
- xout.EndElement();
- }
- xout.EndElement();
- if (IsTestable()) {
- xout.StartElement("MacroExpansion");
- WriteBuildableReference(xout, this->Target, container);
- xout.EndElement();
- }
- xout.StartElement("AdditionalOptions");
- xout.EndElement();
- xout.EndElement();
- }
- void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout,
- const std::string& configuration,
- const std::string& container)
- {
- xout.StartElement("LaunchAction");
- xout.BreakAttributes();
- xout.Attribute("buildConfiguration", configuration);
- xout.Attribute("selectedDebuggerIdentifier",
- "Xcode.DebuggerFoundation.Debugger.LLDB");
- xout.Attribute("selectedLauncherIdentifier",
- "Xcode.DebuggerFoundation.Launcher.LLDB");
- xout.Attribute("launchStyle", "0");
- xout.Attribute("useCustomWorkingDirectory", "NO");
- xout.Attribute("ignoresPersistentStateOnLaunch", "NO");
- xout.Attribute("debugDocumentVersioning", "YES");
- xout.Attribute("debugServiceExtension", "internal");
- xout.Attribute("allowLocationSimulation", "YES");
- if (IsExecutable(this->Target)) {
- xout.StartElement("BuildableProductRunnable");
- xout.BreakAttributes();
- xout.Attribute("runnableDebuggingMode", "0");
- } else {
- xout.StartElement("MacroExpansion");
- }
- WriteBuildableReference(xout, this->Target, container);
- xout.EndElement();
- xout.StartElement("AdditionalOptions");
- xout.EndElement();
- xout.EndElement();
- }
- void cmXCodeScheme::WriteProfileAction(cmXMLWriter& xout,
- const std::string& configuration)
- {
- xout.StartElement("ProfileAction");
- xout.BreakAttributes();
- xout.Attribute("buildConfiguration", configuration);
- xout.Attribute("shouldUseLaunchSchemeArgsEnv", "YES");
- xout.Attribute("savedToolIdentifier", "");
- xout.Attribute("useCustomWorkingDirectory", "NO");
- xout.Attribute("debugDocumentVersioning", "YES");
- xout.EndElement();
- }
- void cmXCodeScheme::WriteAnalyzeAction(cmXMLWriter& xout,
- const std::string& configuration)
- {
- xout.StartElement("AnalyzeAction");
- xout.BreakAttributes();
- xout.Attribute("buildConfiguration", configuration);
- xout.EndElement();
- }
- void cmXCodeScheme::WriteArchiveAction(cmXMLWriter& xout,
- const std::string& configuration)
- {
- xout.StartElement("ArchiveAction");
- xout.BreakAttributes();
- xout.Attribute("buildConfiguration", configuration);
- xout.Attribute("revealArchiveInOrganizer", "YES");
- xout.EndElement();
- }
- void cmXCodeScheme::WriteBuildableReference(cmXMLWriter& xout,
- const cmXCodeObject* xcObj,
- const std::string& container)
- {
- xout.StartElement("BuildableReference");
- xout.BreakAttributes();
- xout.Attribute("BuildableIdentifier", "primary");
- xout.Attribute("BlueprintIdentifier", xcObj->GetId());
- xout.Attribute("BuildableName", xcObj->GetTarget()->GetFullName());
- xout.Attribute("BlueprintName", xcObj->GetTarget()->GetName());
- xout.Attribute("ReferencedContainer", "container:" + container);
- xout.EndElement();
- }
- std::string cmXCodeScheme::WriteVersionString()
- {
- std::ostringstream v;
- v << std::setfill('0') << std::setw(4) << this->XcodeVersion * 10;
- return v.str();
- }
- std::string cmXCodeScheme::FindConfiguration(const std::string& name)
- {
-
-
-
- if (std::find(this->ConfigList.begin(), this->ConfigList.end(), name) ==
- this->ConfigList.end() &&
- !this->ConfigList.empty()) {
- return this->ConfigList[0];
- }
- return name;
- }
- bool cmXCodeScheme::IsTestable() const
- {
- return !this->Tests.empty() || IsExecutable(this->Target);
- }
- bool cmXCodeScheme::IsExecutable(const cmXCodeObject* target)
- {
- cmGeneratorTarget* gt = target->GetTarget();
- if (!gt) {
- cmSystemTools::Error("Error no target on xobject\n");
- return false;
- }
- return gt->GetType() == cmStateEnums::EXECUTABLE;
- }
|