source: CMT/v1r26p20140131/source/cmt_generator.h

Last change on this file was 663, checked in by rybkin, 10 years ago

See C.L. 522

  • Property svn:eol-style set to native
File size: 6.3 KB
Line 
1//-----------------------------------------------------------
2// Copyright Christian Arnault LAL-Orsay CNRS
3// arnault@lal.in2p3.fr
4// Modified by Grigory Rybkin
5// See the complete license in cmt_license.txt "http://www.cecill.info".
6//-----------------------------------------------------------
7
8#ifndef __cmt_generator_h__
9#define __cmt_generator_h__
10
11#include "cmt_parser.h"
12#include "cmt_constituent.h"
13#include "cmt_language.h"
14#include "cmt_awk.h"
15
16class Packager : public FAwk
17{
18public:
19  void begin ();
20  void filter (const cmt_string& line);
21  cmt_string& package_name ();
22private:
23  cmt_string m_package_name;
24};
25
26class SourceFile
27{
28public:
29  void set (const cmt_string name, Language& language, const cmt_string output);
30  cmt_string name () const;
31  Language& language () const;
32  cmt_string output () const;
33
34private:
35  cmt_string m_name;
36  Language* m_language;
37  cmt_string m_output;
38};
39
40/**
41   Base class for all specific generators.
42   The Generator command driver will operate on specialized classes of CmtGenerator
43*/
44class CmtGenerator
45{
46public:
47
48  CmtGenerator ();
49
50  void reset ();
51  bool prepare_output (const cmt_string& package,
52                       const Constituent& constituent,
53                       const cmt_string& file = "");
54  void commit (const cmt_string& name);
55  static void check (const cmt_string& name);
56  void terminate ();
57
58  void fill_names_outputs ();
59  void fill_outputs ();
60
61  //  void prepare_use_context ();
62
63  void set_full_name (cmt_string& full_name, cmt_string& file);
64  void filter_path (cmt_string& text);
65  int get_all_files (const cmt_string& full_name,
66                     const cmt_vector<cmt_regexp>& exclude_exprs, 
67                     const cmt_vector<cmt_regexp>& select_exprs, 
68                     CmtSystem::cmt_string_vector& files);
69
70
71public:
72  cmt_string m_PACKINCLUDES;
73  bool m_PACKOS9;
74
75  cmt_string m_GENERATOR;
76
77  bool is_library;
78  bool is_application;
79
80  cmt_string srcdir;
81  cmt_string docdir;
82  cmt_string cmtdir;
83  cmt_string incdir;
84  cmt_string src;
85  cmt_string doc;
86  cmt_string inc;
87  cmt_string mgr;
88  cmt_string cmt;
89  cmt_string protos;
90  cmt_string protonames;
91  cmt_string os9sources;
92
93  cmt_vector<SourceFile> m_source_files;
94
95  cmt_string m_bin;
96  cmt_string m_output_file_name;
97  FILE* m_output_file;
98
99  Constituent* m_constituent;
100
101  Variable m_CONSTITUENT;
102  Variable m_LINKMACRO;
103  Variable m_DEPENDENCIESOPTS;
104  Variable m_DOCPATH;
105  Variable m_PACKAGEPATH;
106  Variable m_PACKAGEPREFIX;
107  Variable m_PACKAGE;
108  Variable m_VERSION;
109  Variable m_MGRSTYLE;
110  Variable m_TITLE;
111  Variable m_GROUP;
112  Variable m_CONSTITUENTSUFFIX;
113  Variable m_LIBRARYSUFFIX;
114  Variable m_USER;
115  Variable m_DATE;
116  Variable m_PROTOTARGET;
117  Variable m_OBJS;
118  Variable m_CLASSES;
119  Variable m_PROTOSTAMPS;
120  Variable m_NAME;
121  Variable m_FILEPATH;
122  Variable m_FILESUFFIX;
123  Variable m_SUFFIX;
124  Variable m_FILENAME;
125  Variable m_LINE;
126  Variable m_ADDINCLUDE;
127  Variable m_FULLNAME;
128  Variable m_DIRNAME;
129  Variable m_OUTPUTNAME;
130  Variable m_ALLOS9SOURCES;
131  Variable m_NODEBUGUSELINKOPTS;
132  Variable m_DEBUGUSELINKOPTS;
133  Variable m_USEINCLUDES;
134  Variable m_HASTARGETTAG;
135  Variable m_HASDEPENDENCIES;
136  Variable m_HASPROTOTYPES;
137  Variable m_ISCHECKGROUP;
138};
139
140class InGenerator
141{
142 public:
143  InGenerator (bool usecmt, bool pedantic);
144  int build (const Constituent& constituent, ostream& out = cout);
145 
146 private:
147  InGenerator ();
148
149 private:
150  class Buffer
151  {
152  public:
153    Buffer ();
154    void set_names (const CmtSystem::cmt_string_vector& names);
155    int print (ostream& s);
156    void set_uses (bool usecmt);
157    void set_pedantic (bool pedantic);
158  private:
159    virtual int initialize () = 0;
160
161  protected:
162    CmtSystem::cmt_string_vector m_names;
163    ostringstream m_buffer;
164    bool m_initialized;
165    bool m_usecmt;
166    bool m_pedantic;
167  };
168 
169  class Languages : public Buffer
170  {
171  private:
172    int initialize ();
173  };
174 
175  class Fragments : public Buffer
176  {
177  private:
178    int initialize ();
179  };
180 
181 private:
182  Fragments m_common;
183  Fragments m_application;
184  Fragments m_application_library;
185  Fragments m_library;
186  Fragments m_document;
187  Languages m_languages;
188  bool m_usecmt;
189  bool m_pedantic;
190};
191
192/**
193   Generic command interface to be used by the cmt command driver.
194 */
195class Generator
196{
197public:
198    // Build the MSDEV workspace file
199  static int build_msdev_workspace (const Constituent::ConstituentVector& constituents);
200
201    // Build the MSDEV project file (one per constituent)
202  static int build_msdev (const Constituent& constituent);
203
204    // Build the VSNET workspace file
205  static int build_vsnet_workspace (const Constituent::ConstituentVector& constituents);
206
207    // Build the VSNET project file (one per constituent)
208  static int build_vsnet (const Constituent& constituent);
209
210     // Build the Make setup file
211  static void build_make_setup (const cmt_string& package);
212
213    // Build the constituents.make file
214  static void build_constituents_makefile (const cmt_string& package,
215                                           const cmt_string& file = "");
216                                           //                                      const CmtSystem::cmt_string_vector& arguments);
217
218    // Build the makefile fragment for one constituent
219  static int build_constituent_makefile (const Constituent& constituent,
220                                         bool& dependencies,
221                                         const cmt_string& file = "");
222  static void build_constituent_makefile (const CmtSystem::cmt_string_vector& arguments);
223  static int build_constituent_infile (const Constituent& constituent,
224                                       const cmt_string& outdir = "",
225                                       bool usecmt = true);
226
227  static int build_library_links_infile (const cmt_string& outdir = "");
228
229  static int build_dependencies_infile (const Constituent* constituent,
230                                        const cmt_string& outdir = "",
231                                        bool usecmt = true);
232
233  static void build_default_makefile ();
234
235    // Build the packages (N)Make file
236  static void build_packages_makefile (const cmt_string& package,
237                                       const cmt_string& file = "");
238
239    // Build the dependencies for one module
240  static void build_dependencies (const CmtSystem::cmt_string_vector& arguments);
241
242    // Build prototype file for one module
243  static void build_prototype (const cmt_string& file_name);
244
245    // Build README.html file
246  static void build_readme (const CmtSystem::cmt_string_vector& arguments);
247
248    // Build def files for Windows shared libraries
249  //  static void build_windefs (const cmt_string& library_name);
250  static void build_windefs (const CmtSystem::cmt_string_vector& arguments);
251};
252
253#endif
Note: See TracBrowser for help on using the repository browser.