Merge pull request #67 from BenceJanosSzabo/master
[deliverable/titan.core.git] / compiler2 / ProjectGenHelper.cc
CommitLineData
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#include "ProjectGenHelper.hh"
9#include "../common/memory.h"
10
11#include "error.h"
12#include <limits>
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16
17const std::string ProjectDescriptor::emptyString = std::string();
18
19ProjectDescriptor::ProjectDescriptor(const char * name) :
20 projectName(std::string(name)),
21 tpdFileName(),
22 targetExecutableName(),
23 projectAbsTpdDir(),
24 projectAbsWorkingDir(),
25 projectWorkingDir(),
26 library(false),
27 dynamicLinked(false),
28 referencedProjects(),
29 refProjWorkingDirs(),
30 libSearchPaths(),
31 linkerLibraries(),
32 ttcn3ModuleNames(),
33 asn1ModuleNames(),
34 userSources(),
35 userHeaders(),
36 ttcnPP(),
37 initialized(false)
38{}
39
40void ProjectDescriptor::cleanUp()
41{
42 referencedProjects.clear();
43 refProjWorkingDirs.clear(),
44 libSearchPaths.clear();
45 linkerLibraries.clear();
46 ttcn3ModuleNames.clear();
47 asn1ModuleNames.clear();
48 userSources.clear();
49 userHeaders.clear();
50 ttcnPP.clear();
51}
52
53bool ProjectDescriptor::isInitialized()
54{
55 if (!projectName.empty() &&
56 !targetExecutableName.empty() &&
57 !projectAbsTpdDir.empty() &&
58 !projectAbsWorkingDir.empty() &&
59 !projectWorkingDir.empty())
60 initialized = true;
61 return initialized;
62}
63
64void ProjectDescriptor::setTPDFileName(const char* name)
65{
66 const char SEPARATOR = '/';
67 std::string fileName(name);
68 size_t refProjPos = fileName.find_last_of(SEPARATOR);
69 if (std::string::npos == refProjPos) {
70 tpdFileName = fileName;
71 }
72 else {
73 tpdFileName = fileName.substr(refProjPos + 1);
74 }
75}
76
77void ProjectDescriptor::setProjectAbsWorkingDir(const char* name)
78{
79 if (!name) {
80 ERROR("No path was given to the working directory. Check if 'r' flag is set ");
81 return;
82 }
83 projectAbsWorkingDir = std::string(name);
84 ProjectGenHelper::Instance().setRootDirOS(name);
85}
86
87void ProjectDescriptor::addToReferencedProjects(const char* refProjName)
88{
89 std::vector<std::string>::iterator it;
90 for (it = referencedProjects.begin(); it != referencedProjects.end(); ++it) {
91 if (*it == std::string(refProjName)) return;
92 }
93 referencedProjects.push_back(std::string(refProjName));
94}
95
96void ProjectDescriptor::addToRefProjWorkingDirs(const std::string& subProjDir)
97{
98 std::vector<std::string>::iterator it;
99 for (it = refProjWorkingDirs.begin(); it != refProjWorkingDirs.end(); ++it) {
100 if (*it == subProjDir) return;
101 }
102 refProjWorkingDirs.push_back(subProjDir);
103}
104
105bool ProjectDescriptor::hasLinkerLibTo(const std::string& refProjName) const
106{
107 ProjectDescriptor* refProj = ProjectGenHelper::Instance().getTargetOfProject(refProjName.c_str());
108 for (size_t i = 0; i < referencedProjects.size(); ++i){
109 if (refProj && refProj->library) return true;
110 }
111 return false;
112}
113
114bool ProjectDescriptor::hasLinkerLib(const char* libName) const
115{
116 std::string linkerLibName(libName);
117 std::vector<std::string>::const_iterator it;
118 for (it = linkerLibraries.begin(); it != linkerLibraries.end(); ++it) {
119 if (*it == linkerLibName) return true;
120 }
121 return false;
122}
123
124void ProjectDescriptor::addToLibSearchPaths(const char* libSearchPath)
125{
126 std::string searchPath(libSearchPath);
127 std::vector<std::string>::iterator it;
128 for (it = libSearchPaths.begin(); it != libSearchPaths.end(); ++it) {
129 if (*it == searchPath) return;
130 }
131 libSearchPaths.push_back(libSearchPath);
132}
133
134void ProjectDescriptor::addToLinkerLibs(const char* linkerLibs)
135{
136 std::string llibs(linkerLibs);
137 std::vector<std::string>::iterator it;
138 for (it = linkerLibraries.begin(); it != linkerLibraries.end(); ++it) {
139 if (*it == llibs) return;
140 }
141 linkerLibraries.push_back(linkerLibs);
142}
143
144size_t ProjectDescriptor::getLibSearchPathIndex(const std::string& subProjName) const
145{
146
147 for (size_t i = 0; i < libSearchPaths.size(); ++i) {
148 if (std::string::npos != libSearchPaths[i].find(subProjName))
149 return i;
150 }
151 return std::numeric_limits<unsigned int>::max();
152}
153
154const char* ProjectDescriptor::getLibSearchPath(const std::string& subProjName) const
155{
156 for (size_t i = 0; i < libSearchPaths.size(); ++i) {
157 if (std::string::npos != libSearchPaths[i].find(subProjName))
158 return libSearchPaths[i].c_str();
159 }
160 return NULL;
161}
162
163bool ProjectDescriptor::hasTtcn3ModuleName(const char* moduleName) const
164{
165 std::string modName(moduleName);
166 std::vector<std::string>::const_iterator it;
167 for (it = ttcn3ModuleNames.begin(); it != ttcn3ModuleNames.end(); ++it) {
168 if (*it == modName) return true;
169 }
170 return false;
171}
172
173bool ProjectDescriptor::hasAsn1ModuleName(const char* moduleName) const
174{
175 std::string modName(moduleName);
176 std::vector<std::string>::const_iterator it;
177 for (it = asn1ModuleNames.begin(); it != asn1ModuleNames.end(); ++it) {
178 if (*it == modName) return true;
179 }
180 return false;
181}
182
183bool ProjectDescriptor::hasUserSource(const char* userSourceName) const
184{
185 std::string sourceName(userSourceName);
186 std::vector<std::string>::const_iterator it;
187 for (it = userSources.begin(); it != userSources.end(); ++it) {
188 if (*it == sourceName) return true;
189 }
190 return false;
191}
192
193bool ProjectDescriptor::hasUserHeader(const char* userHeaderName) const
194{
195 std::string headerName(userHeaderName);
196 std::vector<std::string>::const_iterator it;
197 for (it = userHeaders.begin(); it != userHeaders.end(); ++it) {
198 if (*it == headerName) return true;
199 }
200 return false;
201}
202
203bool ProjectDescriptor::hasTtcn3PP(const char* ttcnPPName) const
204{
205 std::string ttcnPPFile(ttcnPPName);
206 std::vector<std::string>::const_iterator it;
207 for (it = ttcnPP.begin(); it != ttcnPP.end(); ++it) {
208 if (*it == ttcnPPFile) return true;
209 }
210 return false;
211}
212
213std::string ProjectDescriptor::setRelativePathTo(const std::string& absPathTo)
214{
215 if (projectAbsWorkingDir.empty()) return std::string();
216 const char SEPARATOR = '/';
217 if (projectAbsWorkingDir.at(0) != SEPARATOR || absPathTo.at(0) != SEPARATOR)
218 ERROR("Expecting absolute path to generate LinkerLibSearchPath ");
219 size_t length = projectAbsWorkingDir.size() > absPathTo.size() ? absPathTo.size() : projectAbsWorkingDir.size();
220 size_t lastSlash = 0;
221 size_t i;
222 for(i = 0; i < length && projectAbsWorkingDir.at(i) == absPathTo.at(i); ++i) {
223 if (projectAbsWorkingDir.at(i) == SEPARATOR && absPathTo.at(i) == SEPARATOR) {
224 lastSlash = i; // the same path until now...
225 }
226 }
227 if (length == i) { // got subdirectory
228 if (projectAbsWorkingDir == absPathTo) {
229 return std::string("."); // the same paths were given
230 }
231 else if ((projectAbsWorkingDir.size() > absPathTo.size() && projectAbsWorkingDir.at(length) == SEPARATOR) ||
232 (projectAbsWorkingDir.size() < absPathTo.size() && absPathTo.at(length) == SEPARATOR))
233 lastSlash = length;
234 }
235
236 size_t slashCount = 0;
237 for (size_t i = lastSlash; i < projectAbsWorkingDir.size(); ++i) {
238 if (projectAbsWorkingDir.at(i) == SEPARATOR)
239 ++slashCount;
240 }
241
242 std::string relPath;
243 const std::string upDir("../");
244 for (size_t i = 0; i < slashCount; ++i)
245 relPath.append(upDir);
246
247 std::string pathTo = absPathTo.substr(lastSlash+1); // we left the heading slash
248 relPath.append(pathTo);
249 return std::string(relPath);
250}
251
252void ProjectDescriptor::print()
253{
254 fprintf( stderr, "project name %s and it is %s initialized\n", projectName.c_str(), isInitialized() ? "" : "not");
255 fprintf( stderr, " target executable name %s\n",targetExecutableName.c_str());
256 fprintf( stderr, " project abs TPD dir %s\n", projectAbsTpdDir.c_str());
257 fprintf( stderr, " project abs working dir %s\n", projectAbsWorkingDir.c_str());
258 fprintf( stderr, " project working dir %s\n", projectWorkingDir.c_str());
259 fprintf( stderr, " project is %s\n", library ? "Library" : "Executable");
260 fprintf( stderr, " project linking is %s\n", dynamicLinked ? "dynamic" : "static");
261 std::vector<std::string>::iterator it;
262 for (it = referencedProjects.begin(); it != referencedProjects.end(); ++it) {
263 fprintf( stderr, " Referenced project %s\n",(*it).c_str());
264 }
265 for (it = refProjWorkingDirs.begin(); it != refProjWorkingDirs.end(); ++it) {
266 fprintf( stderr, " Working dir of referenced project %s\n",(*it).c_str());
267 }
268 for (it = linkerLibraries.begin(); it != linkerLibraries.end(); ++it) {
269 fprintf( stderr, " Linker library %s\n", (*it).c_str());
270 }
271 for (it = libSearchPaths.begin(); it != libSearchPaths.end(); ++it) {
272 fprintf( stderr, " Linker lib search path %s\n", (*it).c_str());
273 }
274 for (it = ttcn3ModuleNames.begin(); it != ttcn3ModuleNames.end(); ++it) {
275 fprintf( stderr, " TTCN3 Module Name: %s\n", (*it).c_str());
276 }
277 for (it = asn1ModuleNames.begin(); it != asn1ModuleNames.end(); ++it) {
278 fprintf( stderr, " ASN1 Module Name: %s\n", (*it).c_str());
279 }
280 for (it = userSources.begin(); it != userSources.end(); ++it) {
281 fprintf( stderr, " Source Name: %s\n", (*it).c_str());
282 }
283 for (it = userHeaders.begin(); it != userHeaders.end(); ++it) {
284 fprintf( stderr, " Header Name: %s\n", (*it).c_str());
285 }
286 for (it = ttcnPP.begin(); it != ttcnPP.end(); ++it) {
287 fprintf( stderr, " TTCN PP Name: %s\n", (*it).c_str());
288 }
289 fprintf( stderr, "\n");
290}
291
292ProjectGenHelper& ProjectGenHelper::Instance()
293{
294 static ProjectGenHelper singleton;
295 return singleton;
296}
297
298const std::string ProjectGenHelper::emptyString = std::string();
299
300ProjectGenHelper::ProjectGenHelper() :
301 nameOfTopLevelProject(),
302 rootDirOS(),
303 relPathToRootDirOS(),
304 Zflag(false),
305 Wflag(false),
306 Hflag(false),
307 projs(),
308 checkedProjs()
309{}
310
311void ProjectGenHelper::addTarget(const char* projName)
312{
313 if (!Zflag) return;
314 if (projs.end() != projs.find(std::string(projName))) return; // we have it
315 ProjectDescriptor newLib(projName);
316 projs.insert(std::pair<std::string, ProjectDescriptor> (std::string(projName), newLib));
317}
318
319void ProjectGenHelper::setToplevelProjectName(const char* name)
320{
321 if (!nameOfTopLevelProject.empty()) return;
322 nameOfTopLevelProject = std::string(name);
323}
324
325void ProjectGenHelper::setRootDirOS( const char* name)
326{
327 if (rootDirOS.empty()) {
328 rootDirOS = std::string(name);
329 }
330 else { //compare the 2 string and get the common part
331 const char* root = rootDirOS.c_str();
332 const char* head = root;
333 for (; *root++ == *name++; ) ;
334 size_t length = root - head - 1; //minus the non-matching
335 if (rootDirOS.size() > length) {
336 rootDirOS.resize(length);
337 }
338 }
339}
340
341const std::string& ProjectGenHelper::getRootDirOS(const char* name)
342{
343 ProjectDescriptor* proj = getProject(name);
344 if (!proj) return emptyString;
345 relPathToRootDirOS = proj->setRelativePathTo(rootDirOS);
346 return relPathToRootDirOS;
347}
348
349ProjectDescriptor* ProjectGenHelper::getTargetOfProject(const char* projName)
350{
351 if (!Zflag) return NULL;
352 if (projs.end() == projs.find(std::string(projName))) return NULL;
353 return getProject(projName);
354}
355
356const ProjectDescriptor* ProjectGenHelper::getTargetOfProject(const char* projName) const
357{
358 if (!Zflag) return NULL;
359 if (projs.end() == projs.find(std::string(projName))) return NULL;
360 return getProject(projName);
361}
362
363ProjectDescriptor* ProjectGenHelper::getProjectDescriptor(const char* targetName)
364{
365 if (!Zflag) return NULL;
366 for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) {
367 if ((it->second).getTargetExecName() == std::string(targetName))
368 return &(it->second);
369 }
370 return NULL;
371}
372
373std::map<std::string, ProjectDescriptor>::const_iterator ProjectGenHelper::getHead() const
374{
375 return projs.begin();
376}
377
378std::map<std::string, ProjectDescriptor>::const_iterator ProjectGenHelper::getEnd() const
379{
380 return projs.end();
381}
382
383void ProjectGenHelper::addTtcn3ModuleToProject(const char* projName, const char* moduleName)
384{
385 if (!Zflag) return;
386 if (projs.end() == projs.find(std::string(projName))) return;
387 ProjectDescriptor* proj = getProject(projName);
388 if (proj && !proj->hasTtcn3ModuleName(moduleName)) {
389 proj->addTtcn3ModuleName(moduleName);
390 }
391}
392
393void ProjectGenHelper::addAsn1ModuleToProject(const char* projName, const char* moduleName)
394{
395 if (!Zflag) return;
396 if (projs.end() == projs.find(std::string(projName))) return;
397 ProjectDescriptor* proj = getProject(projName);
398 if (proj &&!proj->hasAsn1ModuleName(moduleName)) {
399 proj->addAsn1ModuleName(moduleName);
400 }
401}
402
403void ProjectGenHelper::addUserSourceToProject(const char* projName, const char* userSourceName)
404{
405 if (!Zflag) return;
406 if (projs.end() == projs.find(std::string(projName))) return;
407 ProjectDescriptor* proj = getProject(projName);
408 if (proj && !proj->hasUserSource(userSourceName)) {
409 proj->addUserSource(userSourceName);
410 }
411}
412
413void ProjectGenHelper::addUserHeaderToProject(const char* projName, const char* userHeaderName)
414{
415 if (!Zflag) return;
416 if (projs.end() == projs.find(std::string(projName))) return;
417 ProjectDescriptor* proj = getProject(projName);
418 if (proj && !proj->hasUserHeader(userHeaderName)) {
419 proj->addUserHeader(userHeaderName);
420 }
421}
422
423void ProjectGenHelper::addTtcnPPToProject(const char* projName, const char* ttcnPPName)
424{
425 if (!Zflag) return;
426 if (projs.end() == projs.find(std::string(projName))) return;
427 ProjectDescriptor* proj = getProject(projName);
428 if (proj && !proj->hasTtcn3PP(ttcnPPName)) {
429 proj->addTtcn3PP(ttcnPPName);
430 }
431}
432
433void ProjectGenHelper::generateRefProjectWorkingDirsTo(const char* projName)
434{
435 if (!Zflag) return;
436 std::map<std::string,ProjectDescriptor>::iterator iter = projs.find(projName);
437 if (projs.end() == iter) {
438 ERROR("Project \"%s\" is not found in the project hierarchy ", projName);
439 return;
440 }
441 if (nameOfTopLevelProject != (iter->second).getProjectName()) {
442 ERROR("Project \"%s\" is not the on the top-level ", projName);
443 return;
444 }
445 ProjectDescriptor* proj = &(iter->second); // the Top level project
446
447 for (size_t i = 0; i < proj->numOfReferencedProjects(); ++i) {
448 const std::string& refProjName = proj->getReferencedProject(i);
449 ProjectDescriptor* refProj = getTargetOfProject(refProjName.c_str());
450 if (!refProj) return; // for sure...
451 const std::string& absWorkingDir = refProj->getProjectAbsWorkingDir();
452 if (!absWorkingDir.empty()) {
453 std::string relPath = proj->setRelativePathTo(absWorkingDir);
454 proj->addToRefProjWorkingDirs(relPath);
455 }
456 }
457}
458
459size_t ProjectGenHelper::numOfLibs() const
460{
461 if (!Zflag) return 0;
462 size_t num = 0;
463 for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) {
464 if ((it->second).isLibrary()) {
465 ++num;
466 }
467 }
468 return num;
469}
470
471struct CompareStr
472{
473 bool operator () (const char* lhs, const char* rhs) {
474 int ret = strcmp(lhs, rhs);
475 return (0 > ret);
476 }
477};
478
479void ProjectGenHelper::getExternalLibs(std::vector<const char*>& extLibs)
480{
481 if (!Zflag) return;
482 std::map<const char*, const char*, CompareStr> libs;
483 for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) {
484 if ((it->second).numOfLinkerLibs() > 0) {
485 for (size_t i = 0; i < (it->second).numOfLinkerLibs(); ++i) {
486 const char* key = (it->second).getLinkerLib(i);
487 const char* value = (it->second).getProjectName().c_str();
488 libs.insert(std::pair<const char*,const char*>(key,value)); // filter duplicates
489 }
490 }
491 }
492 std::map<const char*, const char*>::iterator it;
493 for (it = libs.begin(); it != libs.end(); ++it) {
494 extLibs.push_back(it->first);
495 }
496}
497
498void ProjectGenHelper::getExternalLibSearchPaths(std::vector<const char*>& extLibPaths)
499{
500 if (!Zflag) return;
501 std::map<const char*, const char*, CompareStr> libPaths;
502 for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) {
503 if ((it->second).numOfLibSearchPaths() > 0) {
504 for (size_t i = 0; i < (it->second).numOfLibSearchPaths(); ++i) {
505 const char* key = (it->second).getLibSearchPath(i);
506 const char* value = (it->second).getProjectName().c_str();
507 libPaths.insert(std::pair<const char*,const char*>(key,value)); // filter duplicates
508 }
509 }
510 }
511 std::map<const char*, const char*>::iterator it;
512 for (it = libPaths.begin(); it != libPaths.end(); ++it) {
513 extLibPaths.push_back(it->first);
514 }
515}
516
517bool ProjectGenHelper::hasReferencedProject()
518{
519 if (!Zflag) return false;
520 ProjectDescriptor* topLevel = getTargetOfProject(nameOfTopLevelProject.c_str());
521 if (topLevel && topLevel->numOfReferencedProjects()) return true;
522 return false;
523}
524
525bool ProjectGenHelper::isTtcn3ModuleInLibrary(const char* moduleName) const
526{
527 if (!Zflag) return false;
528 for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) {
529 if ((it->second).hasTtcn3ModuleName(moduleName) && (it->second).isLibrary()) return true;
530 }
531 return false;
532}
533
534bool ProjectGenHelper::isAsn1ModuleInLibrary(const char* moduleName) const
535{
536 if (!Zflag) return false;
537 for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) {
538 if ((it->second).hasAsn1ModuleName(moduleName) && (it->second).isLibrary()) return true;
539 }
540 return false;
541}
542
543bool ProjectGenHelper::isSourceFileInLibrary(const char* fileName) const
544{
545 if (!Zflag || NULL == fileName) return false;
546 for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) {
547 if ((it->second).hasUserSource(fileName) && (it->second).isLibrary()) return true;
548 }
549 return false;
550}
551
552bool ProjectGenHelper::isHeaderFileInLibrary(const char* fileName) const
553{
554 if (!Zflag || NULL == fileName) return false;
555
556 for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) {
557 if ((it->second).hasUserHeader(fileName) && (it->second).isLibrary()) return true;
558 }
559 return false;
560}
561
562bool ProjectGenHelper::isTtcnPPFileInLibrary(const char* fileName) const
563{
564 if (!Zflag || NULL == fileName) return false;
565
566 for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) {
567 if ((it->second).hasTtcn3PP(fileName) && (it->second).isLibrary()) return true;
568 }
569 return false;
570}
571
572bool ProjectGenHelper::isCPPSourceFile(const char* fileName) const
573{
574 std::string fnStr(fileName);
575 size_t pos = fnStr.find_last_of('.');
576 if (std::string::npos == pos) return false;
577 const std::string EXT_CC("cc");
578 const std::string EXT_CPP("cpp");
579 int length = 0;
580 if (std::string::npos != fnStr.find (EXT_CC, pos + 1))
581 length = EXT_CC.size();
582 else if (std::string::npos != fnStr.find (EXT_CPP, pos + 1))
583 length = EXT_CPP.size();
584
585 if (length && fnStr.size() == pos + length + 1)
586 return true;
587 else
588 return false;
589}
590
591bool ProjectGenHelper::isCPPHeaderFile(const char* fileName) const
592{
593 std::string fnStr(fileName);
594 size_t pos = fnStr.find_last_of('.');
595 if (std::string::npos == pos) return false;
596 const std::string EXT_HPP("hpp");
597 const std::string EXT_HH("hh");
598 const std::string EXT_H("h");
599 int length = 0;
600 if (std::string::npos != fnStr.find (EXT_HH, pos + 1))
601 length = EXT_HH.size();
602 else if (std::string::npos != fnStr.find (EXT_HPP, pos + 1))
603 length = EXT_HPP.size();
604 else if (std::string::npos != fnStr.find (EXT_H, pos + 1))
605 length = EXT_H.size();
606
607 if (length && fnStr.size() == pos + length + 1)
608 return true;
609 else
610 return false;
611}
612
613bool ProjectGenHelper::isTtcnPPFile(const char* fileName) const
614{
615 std::string fnStr(fileName);
616 size_t pos = fnStr.find_last_of('.');
617 if (std::string::npos == pos) return false;
618 const std::string EXT_TTCNPP("ttcnpp");
619 int length = 0;
620 if (std::string::npos != fnStr.find (EXT_TTCNPP, pos + 1))
621 length = EXT_TTCNPP.size();
622
623 if (length && fnStr.size() == pos + length + 1)
624 return true;
625 else
626 return false;
627}
628
629void ProjectGenHelper::print()
630{
631 if (!Zflag) return;
632 fprintf(stderr, "Top Level project : %s\n", nameOfTopLevelProject.c_str());
633 for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) {
634 (it->second).print();
635 }
636}
637
638bool ProjectGenHelper::sanityCheck()
639{
640 if (!Zflag) return true;
641 bool ret = true;
642// if toplevel is a dynamic linked executable (not library) all executable shall set to the same linking method
643 {
644 ProjectDescriptor* topLevel = getTargetOfProject(nameOfTopLevelProject.c_str());
645 bool isDynamicLinked = topLevel->getLinkingStrategy();
646 if (!topLevel->isLibrary() && isDynamicLinked) { // dynamic linked executable
647 for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) {
648 if (!(it->second).isLibrary()) { //if exectubale
649 if (isDynamicLinked != (it->second).getLinkingStrategy()) {
650 ERROR("project \"%s\" is set to %s linking. Sub project \"%s\" is set to %s linking. "
651 "All sub-level executable shall be set to the %s's type.",
652 nameOfTopLevelProject.c_str(),
653 isDynamicLinked ? "dynamic" : "static",
654 ((it->second).getProjectName()).c_str(),
655 isDynamicLinked ? "static" : "dynamic",
656 nameOfTopLevelProject.c_str());
657 ret = false;
658 }
659 }
660 }
661 }
662 }
663
664// under a dynamic linked library every project shall be linked dynamic library too.
665 {
666 checkedProjs.clear();
667 bool found = false; // search for executable under dynamic linked library
668 char* execName = NULL;
669 for (std::map<std::string, ProjectDescriptor>::reverse_iterator rit = projs.rbegin(); rit != projs.rend(); ++rit) {
670 if ((rit->second).isLibrary() && (rit->second).getLinkingStrategy()) { //dynamic library
671 ProjectDescriptor& proj = rit->second;
672 found = DynamicLibraryChecker(&proj, found, &execName);
673 if (found) {
674 ERROR("Project \"%s\" is dynamic linked library. Sub project \"%s\" is executable.\n"
675 "in TPD file, %s's all sub-level defaultTarget shall be set library too.",
676 proj.getProjectName().c_str(), execName, proj.getProjectName().c_str());
677 ret = false;
678 break;
679 }
680 }
681 }
682 }
683
684 return ret;
685}
686
687ProjectDescriptor* ProjectGenHelper::getProject(const char* projName)
688{
689 if (!projName) return NULL;
690 for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) {
691 if (it->first == std::string(projName)) {
692 return &(it->second);
693 }
694 }
695 return NULL;
696}
697
698const ProjectDescriptor* ProjectGenHelper::getProject(const char* projName) const
699{
700 if (!projName) return NULL;
701 for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) {
702 if (it->first == std::string(projName)) {
703 return &(it->second);
704 }
705 }
706 return NULL;
707}
708
709
710void ProjectGenHelper::cleanUp()
711{
712 if (!Zflag) return;
713 checkedProjs.clear();
714 for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) {
715 (it->second).cleanUp();
716 }
717}
718
719bool ProjectGenHelper::DynamicLibraryChecker(const ProjectDescriptor* desc,
720 bool& found,
721 char** executableName)
722{
723 if (found || !desc) return true;
724 for (size_t i = 0; i < desc->numOfReferencedProjects(); ++i) {
725 char* refProjName = const_cast<char*> (desc->getReferencedProject(i).c_str());
726 const ProjectDescriptor* subProj = getTargetOfProject(refProjName);
727 if (0 == checkedProjs.count(subProj->getProjectName())) {
728 if (subProj->isLibrary()) {
729 found = DynamicLibraryChecker(subProj, found, executableName);
730 }
731 else { // search for executable under dynamic linked library
732 found = true;
733 *executableName = refProjName;
734 break;
735 }
736 }
737 }
738 // it is checked, no such executable was found. Store it not to iterate again
739 if (!found)
740 checkedProjs.insert(std::pair<const std::string, const ProjectDescriptor*>
741 (desc->getProjectName(), desc));
742 return found;
743}
744
This page took 0.051885 seconds and 5 git commands to generate.