Vuo  2.3.2
VuoCompiler.hh
Go to the documentation of this file.
1 
10 #pragma once
11 
13 #include "VuoFileUtilities.hh"
14 #include "VuoFileWatcher.hh"
16 
20 class VuoCompilerIssues;
21 class VuoCompilerModule;
23 class VuoCompilerType;
25 class VuoNode;
26 class VuoNodeSet;
27 class VuoPublishedPort;
28 class VuoRunner;
30 
31 
69 {
70 public:
75  {
79  };
80 
81 private:
82  class Environment;
83 
87  class ModuleInfo
88  {
89  public:
90  ModuleInfo(Environment *environment, const string &searchPath, const string &relativePath, bool isSourceFile, bool isSubcomposition);
91  ModuleInfo(Environment *environment, const string &searchPath, VuoFileUtilities::File *file, bool isSourceFile, bool isSubcomposition);
92  ~ModuleInfo(void);
93  Environment * getEnvironment(void) const;
94  string getSearchPath(void) const;
95  string getModuleKey(void) const;
96  VuoFileUtilities::File * getFile(void) const;
97  string getSourceCode(void) const;
98  void setSourceCode(const string &sourceCode);
99  void revertSourceCode(void);
100  bool isSourceCodeOverridden(void) const;
101  void setSourceCodeOverridden(bool overridden);
102  bool isNewerThan(ModuleInfo *other) const;
103  bool isNewerThan(unsigned long seconds) const;
104  bool isOlderThan(unsigned long seconds) const;
105  void setLastModifiedToNow(void);
106  set<string> getContainedNodeClasses(void) const;
107  int getLongestDownstreamPath(void) const;
108  void setLongestDownstreamPath(int pathLength);
109  bool getAttempted(void) const;
110  void setAttempted(bool attempted);
111  dispatch_group_t getLoadingGroup(void) const;
112  void dump() const;
113 
114  private:
115  void initialize(Environment *environment, const string &searchPath, VuoFileUtilities::File *file, bool isSourceFile, bool isSubcomposition);
116 
117  Environment *environment;
118  string searchPath;
119  string moduleKey;
120  VuoFileUtilities::File *file;
121  string sourceCode;
122  bool sourceCodeOverridden;
123  unsigned long lastModified;
124  set<string> containedNodeClasses;
125  int longestDownstreamPath;
126  bool attempted;
127  dispatch_group_t loading;
128 
129 #pragma clang diagnostic push
130 #pragma clang diagnostic ignored "-Wunused-private-field"
131  void *p;
132 #pragma clang diagnostic pop
133 #ifdef VUO_PRO
134 #include "pro/VuoCompilerModuleInfo_Pro.hh"
135 #endif
136  };
137 
138  class DependencyGraphVertex : public VuoDirectedAcyclicGraph::Vertex
139  {
140  public:
141  static DependencyGraphVertex * vertexForDependency(const string &dependency, VuoDirectedAcyclicGraph *graph);
142  string getDependency(void);
143  Environment * getEnvironment(void);
144  void setEnvironment(Environment *environment);
145  string key(void);
146 
147  private:
148  string dependency;
149  Environment *environment;
150  bool compatible;
151  };
152 
156  class ModuleInfoIterator
157  {
158  public:
159  ModuleInfoIterator(map<string, map<string, ModuleInfo *> > *allModuleInfos, const string &overriddenCompiledModuleCachePath);
160  ModuleInfoIterator(map<string, map<string, ModuleInfo *> > *allModuleInfos, const string &overriddenCompiledModuleCachePath, const set<string> &searchModuleKeys);
161  ModuleInfo * next(void);
162 
163  private:
164  void initialize(void);
165 
166  map<string, map<string, ModuleInfo *> > *allModuleInfos;
167  set<string> searchModuleKeys;
168  bool hasSearchModuleKeys;
169  map<string, map<string, ModuleInfo *> >::iterator currSearchPath;
170  map<string, ModuleInfo *>::iterator currModuleKey;
171  bool hasCurrModuleKey;
172  string overriddenCompiledModuleCachePath;
173  set<string> overriddenModuleKeys;
174  };
175 
204  class Environment : public VuoFileWatcherDelegate
205  {
206  private:
207  string target;
208  bool builtIn;
209  bool generated;
210  set<VuoCompiler *> compilersToNotify;
211  dispatch_queue_t compilersToNotifyQueue;
212  set<VuoFileWatcher *> moduleSearchPathWatchers;
213  map<string, VuoCompilerNodeClass *> nodeClasses;
214  map<string, VuoCompilerType *> types;
215  set<VuoCompilerGenericType *> genericTypes;
216  map<string, VuoNodeSet *> nodeSetForName;
217  map<string, VuoCompilerModule *> libraryModules;
218  map<string, dispatch_group_t> specializedModulesLoading;
219  map<string, map<string, ModuleInfo *> > moduleFilesAtSearchPath;
220  map<string, map<string, ModuleInfo *> > sourceFilesAtSearchPath;
221  vector<string> moduleSearchPaths;
222  vector<string> headerSearchPaths;
223  vector<string> librarySearchPaths;
224  vector<string> frameworkSearchPaths;
225  vector<string> expatriateSourceFiles;
226  string moduleCachePath;
227  string currentModuleCacheDylib;
228  unsigned long lastModuleCacheRebuild;
229  bool isModuleCacheableDataDirty;
230  bool isModuleCacheInitialized;
231  bool isModuleCacheAvailable;
232  set<string> moduleCacheContents;
233  set<string> moduleCacheDylibs;
234  set<string> moduleCacheFrameworks;
235  static map<string, VuoFileUtilities::File *> moduleCacheFileForLocking;
236  static dispatch_queue_t moduleCacheBuildingQueue;
237  VuoDirectedAcyclicGraph *dependencyGraph;
238  VuoDirectedAcyclicGraph *compositionDependencyGraph;
239  VuoModuleCompilationQueue *moduleCompilationQueue;
240 
241  void updateModulesAtSearchPath(const string &path);
242  void updateModuleAtSearchPath(const string &moduleSearchPath, const string &moduleRelativePath);
243  void updateSourceFilesAtSearchPath(const string &path);
244  void startWatchingModuleSearchPath(const string &moduleSearchPath);
245  VuoCompilerModule * loadModule(ModuleInfo *moduleInfo);
246 
247  friend class TestCompilingAndLinking;
248 
249  public:
250  dispatch_queue_t moduleSearchPathContentsChangedQueue;
251  static const string pidCacheDirPrefix;
252 
253  explicit Environment(string target, bool builtIn, bool generated);
254  virtual ~Environment(void);
255  string getTarget();
256  void addCompilerToNotify(VuoCompiler *compiler);
257  void removeCompilerToNotify(VuoCompiler *compiler);
258  map<string, VuoCompilerNodeClass *> getNodeClasses(void);
259  VuoCompilerNodeClass * getNodeClass(const string &moduleKey);
260  VuoCompilerNodeClass * takeNodeClass(const string &moduleKey);
261  map<string, VuoCompilerType *> getTypes(void);
262  VuoCompilerType * getType(const string &moduleKey);
263  map<string, VuoNodeSet *> getNodeSets();
264  VuoCompilerModule *getLibraryModule(const string &libraryModuleName);
265  map<string, VuoCompilerModule *> getLibraryModules(void);
266  VuoCompilerModule * findModule(const string &moduleKey);
267  VuoNodeSet * findNodeSet(const string &name);
268  void addModuleSearchPath(const string &path, bool shouldWatch = true);
269  vector<string> getModuleSearchPaths(void);
270  void addHeaderSearchPath(const string &path);
271  vector<string> getHeaderSearchPaths(void);
272  void addLibrarySearchPath(const string &path);
273  vector<string> getLibrarySearchPaths(void);
274  void addFrameworkSearchPath(const string &path);
275  void setModuleCachePath(const string &path, bool shouldAddModuleSearchPath);
276  string getCompiledModuleCachePath(void);
277  string getOverriddenCompiledModuleCachePath(void);
278  vector<string> getFrameworkSearchPaths(void);
279  VuoDirectedAcyclicGraph * getDependencyGraph(void);
280  VuoDirectedAcyclicGraph * getCompositionDependencyGraph(void);
281  void addExpatriateSourceFile(const string &sourcePath);
282  void removeExpatriateSourceFile(const string &sourcePath);
283  ModuleInfo * listModule(const string &moduleKey);
284  ModuleInfoIterator listModules(const set<string> &moduleKeys);
285  ModuleInfoIterator listAllModules(void);
286  ModuleInfo * listSourceFile(const string &moduleKey);
287  ModuleInfoIterator listSourceFiles(const set<string> &moduleKeys);
288  ModuleInfoIterator listAllSourceFiles(void);
289  static vector<string> getBuiltInModuleSearchPaths(void);
290  static vector<string> getBuiltInHeaderSearchPaths(void);
291  static vector<string> getBuiltInLibrarySearchPaths(void);
292  static vector<string> getBuiltInFrameworkSearchPaths(void);
293  void addSearchPathsToSharedEnvironment(void);
294  void stopWatchingModuleSearchPaths(void);
295  void fileChanged(const string &moduleSearchPath);
296  void moduleSearchPathContentsChanged(const string &moduleSearchPath);
297  void moduleFileChanged(const string &modulePath, const string &moduleSourceCode, std::function<void(void)> moduleLoadedCallback, VuoCompiler *compiler, VuoCompilerIssues *issues = nullptr);
298  void notifyCompilers(const set<VuoCompilerModule *> &modulesAdded, const set<pair<VuoCompilerModule *, VuoCompilerModule *> > &modulesModified, const set<VuoCompilerModule *> &modulesRemoved, VuoCompilerIssues *issues, bool oldModulesInvalidated = true);
299  set<VuoCompilerModule *> loadCompiledModules(const set<string> &moduleKeys, const map<string, string> &sourceCodeForModule);
300  set<dispatch_group_t> loadSpecializedModules(const set<string> &moduleKeys, VuoCompiler *compiler, dispatch_queue_t llvmQueue);
301  set<dispatch_group_t> compileModulesFromSourceCode(const set<string> &moduleKeys, bool shouldRecompileIfUnchanged);
302  set<VuoCompilerModule *> unloadCompiledModules(const set<string> &moduleKeys);
303  void deleteModulesCompiledFromSourceCode(const set<string> &moduleKeys);
304  void replaceNodeClass(VuoCompilerNodeClass *newNodeClass);
305  void addToDependencyGraph(VuoCompilerModule *module);
306  void removeFromDependencyGraph(VuoCompilerModule *module);
307  void reifyPortTypes(const map<string, VuoCompilerType *> &inheritedTypes);
308  void getCacheableModulesAndDependencies(set<string> &cacheableModulesAndDependencies, set<string> &dylibsNeededToLinkToThisCache, set<string> &frameworksNeededToLinkToThisCache);
309  void useModuleCache(bool shouldUseExistingCache, VuoCompiler *compiler, set<string> cacheableModulesAndDependencies, set<string> dylibsNeededToLinkToCaches, set<string> frameworksNeededToLinkToCaches, unsigned long lastPrerequisiteModuleCacheRebuild);
310  static void waitForModuleCachesToBuild(void);
311  bool findInModuleCache(const string &moduleOrDependency, string &cachePath);
312  string getCurrentModuleCacheDylib(void);
313  unsigned long getLastModuleCacheRebuild(void);
314  void modulesChanged(void);
315 
316  bool isBuiltInOriginal(void);
317  bool isBuiltIn(void);
318  bool isGenerated(void);
319  string getName();
320 
321 #ifdef VUO_PRO
322 #include "pro/VuoCompilerEnvironment_Pro.hh"
323 #endif
324  };
325 
326  static set<VuoCompiler *> allCompilers;
327  static dispatch_queue_t environmentQueue;
328  static map<string, vector< vector<Environment *> > > sharedEnvironments;
329  static map<string, map<string, vector<Environment *> > > environmentsForCompositionFamily;
330  vector< vector<Environment *> > environments;
331  string lastCompositionBaseDir;
332  bool lastCompositionIsSubcomposition;
333  bool shouldLoadAllModules;
334  bool hasLoadedAllModules;
335  dispatch_queue_t modulesToLoadQueue;
336  dispatch_group_t moduleSourceCompilersExist;
337  static dispatch_group_t moduleSourceCompilersExistGlobally;
338  dispatch_group_t moduleCacheBuilding;
339  VuoDirectedAcyclicNetwork *dependencyGraph;
340  VuoDirectedAcyclicNetwork *compositionDependencyGraph;
341  static string vuoFrameworkInProgressPath;
342  string clangPath;
343  string telemetry;
344  string target;
345  bool isVerbose;
346  bool _shouldShowSplashWindow;
347  VuoCompilerDelegate *delegate;
348  dispatch_queue_t delegateQueue;
349 
350  void applyToInstalledEnvironments(void (^doForEnvironment)(Environment *));
351  void applyToInstalledEnvironments(void (^doForEnvironment)(Environment *, bool *, string), bool *, string);
352  void applyToAllEnvironments(void (^doForEnvironment)(Environment *));
353 
354  static void reset(void);
355  VuoDirectedAcyclicNetwork * makeDependencyNetwork(const vector< vector<Environment *> > &environments, VuoDirectedAcyclicGraph * (^graphForEnvironment)(Environment *));
356  void loadModulesIfNeeded(const set<string> &moduleKeys = set<string>());
357  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, Environment *currentEnvironment, VuoCompilerIssues *issuesForCurrentEnvironment, std::function<void(void)> moduleLoadedCallback, const string &moduleAddedOrModifiedSourceCode);
358  void findDependentModulesAndSources(map<Environment *, set<string> > &changedModules, const vector<VuoDirectedAcyclicNetwork *> &searchDependencyGraphs, VuoDirectedAcyclicGraph *currentEnvironmentDependencyGraph, map<Environment *, set<string> > &modulesDepOnChangedModules_this, map<Environment *, set<string> > &modulesDepOnChangedModules_other, map<Environment *, set<string> > &sourcesDepOnChangedModules_this, map<Environment *, set<string> > &sourcesDepOnChangedModules_other);
359  void loadedModules(map<string, VuoCompilerModule *> modulesAdded, map<string, pair<VuoCompilerModule *, VuoCompilerModule *> > modulesModified, map<string, VuoCompilerModule *> modulesRemoved, VuoCompilerIssues *issues, void *delegateData, Environment *currentEnvironment);
360  void loadNodeClassGeneratedAtRuntime(VuoCompilerNodeClass *nodeClass, Environment *env);
361  void reifyGenericPortTypes(VuoCompilerComposition *composition);
362  void reifyGenericPortTypes(VuoNode *node);
363  Module * compileCompositionToModule(VuoCompilerComposition *composition, const string &moduleKey, bool isTopLevelComposition, VuoCompilerIssues *issues);
364  void linkCompositionToCreateExecutableOrDynamicLibrary(string compiledCompositionPath, string linkedCompositionPath, Optimization optimization, bool isDylib, string rPath="", bool shouldAdHocCodeSign = true);
365  set<string> getDependenciesForComposition(const string &compiledCompositionPath);
366  set<string> getDependenciesForComposition(const set<string> &directDependencies, bool checkCompatibility);
367  void getLinkerInputs(const set<string> &dependencies, Optimization optimization, set<Module *> &modules, set<string> &libraries, set<string> &frameworks);
368  void getLinkerInputs(const set<string> &dependencies, Optimization optimization, set<string> &builtInModuleAndLibraryDependencies, set<string> &userModuleAndLibraryDependencies, map<string, set<string> > &builtInCacheDependencies, map<string, set<string> > &userCacheDependencies, set<Module *> &builtInModules, set<Module *> &userModules, set<string> &builtInLibraries, set<string> &userLibraries, set<string> &externalLibraries, set<string> &externalFrameworks);
369  static string getLibraryPath(const string &dependency, vector<string> librarySearchPaths);
370  void useModuleCache(bool shouldUseExistingBuiltInCaches, bool shouldUseExistingOtherCaches);
371  bool findInModuleCache(const string &moduleOrDependency, string &cachePath, bool &isBuiltinCache) VuoWarnUnusedResult;
372  void link(string outputPath, const set<Module *> &modules, const set<string> &libraries, const set<string> &frameworks, bool isDylib, string rPath="", bool shouldAdHocCodeSign = true, VuoCompilerIssues *issues = nullptr);
373  static void adHocCodeSign(string path);
374  Module *readModuleFromC(string inputPath, const vector<string> &headerSearchPaths, const vector<string> &extraArgs, VuoCompilerIssues *issues);
375  static Module *readModuleFromBitcode(VuoFileUtilities::File *inputFile, string arch);
376  static Module *readModuleFromBitcodeData(char *inputData, size_t inputDataBytes, string arch, set<string> &availableArchs, string &error);
377  static bool writeModuleToBitcode(Module *module, string outputPath);
378  VuoNode * createPublishedNode(const string &nodeClassName, const vector<VuoPublishedPort *> &publishedPorts);
379  static void setTargetForModule(Module *module, string target);
380  static string getTargetArch(string target);
381  static string getProcessTarget(void);
382  VuoCompilerModule * getModule(const string &moduleKey);
383  static vector<string> getCoreVuoDependencies(void);
384  static string getRuntimeMainDependency(void);
385  static string getRuntimeDependency(void);
386  void addModuleSearchPath(string path);
387  string getClangPath(void);
388  void setClangPath(const string &clangPath);
389  string getCompositionStubPath(void);
390  static string getCachePathForComposition(const string compositionDir);
391 
392  friend class TestVuoCompiler;
394  friend class TestCompilerDelegate;
395  friend class TestVuoCompilerModule;
396  friend class TestVuoCompilerBitcodeGenerator;
397  friend class TestCompilingAndLinking;
398  friend class TestSubcompositions;
399  friend class TestModuleLoading;
400  friend class TestEventDropping;
403  friend class TestNodes;
404 
405 public:
406  VuoCompiler(const string &compositionPath = "", string target = "");
407  ~VuoCompiler(void);
408  void setDelegate(VuoCompilerDelegate *delegate);
409  void setCompositionPath(const string &compositionPath);
410  static Module *readModuleFromBitcode(string inputPath, string arch);
411  static void destroyModule(VuoCompilerModule *module);
412  static void destroyLlvmModule(Module *module);
413  void compileComposition(VuoCompilerComposition *composition, string outputPath, bool isTopLevelComposition, VuoCompilerIssues *issues);
414  void compileComposition(string inputPath, string outputPath, bool isTopLevelComposition, VuoCompilerIssues *issues);
415  void compileCompositionString(const string &compositionString, string outputPath, bool isTopLevelComposition, VuoCompilerIssues *issues);
416  void compileModule(string inputPath, string outputPath);
417  void compileModule(string inputPath, string outputPath, const vector<string> &includeDirs);
418  void linkCompositionToCreateExecutable(string inputPath, string outputPath, Optimization optimization, string rPath="", bool shouldAdHocCodeSign = true);
419  void linkCompositionToCreateDynamicLibrary(string inputPath, string outputPath, Optimization optimization, bool shouldAdHocCodeSign = true);
420  void linkCompositionToCreateDynamicLibraries(string compiledCompositionPath, string linkedCompositionPath, VuoRunningCompositionLibraries *runningCompositionLibraries);
422  set<string> getDependenciesForComposition(VuoCompilerComposition *composition);
424  VuoCompilerCompatibility getCompatibilityOfDependencies(const set<string> &dependencies);
425  void prepareForFastBuild(void);
426  string getTarget(void);
427  string getArch(void);
428  static void generateBuiltInModuleCaches(string vuoFrameworkPath, string target);
429  static void deleteOldModuleCaches(void);
430  void setLoadAllModules(bool shouldLoadAllModules);
431  VuoNode * createNode(VuoCompilerNodeClass *nodeClass, string title="", double x=0, double y=0);
432  VuoNode * createNode(VuoCompilerNodeClass *nodeClass, VuoNode *nodeToCopyMetadataFrom);
433  VuoNode * createPublishedInputNode(vector<VuoPublishedPort *> publishedInputPorts);
434  VuoNode * createPublishedOutputNode(vector<VuoPublishedPort *> publishedOutputPorts);
435  void installNodeClassAtCompositionLocalScope(const string &sourcePath);
436  void uninstallNodeClassAtCompositionLocalScope(const string &sourcePath);
437  void overrideInstalledNodeClass(const string &sourcePath, const string &sourceCode);
438  void revertOverriddenNodeClass(const string &sourcePath);
439  VuoCompilerNodeClass * getNodeClass(const string &nodeClassName);
440  map<string, VuoCompilerNodeClass *> getNodeClasses(void);
441  VuoCompilerType * getType(const string &typeName);
442  map<string, VuoCompilerType *> getTypes(void);
443  VuoCompilerModule *getLibraryModule(const string &libraryModuleName);
444  map<string, VuoCompilerModule *> getLibraryModules();
445  map<string, VuoNodeSet *> getNodeSets();
446  VuoNodeSet * getNodeSetForName(const string &name);
447  void listNodeClasses(const string &format = "");
448  static string getVuoFrameworkPath(void);
449  static string getModuleKeyForPath(string path);
450  bool isCompositionLocalModule(string moduleKey);
451  string getCompositionLocalModulesPath(void);
452  string getCompositionLocalPath(void);
453  void addHeaderSearchPath(const string &path);
454  void addLibrarySearchPath(const string &path);
455  void addFrameworkSearchPath(const string &path);
456  void setTelemetry(const string &telemetry);
457  void setVerbose(bool isVerbose);
458  void setShouldPotentiallyShowSplashWindow(bool potentiallyShow);
459  bool shouldShowSplashWindow();
460  string getCompositionLoaderPath(void);
461  void print(void);
462 
463  static VuoRunner * newSeparateProcessRunnerFromCompositionFile(string compositionFilePath, VuoCompilerIssues *issues);
464  static VuoRunner * newSeparateProcessRunnerFromCompositionString(string composition, string processName, string workingDirectory, VuoCompilerIssues *issues);
465  static VuoRunner * newCurrentProcessRunnerFromCompositionFile(string compositionFilePath, VuoCompilerIssues *issues);
466  static VuoRunner * newCurrentProcessRunnerFromCompositionString(string composition, string workingDirectory, VuoCompilerIssues *issues);
467 
468  static llvm::LLVMContext *globalLLVMContext;
469 
470 private:
471  void *p;
472 #ifdef VUO_PRO
473 #include "pro/VuoCompiler_Pro.hh"
474 #endif
475 };
476 
484 {
485 public:
489  VuoCompilerDelegate(void);
490 
516  virtual void loadedModules(const map<string, VuoCompilerModule *> &modulesAdded,
517  const map<string, pair<VuoCompilerModule *, VuoCompilerModule *> > &modulesModified,
518  const map<string, VuoCompilerModule *> &modulesRemoved, VuoCompilerIssues *issues) = 0;
519 
529  void loadedModulesCompleted(void);
530 
531 private:
532  class LoadedModulesData
533  {
534  public:
535  LoadedModulesData(const set< pair<VuoCompilerModule *, VuoCompilerModule *> > &modulesModified,
536  const set<VuoCompilerModule *> &modulesRemoved, VuoCompilerIssues *issues);
537  ~LoadedModulesData(void);
538  void retain(void);
539  void release(void);
540 
541  private:
542  int referenceCount;
543  dispatch_queue_t referenceCountQueue;
544  set< pair<VuoCompilerModule *, VuoCompilerModule *> > modulesModified;
545  set<VuoCompilerModule *> modulesRemoved;
546  VuoCompilerIssues *issues;
547  };
548 
549  void enqueueData(LoadedModulesData *data);
550  LoadedModulesData * dequeueData(void);
551 
552  list<LoadedModulesData *> pendingData;
553  dispatch_queue_t pendingDataQueue;
554 
555  friend class VuoCompiler;
556 };