Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TModuleGenerator.h
Go to the documentation of this file.
1 // @(#)root/utils:$Id$
2 // Author: Axel Naumann, 2-13-07-02
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2013, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 ////////////////////////////////////////////////////////////////////////////////
13 //
14 // PCM writer.
15 //
16 ////////////////////////////////////////////////////////////////////////////////
17 
18 #ifndef ROOT_TModuleGenerator
19 #define ROOT_TModuleGenerator
20 
21 #include <ostream>
22 #include <sstream>
23 #include <fstream>
24 #include <string>
25 #include <map>
26 #include <vector>
27 
28 namespace clang {
29  class CompilerInstance;
30  class SourceManager;
31 }
32 
33 namespace ROOT {
34 
35 //______________________________________________________________________________
36  class TModuleGenerator {
37  public:
38  enum ESourceFileKind {
39  kSFKNotC,
40  kSFKHeader,
41  kSFKSource,
42  kSFKLinkdef
43  };
44 
45  TModuleGenerator(clang::CompilerInstance *CI,
46  bool inlineHeader,
47  const std::string &shLibFileName,
48  bool isInPCH);
49  ~TModuleGenerator();
50 
51  // FIXME: remove once PCH is gone.
52  bool IsPCH() const {
53  return fIsPCH;
54  }
55  void ParseArgs(const std::vector<std::string> &args);
56 
57  const std::string &GetDictionaryName() const {
58  return fDictionaryName;
59  }
60 
61  const std::string &GetDemangledDictionaryName() const {
62  return fDemangledDictionaryName;
63  }
64 
65  const std::string &GetModuleFileName() const {
66  return fModuleFileName;
67  }
68  const std::string &GetModuleDirName() const {
69  return fModuleDirName;
70  }
71 
72  int GetErrorCount() const {
73  return fErrorCount;
74  }
75 
76  const std::string &GetUmbrellaName() const {
77  return fUmbrellaName;
78  }
79  const std::string &GetContentName() const {
80  return fContentName;
81  }
82 
83  const std::vector<std::string> &GetHeaders() const {
84  return fHeaders;
85  }
86 
87  const std::vector<std::string> &GetIncludePaths() const {
88  return fCompI;
89  }
90 
91  std::ostream &WritePPDefines(std::ostream &out) const;
92  std::ostream &WritePPUndefines(std::ostream &out) const;
93 
94  void WriteRegistrationSource(std::ostream &out, const std::string &fwdDeclnArgsToKeepString,
95  const std::string &headersClassesMapString, const std::string &fwdDeclsString,
96  const std::string &extraIncludes, bool hasCxxModule) const;
97  void WriteContentHeader(std::ostream &out) const;
98  void WriteUmbrellaHeader(std::ostream &out) const;
99 
100  private:
101  void WriteRegistrationSourceImpl(std::ostream& out,
102  const std::string &dictName,
103  const std::string &demangledDictName,
104  const std::vector<std::string> &headerArray,
105  const std::vector<std::string> &includePathArray,
106  const std::string &fwdDeclStringRAW,
107  const std::string &fwdDeclnArgsToKeepString,
108  const std::string &payloadCodeWrapped,
109  const std::string &headersClassesMapString,
110  const std::string &extraIncludes,
111  bool hasCxxModule) const;
112 
113  void ConvertToCppString(std::string &text) const;
114 
115  std::ostream &WritePPIncludes(std::ostream &out) const;
116 
117  std::ostream &WritePPCode(std::ostream &out) const {
118  // Write defines, undefiles, includes, corrsponding to a rootcling
119  // invocation with -c -DFOO -UBAR header.h.
120  WritePPDefines(out);
121  WritePPUndefines(out);
122  return WritePPIncludes(out);
123  }
124 
125  std::ostream &WriteHeaderArray(std::ostream &out) const {
126  // Write "header1.h",\n"header2.h",\n0\n
127  return WriteStringVec(fHeaders, out);
128  }
129  std::ostream &WriteIncludePathArray(std::ostream &out) const {
130  // Write "./include",\n"/usr/include",\n0\n
131  return WriteStringVec(fCompI, out);
132  }
133  std::ostream &WriteDefinesArray(std::ostream &out) const {
134  // Write "DEFINED",\n"NAME=\"VALUE\"",\n0\n
135  return WriteStringPairVec(fCompD, out);
136  }
137  std::ostream &WriteUndefinesArray(std::ostream &out) const {
138  // Write "UNDEFINED",\n"NAME",\n0\n
139  return WriteStringVec(fCompU, out);
140  }
141 
142  bool FindHeader(const std::string& hdrName, std::string& hdrFullPath) const;
143 
144  typedef std::vector<std::pair<std::string, std::string> > StringPairVec_t;
145 
146  ESourceFileKind GetSourceFileKind(const char *filename) const;
147  std::ostream &WriteStringVec(const std::vector<std::string> &vec,
148  std::ostream &out) const;
149  std::ostream &WriteStringPairVec(const StringPairVec_t &vecP,
150  std::ostream &out) const;
151 
152  clang::CompilerInstance *fCI;
153  bool fIsPCH;
154  bool fIsInPCH; // whether the headers of this module are part of the PCH.
155  bool fInlineInputHeaders;
156 
157  std::string fDictionaryName; // Name of the dictionary, e.g. "Base"
158  std::string fDemangledDictionaryName; // Demangled name of the dictionary
159  std::string fModuleFileName; // PCM file name
160  std::string fModuleDirName; // PCM output directory
161  std::string fUmbrellaName; // name of umbrella header in PCM
162  std::string fContentName; // name of content description header in PCM
163 
164  std::vector<std::string> fHeaders; // exported headers in PCM
165  std::string fLinkDefFile; // The name of the linkdef file
166  std::vector<std::string> fCompI; // -I; needed only for ACLiC without PCMs
167 
168  StringPairVec_t fCompD; // -Dfirst=second
169  std::vector<std::string> fCompU; // -Ufirst
170  mutable int fErrorCount;
171  };
172 
173 } // namespace ROOT
174 
175 #endif // ROOT_TModuleGenerator