Vuo 2.4.4
Loading...
Searching...
No Matches
VuoCompiler.hh
Go to the documentation of this file.
1
10#pragma once
11
13#include "VuoFileUtilities.hh"
14#include "VuoLinkerInputs.hh"
16
23class VuoCompilerType;
27class VuoNode;
28class VuoNodeSet;
30class VuoRunner;
32
50{
51public:
61
62private:
63 static set<VuoCompiler *> allCompilers;
64 static dispatch_queue_t environmentQueue;
65 static map<string, vector< vector<VuoCompilerEnvironment *> > > sharedEnvironments;
66 static map<string, map<string, vector<VuoCompilerEnvironment *> > > environmentsForCompositionFamily;
67 vector< vector<VuoCompilerEnvironment *> > environments;
68 VuoCompilerEnvironment *generatedEnvironment;
69 string lastCompositionBaseDir;
70 bool shouldLoadAllModules;
71 bool hasLoadedAllModules;
72 dispatch_queue_t modulesToLoadQueue;
73 static map<VuoCompilerEnvironment *, map<string, pair<VuoCompilerModule *, dispatch_group_t>>> invalidatedModulesAwaitingRecompilation;
74 static map<VuoCompilerEnvironment *, set<VuoCompilerModule *>> addedModulesAwaitingReification;
75 static map<VuoCompilerEnvironment *, set<pair<VuoCompilerModule *, VuoCompilerModule *>>> modifiedModulesAwaitingReification;
76 dispatch_group_t modulesLoading;
77 dispatch_group_t moduleSourceCompilersExist;
78 static dispatch_group_t moduleSourceCompilersExistGlobally;
79 dispatch_group_t moduleCacheBuilding;
80 VuoDirectedAcyclicNetwork *dependencyGraph;
81 VuoDirectedAcyclicNetwork *compositionDependencyGraph;
82 static string vuoFrameworkInProgressPath;
83 string clangPath;
84 string target;
85 string requestedTarget;
86 bool isVerbose;
87 string dependencyOutputPath;
88 bool _shouldShowSplashWindow;
89 VuoCompilerDelegate *delegate;
90 dispatch_queue_t delegateQueue;
91
92 void applyToInstalledEnvironments(std::function<void(VuoCompilerEnvironment *)> doForEnvironment);
93 void applyToAllEnvironments(std::function<void(VuoCompilerEnvironment *)> doForEnvironment);
94 VuoCompilerEnvironment * environmentAtBroaderScope(VuoCompilerEnvironment *envA, VuoCompilerEnvironment *envB);
95 VuoCompilerEnvironment * generatedEnvironmentAtSameScopeAs(VuoCompilerEnvironment *env);
96
97 static void reset(void);
98 VuoDirectedAcyclicNetwork * makeDependencyNetwork(const vector< vector<VuoCompilerEnvironment *> > &environments, VuoDirectedAcyclicGraph * (^graphForEnvironment)(VuoCompilerEnvironment *));
99 VuoCompilerModule * loadModuleIfNeeded(const string &moduleKey);
100 void loadModulesIfNeeded(const set<string> &moduleKeys = set<string>());
101 set<dispatch_group_t> loadModulesAndSources(const set<string> &modulesAddedKeys, const set<string> &modulesModifiedKeys, const set<string> &modulesRemovedKeys, const set<string> &sourcesAddedKeys, const set<string> &sourcesModifiedKeys, const set<string> &sourcesRemovedKeys, bool willLoadAllModules, bool shouldRecompileSourcesIfUnchanged, VuoCompilerEnvironment *currentEnvironment, VuoCompilerIssues *issuesForCurrentEnvironment, std::function<void(void)> moduleLoadedCallback, const string &moduleAddedOrModifiedSourceCode);
102 void findDependentModulesAndSources(map<VuoCompilerEnvironment *, set<string> > &changedModules, const vector<VuoDirectedAcyclicNetwork *> &searchDependencyGraphs, VuoDirectedAcyclicGraph *currentEnvironmentDependencyGraph, bool includeIndirectDependents, map<VuoCompilerEnvironment *, set<string> > &modulesDepOnChangedModules_this, map<VuoCompilerEnvironment *, set<string> > &modulesDepOnChangedModules_other, map<VuoCompilerEnvironment *, set<string> > &sourcesDepOnChangedModules_this, map<VuoCompilerEnvironment *, set<string> > &sourcesDepOnChangedModules_other);
103 void loadedModules(map<string, VuoCompilerModule *> modulesAdded, map<string, pair<VuoCompilerModule *, VuoCompilerModule *> > modulesModified, map<string, VuoCompilerModule *> modulesRemoved, VuoCompilerIssues *issues, void *delegateData, VuoCompilerEnvironment *currentEnvironment);
104 bool reifyPortTypes(VuoCompilerNodeClass *nodeClass, std::function<VuoCompilerType *(const string &)> lookUpType);
105 void reifyGenericPortTypes(VuoCompilerComposition *composition);
106 void reifyGenericPortTypes(VuoNode *node);
107 Module * compileCompositionToModule(VuoCompilerComposition *composition, const string &moduleKey, bool isTopLevelComposition, VuoCompilerIssues *issues);
108 void linkCompositionToCreateExecutableOrDynamicLibrary(string compiledCompositionPath, string linkedCompositionPath, Optimization optimization, bool isDylib, const vector<string> &rPaths, bool shouldAdHocCodeSign = true);
109 set<string> getDependenciesForComposition(const string &compiledCompositionPath);
110 set<string> getDependenciesForComposition(const set<string> &directDependencies, bool checkCompatibility);
111 static string getLibraryPath(const string &dependency, vector<string> librarySearchPaths);
112 void makeModuleCachesAvailable(bool shouldUseExistingBuiltInCaches, bool shouldUseExistingOtherCaches, const string &target = "");
113 vector<shared_ptr<VuoModuleCacheRevision>> useCurrentModuleCaches(Optimization optimization);
114 void link(string outputPath, const VuoLinkerInputs &linkerInputs, bool isDylib, const vector<string> &rPaths, bool shouldAdHocCodeSign = true, VuoCompilerIssues *issues = nullptr);
115 static void adHocCodeSign(string path);
116 static Module *readModuleFromBitcode(VuoFileUtilities::File *inputFile, string arch);
117 static Module *readModuleFromBitcodeData(char *inputData, size_t inputDataBytes, string arch, set<string> &availableArchs, string &error);
118 static void verifyModule(Module *module, VuoCompilerIssues *issues);
119 static void writeModuleToBitcode(Module *module, string target, string outputPath, VuoCompilerIssues *issues);
120 VuoNode * createPublishedNode(const string &nodeClassName, const vector<VuoPublishedPort *> &publishedPorts);
121 static void setTargetForModule(Module *module, string target);
122 static string getProcessTarget(void);
123 VuoCompilerModule * getModule(const string &moduleKey);
124 vector<string> getRunPathSearchPaths(VuoCompilerEnvironment *narrowestScope);
125 static vector<string> getCoreVuoDependencies(void);
126 static string getRuntimeMainDependency(void);
127 static string getRuntimeDependency(void);
128 void addModuleSearchPath(string path);
129 string getClangPath(void);
130 void setClangPath(const string &clangPath);
131 string getCompositionStubPath(void);
132
133 friend class VuoCompilerEnvironment;
134 friend class VuoLinkerInputs;
135 friend class VuoModuleCache;
136 friend class TestCompilerDelegate;
139 friend class TestEventDropping;
140 friend class TestModuleLoading;
141 friend class TestModuleCaches;
142 friend class TestNodes;
143 friend class TestSubcompositions;
144 friend class TestVuoCompiler;
145 friend class TestVuoCompilerBitcodeGenerator;
147 friend class TestVuoCompilerModule;
149
150public:
151 VuoCompiler(const string &compositionPath = "", string target = "");
152 ~VuoCompiler(void);
153 void setDelegate(VuoCompilerDelegate *delegate);
154 void setCompositionPath(const string &compositionPath);
155 static Module *readModuleFromBitcode(string inputPath, string arch);
156 static void destroyModule(VuoCompilerModule *module);
157 static void destroyLlvmModule(Module *module);
158 void compileComposition(VuoCompilerComposition *composition, string outputPath, bool isTopLevelComposition, VuoCompilerIssues *issues);
159 void compileComposition(string inputPath, string outputPath, bool isTopLevelComposition, VuoCompilerIssues *issues);
160 void compileCompositionString(const string &compositionString, string outputPath, bool isTopLevelComposition, VuoCompilerIssues *issues);
161 VuoModuleCompiler * createModuleCompiler(const string &moduleKey, const string &inputPath, const map<string, string> &typeNameReplacements = {});
162 VuoModuleCompilerResults compileModuleInMemory(const string &inputPath, const string &overriddenSourceCode = "", const map<string, string> &typeNameReplacements = {});
163 void compileModule(const string &inputPath, const string &outputPath);
164 void generateHeaderForModule(const string &inputPath, const string &outputPath);
165 void linkCompositionToCreateExecutable(string inputPath, string outputPath, Optimization optimization, string rPath="", bool shouldAdHocCodeSign = true);
166 void linkCompositionToCreateDynamicLibrary(string inputPath, string outputPath, Optimization optimization, bool shouldAdHocCodeSign = true);
167 void linkCompositionToCreateDynamicLibraries(string compiledCompositionPath, string linkedCompositionPath, VuoRunningCompositionLibraries *runningCompositionLibraries);
169 set<string> getDependenciesForComposition(VuoCompilerComposition *composition);
171 VuoCompilerCompatibility getCompatibilityOfDependencies(const set<string> &dependencies);
172 void prepareModuleCaches(void);
173 static void generateBuiltInModuleCache(string vuoFrameworkPath, string target, bool onlyGenerateModules);
174 string getTarget(void);
175 string getArch(void);
176 static string getTargetArch(string target);
177 void setLoadAllModules(bool shouldLoadAllModules);
178 VuoNode * createNode(VuoCompilerNodeClass *nodeClass, string title="", double x=0, double y=0);
179 VuoNode * createNode(VuoCompilerNodeClass *nodeClass, VuoNode *nodeToCopyMetadataFrom);
180 VuoNode * createPublishedInputNode(vector<VuoPublishedPort *> publishedInputPorts);
181 VuoNode * createPublishedOutputNode(vector<VuoPublishedPort *> publishedOutputPorts);
182 void installNodeClassAtCompositionLocalScope(const string &sourcePath);
183 void uninstallNodeClassAtCompositionLocalScope(const string &sourcePath);
184 void overrideInstalledNodeClass(const string &sourcePath, const string &sourceCode);
185 void revertOverriddenNodeClass(const string &sourcePath);
186 VuoCompilerNodeClass * getNodeClass(const string &nodeClassName);
187 map<string, VuoCompilerNodeClass *> getNodeClasses(void);
188 VuoCompilerType * getType(const string &typeName);
189 map<string, VuoCompilerType *> getTypes(void);
190 VuoCompilerModule * getLibraryModule(const string &libraryModuleName);
191 map<string, VuoCompilerModule *> getLibraryModules();
192 map<string, VuoNodeSet *> getNodeSets();
193 VuoNodeSet * getNodeSetForName(const string &name);
194 void listNodeClasses(const string &format = "");
195 static string getVuoFrameworkPath(void);
196 static string getModuleKeyForPath(string path);
197 bool isCompositionLocalModule(string moduleKey);
199 string getCompositionLocalPath(void);
200 void addHeaderSearchPath(const string &path);
201 void addLibrarySearchPath(const string &path);
202 void addFrameworkSearchPath(const string &path);
203 void setVerbose(bool isVerbose);
204 void setShouldPotentiallyShowSplashWindow(bool potentiallyShow);
205 void setDependencyOutput(const string &path);
207 string getCompositionLoaderPath(void);
208 void print(void);
209
210 static VuoRunner * newSeparateProcessRunnerFromCompositionFile(string compositionFilePath, VuoCompilerIssues *issues);
211 static VuoRunner * newSeparateProcessRunnerFromCompositionString(string composition, string processName, string workingDirectory, VuoCompilerIssues *issues);
212 static VuoRunner * newCurrentProcessRunnerFromCompositionFile(string compositionFilePath, VuoCompilerIssues *issues);
213 static VuoRunner * newCurrentProcessRunnerFromCompositionString(string composition, string workingDirectory, VuoCompilerIssues *issues);
214
215 static llvm::LLVMContext *globalLLVMContext;
216
217private:
218 void *p;
219#ifdef VUO_PRO
220#include "../compiler/pro/VuoCompiler_Pro.hh"
221#endif
222};