d44e3c4f |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Copyright (c) 2000-2015 Ericsson Telecom AB |
3 | // All rights reserved. This program and the accompanying materials |
4 | // are made available under the terms of the Eclipse Public License v1.0 |
5 | // which accompanies this distribution, and is available at |
6 | // http://www.eclipse.org/legal/epl-v10.html |
7 | /////////////////////////////////////////////////////////////////////////////// |
8 | #ifndef _LIB_GEN_HELPER_HH |
9 | #define _LIB_GEN_HELPER_HH |
10 | #include <string> |
11 | #include <map> |
12 | #include <vector> |
13 | #include <cstdio> |
14 | class ProjectGenHelper; |
15 | class ProjectDescriptor { |
16 | public: |
17 | explicit ProjectDescriptor(const char* name); |
18 | ~ProjectDescriptor() { cleanUp(); }; |
19 | |
20 | const std::string& getProjectName() const { return projectName; } |
21 | void setTPDFileName( const char* name); |
22 | const std::string& getTPDFileName() const { return tpdFileName; } |
23 | void setTargetExecName(const char* name) { targetExecutableName = std::string(name); } |
24 | const std::string& getTargetExecName() const { return targetExecutableName; } |
25 | void setProjectAbsTpdDir(const char* name) { projectAbsTpdDir = std::string(name); } |
26 | const std::string& getProjectAbsTpdDir() const { return projectAbsTpdDir; } |
27 | void setProjectAbsWorkingDir(const char* name); |
28 | void setProjectWorkingDir(const char* name) { projectWorkingDir = std::string(name); } |
29 | const std::string& getProjectAbsWorkingDir() const { return projectAbsWorkingDir; } |
30 | const std::string& getProjectWorkingDir() const { return projectWorkingDir; } |
31 | void setLinkingStrategy(bool strategy) { dynamicLinked = strategy; } |
32 | bool getLinkingStrategy() const { return dynamicLinked; } |
33 | void setLibrary(bool isLib) { library = isLib; } |
34 | bool isLibrary() const { return library; } |
35 | bool isInitialized(); |
36 | void addToReferencedProjects(const char* refProjName); |
37 | void addToRefProjWorkingDirs(const std::string& subProjDir); |
38 | bool hasLinkerLibTo(const std::string& refProjName) const; |
39 | bool hasLinkerLib(const char* libName) const; // Linker Lib got from TPD |
40 | void addToLibSearchPaths(const char* libSearchPath); |
41 | void addToLinkerLibs(const char* linkerLibs); |
42 | void print(); |
43 | void cleanUp(); |
44 | size_t numOfReferencedProjects() const { return referencedProjects.size(); }; |
45 | size_t numOfRefProjWorkingDirs() const { return refProjWorkingDirs.size(); }; |
46 | size_t numOfLibSearchPaths() const { return libSearchPaths.size(); }; |
47 | size_t numOfLinkerLibs() const { return linkerLibraries.size(); }; |
48 | const std::string& getReferencedProject(size_t index) const |
49 | { return index < referencedProjects.size() ? referencedProjects[index] : emptyString; }; |
50 | const std::string& getRefProjWorkingDir(size_t index) const |
51 | { return index < refProjWorkingDirs.size() ? refProjWorkingDirs[index] : emptyString; }; |
52 | const char* getLibSearchPath(const std::string& subProjName) const; |
53 | const char* getLibSearchPath(size_t index) const { return libSearchPaths[index].c_str(); }; |
54 | const char* getLinkerLib(const std::string& subProjName) const; |
55 | const char* getLinkerLib(size_t index) const { return linkerLibraries[index].c_str(); }; |
56 | size_t getLibSearchPathIndex(const std::string& subProjName) const; |
57 | void setLibSearchPath(size_t index, const std::string& relPath) { libSearchPaths[index] = relPath; }; |
58 | void addTtcn3ModuleName(const char* name) { ttcn3ModuleNames.push_back(name); }; |
59 | bool hasTtcn3ModuleName(const char* moduleName) const; |
60 | void addAsn1ModuleName(const char* name) { asn1ModuleNames.push_back(name); }; |
61 | bool hasAsn1ModuleName(const char* moduleName) const; |
62 | void addUserSource(const char* name) { userSources.push_back(name); }; |
63 | bool hasUserSource(const char* userSourceName) const; |
64 | void addUserHeader(const char* name) { userHeaders.push_back(name); }; |
65 | bool hasUserHeader(const char* userHeaderName) const; |
66 | void addTtcn3PP(const char* name) { ttcnPP.push_back(name); }; |
67 | bool hasTtcn3PP(const char* ttcnPPName) const; |
68 | std::string setRelativePathTo(const std::string& absPathTo); |
69 | |
70 | private: |
71 | static const std::string emptyString; |
72 | std::string projectName; |
73 | std::string tpdFileName; |
74 | std::string targetExecutableName; //Library or Executable(only the top level) |
75 | std::string projectAbsTpdDir; |
76 | std::string projectAbsWorkingDir; |
77 | std::string projectWorkingDir; |
78 | bool library; |
79 | bool dynamicLinked; |
80 | std::vector<std::string> referencedProjects; |
81 | std::vector<std::string> refProjWorkingDirs; |
82 | std::vector<std::string> libSearchPaths; |
83 | std::vector<std::string> linkerLibraries; |
84 | std::vector<std::string> ttcn3ModuleNames; |
85 | std::vector<std::string> asn1ModuleNames; |
86 | std::vector<std::string> userSources; // *.cc ; *.cpp |
87 | std::vector<std::string> userHeaders; // *.hh ; *.h ; *.hpp |
88 | std::vector<std::string> ttcnPP; // *.ttcnpp |
89 | bool initialized; |
90 | }; |
91 | |
92 | class ProjectGenHelper { |
93 | public: |
94 | static ProjectGenHelper &Instance(); |
95 | ~ProjectGenHelper() { cleanUp(); }; |
96 | void setZflag(bool flag) { Zflag = flag; }; |
97 | bool getZflag() const { return Zflag; }; |
98 | void setWflag(bool flag) { Wflag = flag; }; |
99 | bool getWflag() const { return Wflag; }; |
100 | void setHflag(bool flag) { Hflag = flag; }; |
101 | bool getHflag() const { return Hflag; }; |
102 | void setToplevelProjectName(const char* name); |
103 | const std::string& getToplevelProjectName() const { return nameOfTopLevelProject; }; |
104 | void setRootDirOS(const char* name); |
105 | const std::string& getRootDirOS(const char* name); |
106 | void addTarget(const char* projName); |
107 | void generateRefProjectWorkingDirsTo(const char* projName); |
108 | void addTtcn3ModuleToProject(const char* projName, const char* moduleName); |
109 | void addAsn1ModuleToProject(const char* projName, const char* moduleName); |
110 | void addUserSourceToProject(const char* projName, const char* userSourceName); |
111 | void addUserHeaderToProject(const char* projName, const char* userHeaderName); |
112 | void addTtcnPPToProject(const char* projName, const char* ttcnPPName); |
113 | bool isTtcn3ModuleInLibrary(const char* moduleName) const; |
114 | bool isAsn1ModuleInLibrary(const char* moduleName) const; |
115 | bool isSourceFileInLibrary(const char* fileName) const; |
116 | bool isHeaderFileInLibrary(const char* fileName) const; |
117 | bool isTtcnPPFileInLibrary(const char* fileName) const; |
118 | ProjectDescriptor* getTargetOfProject(const char* projName); |
119 | const ProjectDescriptor* getTargetOfProject(const char* projName) const; |
120 | ProjectDescriptor* getProjectDescriptor(const char* targetName); //target_executable_name |
121 | std::map<std::string, ProjectDescriptor>::const_iterator getHead() const; |
122 | std::map<std::string, ProjectDescriptor>::const_iterator getEnd() const; |
123 | size_t numOfLibs() const; |
124 | void getExternalLibs(std::vector<const char*>& extLibs); |
125 | void getExternalLibSearchPaths(std::vector<const char*>& extLibPaths); |
126 | bool hasReferencedProject(); |
127 | size_t numOfProjects() const { return projs.size();}; |
128 | bool isCPPSourceFile(const char* fileName) const; |
129 | bool isCPPHeaderFile(const char* fileName) const; |
130 | bool isTtcnPPFile(const char* fileName) const; |
131 | void print(); |
132 | bool sanityCheck(); // tests if the structure generated from TPDs is consistent |
133 | void cleanUp(); |
134 | |
135 | private: |
136 | ProjectGenHelper(); |
137 | ProjectGenHelper(const ProjectGenHelper &rhs); |
138 | ProjectGenHelper &operator=(const ProjectGenHelper &rhs); |
139 | ProjectDescriptor* getProject(const char* projName); |
140 | const ProjectDescriptor* getProject(const char* projName) const; |
141 | bool DynamicLibraryChecker(const ProjectDescriptor* desc, |
142 | bool& found, |
143 | char** executableName); |
144 | private: |
145 | static ProjectGenHelper& intance; |
146 | static const std::string emptyString; |
147 | std::string nameOfTopLevelProject; |
148 | std::string rootDirOS; // make archive needs the top dir on OS level |
149 | std::string relPathToRootDirOS; |
150 | bool Zflag; // the makefilegen switch wether to use this option at all |
151 | bool Wflag; // prefix woring directory |
152 | bool Hflag; // hierarchical make structure |
153 | std::map<const std::string, ProjectDescriptor> projs; |
154 | std::map<const std::string, const ProjectDescriptor*> checkedProjs; |
155 | }; |
156 | |
157 | #endif // _LIB_GEN_HELPER_HH |