Vuo  2.3.2
VuoCompilerGroup.cc
Go to the documentation of this file.
1 
10 #include "VuoCompilerGroup.hh"
11 
12 #include "VuoCompiler.hh"
14 #include "VuoCompilerException.hh"
15 #include "VuoCompilerIssue.hh"
16 #include "VuoException.hh"
17 #include "VuoFileUtilitiesCocoa.hh"
18 
23 {
25 }
26 
35 VuoCompilerGroup * VuoCompilerGroup::compilersForAllCompatibleDeploymentArchitectures(const string &compositionString, const string &compositionPath)
36 {
37  VuoCompiler nominalCompiler(compositionPath);
38  nominalCompiler.setLoadAllModules(false);
39 
40  return VuoCompilerGroup::compilersForAllCompatibleDeploymentArchitectures(compositionString, &nominalCompiler);
41 }
42 
52 {
53  VuoCompilerComposition *nominalComposition = VuoCompilerComposition::newCompositionFromGraphvizDeclaration(compositionString, nominalCompiler);
54  set<string> dependencies = nominalCompiler->getDependenciesForComposition(nominalComposition);
55  VuoCompilerCompatibility compatibility = nominalCompiler->getCompatibilityOfDependencies(dependencies);
56 
57  string compositionPath = nominalCompiler->getCompositionLocalPath() + "/unused";
58  return VuoCompilerGroup::compilersForAllCompatibleDeploymentArchitectures(compatibility, compositionPath);
59 }
60 
70 {
71  vector<vector<string>> defaultTargets = {
72 #ifdef VUO_TARGET_ARCHITECTURE_X86_64
73  {"macos", "x86_64", "10.10", "apple-macosx"},
74 #endif
75 #ifdef VUO_TARGET_ARCHITECTURE_ARM64
76  {"macos", "arm64", "10.10", "apple-macosx"},
77 #endif
78  };
79 
80  if (defaultTargets.empty())
81  {
82  VuoCompilerIssue issue(VuoCompilerIssue::IssueType::Error, "setting up compiler", "",
83  "Vuo build misconfigured",
84  "This build of Vuo doesn't support any architectures.");
85  throw VuoCompilerException(issue);
86  }
87 
88  vector<VuoCompiler *> compilers;
89  for (vector<string> defaultTarget : defaultTargets)
90  {
91  json_object *platformArchJson = json_object_new_object();
92 
93  json_object *platformVal = json_object_new_object();
94  json_object_object_add(platformArchJson, defaultTarget[0].c_str(), platformVal);
95 
96  json_object *archVal = json_object_new_string(defaultTarget[1].c_str());
97  json_object *archArray = json_object_new_array_ext(1);
98  json_object_array_put_idx(archArray, 0, archVal);
99  json_object_object_add(platformVal, "arch", archArray);
100 
101  VuoCompilerCompatibility platformArchCompatibility(platformArchJson);
102 
103  VuoCompilerCompatibility bothCompatibility = platformArchCompatibility.intersection(compatibility);
104 
105  if (bothCompatibility.isCompatibleWithPlatform(defaultTarget[0]))
106  {
107  string minVersion = bothCompatibility.getMinVersionOnPlatform(defaultTarget[0]);
108  if (minVersion.empty())
109  minVersion = defaultTarget[2];
110 
111  string target = defaultTarget[1] + "-" + defaultTarget[3] + minVersion + ".0";
112 
113  VuoCompiler *compiler = new VuoCompiler(compositionPath, target);
114  compilers.push_back(compiler);
115  }
116  }
117 
118  return new VuoCompilerGroup(compilers, compatibility);
119 }
120 
125 {
127 
128  vector<VuoCompiler *> matchingCompilers;
129  std::copy_if(compilers.begin(), compilers.end(),
130  std::back_inserter(matchingCompilers),
131  [&arch](VuoCompiler *compiler){ return compiler->getArch() == arch; });
132 
133  if (matchingCompilers.empty())
134  {
135  VuoCompilerIssue issue(VuoCompilerIssue::IssueType::Error, "setting up compiler", "",
136  "Unsupported architecture",
137  "This build of Vuo doesn't support the current system's architecture (" + arch + ")");
138  throw VuoCompilerException(issue);
139  }
140 
141  return matchingCompilers.front();
142 }
143 
147 void VuoCompilerGroup::doForEach(std::function<void(VuoCompiler *)> callback)
148 {
149  for (auto compiler : compilers)
150  callback(compiler);
151 }
152 
157 {
158  return compatibleTargets;
159 }
160 
164 VuoCompilerGroup::VuoCompilerGroup(const vector<VuoCompiler *> &compilers, const VuoCompilerCompatibility &compatibleTargets) :
165  compilers(compilers), compatibleTargets(compatibleTargets)
166 {
167 }
168 
173 {
174  for (auto compiler : compilers)
175  delete compiler;
176 }