Vuo 2.4.4
Loading...
Searching...
No Matches
VuoLinkerInputs.cc
Go to the documentation of this file.
1
10#include "VuoLinkerInputs.hh"
11
12#include "VuoCompiler.hh"
14#include "VuoCompilerModule.hh"
18#include "VuoStringUtilities.hh"
19
26
36void VuoLinkerInputs::addDependencies(const set<string> &dependencies, const vector<shared_ptr<VuoModuleCacheRevision>> &moduleCacheRevisions,
37 VuoCompiler *compiler)
38{
39 vector<string> librarySearchPaths;
40 compiler->applyToInstalledEnvironments([&librarySearchPaths](VuoCompilerEnvironment *env)
41 {
42 vector<string> envLibrarySearchPaths = env->getLibrarySearchPaths();
43 librarySearchPaths.insert(librarySearchPaths.end(), envLibrarySearchPaths.begin(), envLibrarySearchPaths.end());
44 });
45
46 for (const string &dependency : dependencies)
47 {
48 shared_ptr<VuoModuleCacheRevision> foundInRevision = nullptr;
49 for (shared_ptr<VuoModuleCacheRevision> revision : moduleCacheRevisions)
50 if (revision->contains(dependency))
51 foundInRevision = revision;
52
53 if (foundInRevision)
54 {
55 if (foundInRevision->isBuiltIn())
56 builtInCachedDependencies[foundInRevision].insert(dependency);
57 else
58 nonBuiltInCachedDependencies[foundInRevision].insert(dependency);
59 }
60 else
61 {
62 VuoCompilerModule *module = nullptr;
63 bool isGenerated = false;
64 compiler->applyToAllEnvironments([&dependency, &module, &isGenerated](VuoCompilerEnvironment *env)
65 {
66 VuoCompilerModule *foundModule = env->findModule(dependency);
67 if (foundModule)
68 {
69 module = foundModule;
70 isGenerated = env->isGenerated();
71 }
72 });
73
74 if (module)
75 {
76 VuoCompilerNodeClass *nodeClass = dynamic_cast<VuoCompilerNodeClass *>(module);
77 if (! (nodeClass && VuoCompilerSpecializedNodeClass::hasGenericPortTypes(nodeClass)) ) // Skip not-fully-specialized generic modules
78 {
79 string modulePath = module->getModulePath();
80 if (! modulePath.empty() && ! nodeClass && ! isGenerated)
81 {
82 // If the module is an installed type or library not inside of a node set, we can link in its bitcode file.
83
84 if (module->isBuiltIn() && ! isGenerated)
85 builtInLibraries.insert(modulePath);
86 else
87 nonBuiltInLibraries.insert(modulePath);
88 }
89 else
90 {
91 // Otherwise, we have to link in the in-memory LLVM module, which is slower.
92 // https://b33p.net/kosada/vuo/vuo/-/issues/12927
93
94 if (module->isBuiltIn())
95 builtInModules.insert(module->getModule());
96 else
97 nonBuiltInModules.insert(module->getModule());
98 }
99
100 if (module->isBuiltIn())
101 builtInNonCachedModuleKeys.insert(dependency);
102 else
103 nonBuiltInNonCachedModuleKeys.insert(dependency);
104 }
105 }
106 else
107 {
108 if (VuoStringUtilities::endsWith(dependency, ".framework"))
109 frameworks.insert(dependency);
110 else
111 {
112 string dependencyPath = compiler->getLibraryPath(dependency, librarySearchPaths);
113 if (! dependencyPath.empty())
114 externalLibraries.insert(dependencyPath);
115
116 // On macOS 11, libc.dylib and libobjc.dylib are not present,
117 // but we can still link since Vuo.framework includes the TBDs.
118 else if (dependency != "c"
119 && dependency != "objc")
120 VUserLog("Warning: Could not locate dependency '%s'.", dependency.c_str());
121 }
122 }
123 }
124 }
125}
126
131{
132 addDependencies({compiler->getRuntimeDependency()}, {}, compiler);
133}
134
139{
140 addDependencies({compiler->getRuntimeMainDependency()}, {}, compiler);
141}
142
147set<Module *> VuoLinkerInputs::getModules(void) const
148{
149 set<Module *> modules;
150 modules.insert(builtInModules.begin(), builtInModules.end());
151 modules.insert(nonBuiltInModules.begin(), nonBuiltInModules.end());
152 return modules;
153}
154
159{
160 return builtInModules;
161}
162
167{
168 return nonBuiltInModules;
169}
170
174void VuoLinkerInputs::addModulesInBuiltInEnvironments(const set<Module *> &modules)
175{
176 builtInModules.insert(modules.begin(), modules.end());
177}
178
183{
184 nonBuiltInModules.insert(modules.begin(), modules.end());
185}
186
190set<string> VuoLinkerInputs::getLibraries(void) const
191{
192 set<string> libraries;
193
194 libraries.insert(builtInLibraries.begin(), builtInLibraries.end());
195 libraries.insert(nonBuiltInLibraries.begin(), nonBuiltInLibraries.end());
196 libraries.insert(externalLibraries.begin(), externalLibraries.end());
197
198 for (auto i : builtInCachedDependencies)
199 libraries.insert(i.first->getDylibPath());
200 for (auto i : nonBuiltInCachedDependencies)
201 libraries.insert(i.first->getDylibPath());
202
203 return libraries;
204}
205
210{
211 set<string> libraries;
212
213 libraries.insert(builtInLibraries.begin(), builtInLibraries.end());
214 for (auto i : builtInCachedDependencies)
215 libraries.insert(i.first->getDylibPath());
216
217 return libraries;
218}
219
224{
225 set<string> libraries;
226
227 libraries.insert(nonBuiltInLibraries.begin(), nonBuiltInLibraries.end());
228 for (auto i : nonBuiltInCachedDependencies)
229 libraries.insert(i.first->getDylibPath());
230
231 return libraries;
232}
233
238{
239 return externalLibraries;
240}
241
246{
247 builtInLibraries.insert(libraries.begin(), libraries.end());
248}
249
254{
255 nonBuiltInLibraries.insert(libraries.begin(), libraries.end());
256}
257
261void VuoLinkerInputs::addExternalLibraries(const set<string> &libraries)
262{
263 externalLibraries.insert(libraries.begin(), libraries.end());
264}
265
269void VuoLinkerInputs::addExternalLibraries(const vector<string> &libraries)
270{
271 externalLibraries.insert(libraries.begin(), libraries.end());
272}
273
277void VuoLinkerInputs::addExternalLibrary(const string &library)
278{
279 externalLibraries.insert(library);
280}
281
287{
288 set<string> dylibs = filterToDynamicLibraries(builtInLibraries);
289
290 for (auto i : builtInCachedDependencies)
291 dylibs.insert(i.first->getDylibPath());
292
293 return dylibs;
294}
295
301{
302 set<string> dylibs = filterToDynamicLibraries(nonBuiltInLibraries);
303
304 for (auto i : nonBuiltInCachedDependencies)
305 dylibs.insert(i.first->getDylibPath());
306
307 return dylibs;
308}
309
315{
316 return filterToDynamicLibraries(externalLibraries);
317}
318
322set<string> VuoLinkerInputs::getFrameworks(void) const
323{
324 return frameworks;
325}
326
330void VuoLinkerInputs::addFrameworks(const set<string> &frameworks)
331{
332 this->frameworks.insert(frameworks.begin(), frameworks.end());
333}
334
340{
341 return builtInNonCachedModuleKeys;
342}
343
349{
350 return nonBuiltInNonCachedModuleKeys;
351}
352
357map<shared_ptr<VuoModuleCacheRevision>, set<string>> VuoLinkerInputs::getCachedDependenciesInBuiltInEnvironments(void) const
358{
359 return builtInCachedDependencies;
360}
361
366map<shared_ptr<VuoModuleCacheRevision>, set<string>> VuoLinkerInputs::getCachedDependenciesInNonBuiltInEnvironments(void) const
367{
368 return nonBuiltInCachedDependencies;
369}
370
375{
376 for (auto i : getLibraries()) VUserLog("getLibraries: %s", i.c_str());
377 for (auto i : getLibrariesInBuiltInEnvironments()) VUserLog("getLibrariesInBuiltInEnvironments: %s", i.c_str());
378 for (auto i : getLibrariesInNonBuiltInEnvironments()) VUserLog("getLibrariesInNonBuiltInEnvironments: %s", i.c_str());
379 for (auto i : getExternalLibraries()) VUserLog("getExternalLibraries: %s", i.c_str());
380 for (auto i : getDylibsInBuiltInEnvironments()) VUserLog("getDylibsInBuiltInEnvironments: %s", i.c_str());
381 for (auto i : getDylibsInNonBuiltInEnvironments()) VUserLog("getDylibsInNonBuiltInEnvironments: %s", i.c_str());
382 for (auto i : getExternalDylibs()) VUserLog("getExternalDylibs: %s", i.c_str());
383 for (auto i : getFrameworks()) VUserLog("getFrameworks: %s", i.c_str());
384 for (auto i : getNonCachedModuleKeysInBuiltInEnvironments()) VUserLog("getNonCachedModuleKeysInBuiltInEnvironments: %s", i.c_str());
385 for (auto i : getNonCachedModuleKeysInNonBuiltInEnvironments()) VUserLog("getNonCachedModuleKeysInNonBuiltInEnvironments: %s", i.c_str());
386 for (auto i : getCachedDependenciesInBuiltInEnvironments()) for (auto j : i.second) VUserLog("getCachedDependenciesInBuiltInEnvironments: %s -- %s", i.first->getDylibPath().c_str(), j.c_str());
387 for (auto i : getCachedDependenciesInNonBuiltInEnvironments()) for (auto j : i.second) VUserLog("getCachedDependenciesInNonBuiltInEnvironments: %s -- %s", i.first->getDylibPath().c_str(), j.c_str());
388}
389
393set<string> VuoLinkerInputs::filterToDynamicLibraries(const set<string> &libraries)
394{
395 auto isDylib = [](const string &library) { return VuoStringUtilities::endsWith(library, ".dylib"); };
396
397 set<string> dynamicLibraries;
398 std::copy_if(libraries.begin(), libraries.end(),
399 std::inserter(dynamicLibraries, dynamicLibraries.begin()),
400 isDylib);
401
402 return dynamicLibraries;
403}