PhoenixGenerator  2.0.4
Set of tools to generate code
Loading...
Searching...
No Matches
simple_project_generator.cpp
Go to the documentation of this file.
1/***************************************
2 Auteur : Pierre Aubert
3 Mail : pierre.aubert@lapp.in2p3.fr
4 Licence : CeCILL-C
5****************************************/
6
7#include <ctime>
8
9#include "directory_replace_placeholder.h"
11#include "parserClassConfig.h"
12
13//C++ Trait Backend
14#include "CppTraitFromString.h"
15#include "CppTraitSetter.h"
16#include "CppTraitGetter.h"
17#include "CppTraitCopy.h"
18#include "CppTraitTypeStream.h"
19#include "CppTraitDataStream.h"
21#include "CppTraitCheckStream.h"
22
24
25//Wrapper Trait Backend
29
31
32//C++ Generator
33#include "generator_class_cpp.h"
34//Wrapper Generator
36
38
40
43bool isPhoenixDependency(const PString & packageName){
44 return (packageName.isSameBegining("Phoenix") || packageName.isSameBegining("phoenix"));
45}
46
48
51PString generateCmakeFindBody(const ProjectConfig & projectConfig){
52 PString cmakeFindBody;
53 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
54 const PPackageAttribute & pkgAttr = depIt->second;
55 if(!isPhoenixDependency(pkgAttr.getName())){
56 if(!pkgAttr.getCmakeFind().empty()){
57 cmakeFindBody += "find_package("+pkgAttr.getCmakeFind()+")";
58 }
59 }
60 }
61 return cmakeFindBody;
62}
63
65
68PString generatePhoenixPullExtraModule(const ProjectConfig & projectConfig){
69 PString phoenixPullExtraModule;
70 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
71 const PPackageAttribute & pkgAttr = depIt->second;
72 if(isPhoenixDependency(pkgAttr.getName())){
73 phoenixPullExtraModule += "pull_extra_module(\""+pkgAttr.getName()+"\" \""+pkgAttr.getUrl()+"\")\n";
74 }
75 }
76 return phoenixPullExtraModule;
77}
78
80
83PString generatePhoenixFindModule(const ProjectConfig & projectConfig){
84 PString phoenixFindModule;
85 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
86 const PPackageAttribute & pkgAttr = depIt->second;
87 if(isPhoenixDependency(pkgAttr.getName())){
88 phoenixFindModule += " "+pkgAttr.getName();
89 }
90 }
91 return phoenixFindModule;
92}
93
95
98PString generatePhoenixGlobalDep(const ProjectConfig & projectConfig){
99 PString phoenixGlobalDep;
100 phoenixGlobalDep += "set(" + projectConfig.name.toUpper() + "_TEST_DEPENDENCIES\n";
101 phoenixGlobalDep += "\t" + projectConfig.name.toSnakeCase() + "\n";
102 for(PackageMap::const_reverse_iterator depIt = projectConfig.mapDependencies.rbegin(); depIt != projectConfig.mapDependencies.rend(); ++depIt){
103 const PPackageAttribute & pkgAttr = depIt->second;
104 if(isPhoenixDependency(pkgAttr.getName())){
105 phoenixGlobalDep += "\t"+pkgAttr.getCmakeLib()+"\n";
106 }
107 }
108 phoenixGlobalDep += ")";
109 return phoenixGlobalDep;
110}
111
113
116PString generateTargetLinkBody(const ProjectConfig & projectConfig){
117 PString targetLinkBody;
118 targetLinkBody += "target_link_libraries("+projectConfig.name.toSnakeCase()+" ";
119 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
120 const PPackageAttribute & pkgAttr = depIt->second;
121 if(!isPhoenixDependency(pkgAttr.getName())){
122 targetLinkBody += pkgAttr.getCmakeLib()+" ";
123 }
124 }
125 targetLinkBody += ")\n";
126 return targetLinkBody;
127}
128
130
133PString generatePixiBody(const ProjectConfig & projectConfig){
134 PString pixiBody;
135 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
136 const PPackageAttribute & pkgAttr = depIt->second;
137 PString pixi_name = pkgAttr.getPixiName().toLower();
138 PString min_version = pkgAttr.getMinVersion();
139 PString max_version = pkgAttr.getMaxVersion();
140 if(pixi_name == "") continue;
141 else if(min_version.empty() && max_version.empty()){
142 pixiBody += pixi_name + " = \"*\"\n";
143 }else if(max_version.empty()){
144 pixiBody += pixi_name + " = \"" + min_version + "\"\n";
145 }else{
146 pixiBody += pixi_name + " = \"" + min_version;
147 if(!min_version.empty() && !max_version.empty()) pixiBody += ",";
148 pixiBody += max_version + "\"\n";
149 }
150 }
151 return pixiBody;
152}
153
155
158PString generateMarkdownDepList(const ProjectConfig & projectConfig){
159 PString packageMdList;
160 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
161 const PPackageAttribute & pkgAttr = depIt->second;
162 if(isPhoenixDependency(pkgAttr.getName())){
163 packageMdList += "- ["+pkgAttr.getName()+"]("+pkgAttr.getUrl()+")\n";
164 }
165 }
166 return packageMdList;
167}
168
170
173PString generateAuthorListPixi(const ProjectConfig & projectConfig){
174 PString authorListPixi;
175 authorListPixi += "authors = [\n";
176 for(ProjectMembersMap::const_iterator it = projectConfig.authorMap.begin(); it != projectConfig.authorMap.end(); ++it){
177 const PProjectMembers & author = it->second;
178 authorListPixi += " \"" + author.getFirstName() + " " + author.getLastName() + " <" + author.getEmail() + ">\",\n";
179 }
180 authorListPixi += "]\n";
181 return authorListPixi;
182}
183
185
188PString generateProjectAuthorList(const ProjectConfig & projectConfig){
189 PString projectAuthorList;
190 bool firstAuthor = true;
191 for(ProjectMembersMap::const_iterator it = projectConfig.authorMap.begin(); it != projectConfig.authorMap.end(); ++it){
192 const PProjectMembers & author = it->second;
193 if(!firstAuthor) projectAuthorList += ",\n";
194 projectAuthorList += " {\n";
195 projectAuthorList += " \"@type\": \"Person\",\n";
196 projectAuthorList += " \"givenName\": \"" + author.getFirstName() + "\",\n";
197 projectAuthorList += " \"familyName\": \"" + author.getLastName() + "\",\n";
198 projectAuthorList += " \"email\": \"" + author.getEmail() + "\",\n";
199 projectAuthorList += " \"affiliation\": {\n";
200 projectAuthorList += " \"@type\": \"Organization\",\n";
201 projectAuthorList += " \"name\": \"" + author.getAffiliation() + "\"\n";
202 projectAuthorList += " }\n";
203 projectAuthorList += " }";
204 firstAuthor = false;
205 }
206 return projectAuthorList;
207}
208
210
213PString generateProjectContributorList(const ProjectConfig & projectConfig){
214 PString projectContributorList;
215 bool firstContributor = true;
216 for(ProjectMembersMap::const_iterator it = projectConfig.contributorMap.begin(); it != projectConfig.contributorMap.end(); ++it){
217 const PProjectMembers & contributor = it->second;
218 if(!firstContributor) projectContributorList += ",\n";
219 projectContributorList += " {\n";
220 projectContributorList += " \"@type\": \"Person\",\n";
221 projectContributorList += " \"givenName\": \"" + contributor.getFirstName() + "\",\n";
222 projectContributorList += " \"familyName\": \"" + contributor.getLastName() + "\",\n";
223 projectContributorList += " \"email\": \"" + contributor.getEmail() + "\",\n";
224 projectContributorList += " \"affiliation\": {\n";
225 projectContributorList += " \"@type\": \"Organization\",\n";
226 projectContributorList += " \"name\": \"" + contributor.getAffiliation() + "\"\n";
227 projectContributorList += " }\n";
228 projectContributorList += " }";
229 firstContributor = false;
230 }
231 return projectContributorList;
232}
233
235
238PString generateMaintainer(const ProjectConfig & projectConfig){
239 PString maintainer;
240 const PProjectMembers & maintainerPerson = projectConfig.maintainerMap.begin()->second;
241 maintainer += " \"@type\": \"Person\",\n";
242 maintainer += " \"givenName\": \"" + maintainerPerson.getFirstName() + "\",\n";
243 maintainer += " \"familyName\": \"" + maintainerPerson.getLastName() + "\",\n";
244 maintainer += " \"email\": \"" + maintainerPerson.getEmail() + "\",\n";
245 maintainer += " \"affiliation\": {\n";
246 maintainer += " \"@type\": \"Organization\",\n";
247 maintainer += " \"name\": \"" + maintainerPerson.getAffiliation() + "\"\n";
248 maintainer += " }";
249 return maintainer;
250}
251
253
256PString generateKeywordsBody(const ProjectConfig & projectConfig){
257 PString keywordsBody;
258 if(!projectConfig.keywordList.empty()){
259 bool firstKeyword = true;
260 for(std::vector<PString>::const_iterator it = projectConfig.keywordList.begin(); it != projectConfig.keywordList.end(); ++it){
261 if(!firstKeyword) keywordsBody += ",\n";
262 keywordsBody += " \"" + *it + "\"";
263 firstKeyword = false;
264 }
265 }
266 return keywordsBody;
267}
268
270
285PMapString generateReplacementMap(const ProjectConfig & projectConfig, const PString & cmakeFindBody, const PString & phoenixPullExtraModule,
286 const PString & phoenixFindModule, const PString & phoenixGlobalDep, const PString & targetLinkBody,
287 const PString & pixiBody, const PString & markdownDepList, const PString & authorListPixi,
288 const PString & projectAuthorList, const PString & projectContributorList, const PString & maintainer,
289 const PString & keywordsBody, const PString & dateStr)
290{
291 PMapString mapReplace;
292 mapReplace["XXXProjectNameXXX"] = projectConfig.name; //project name
293 mapReplace["XXXPROJECT_NAMEXXX"] = projectConfig.name.toUpper(); //project name uppercase
294 mapReplace["xxxproject_namexxx"] = projectConfig.name.toSnakeCase(); //project library
295 mapReplace["XXXProjectNameDescriptionXXX"] = projectConfig.description; //description
296 mapReplace["XXXProjectNameUrlXXX"] = projectConfig.url; //project url
297 mapReplace["XXXProjectVersionXXX"] = projectConfig.version; //project version
298 mapReplace["XXXProjectNameHomepageUrlXXX"] = projectConfig.url; //project doc url (TODO add it or deduce it from the project url for gitlab)
299 mapReplace["XXXProjectNameRunnerTagXXX"] = projectConfig.runnerTag; //Project CI runner tag
300 mapReplace["XXXProjectFindPackageDependenciesXXX"] = cmakeFindBody; //project find_package
301 mapReplace["XXXProjectPhoenixDependenciesXXX"] = phoenixPullExtraModule; //project pull_extra_module
302 mapReplace["XXXProjectNameCMakeFindDependenciesXXX"] = phoenixFindModule; //project dependencies of phoenix_create_find
303 mapReplace["XXXProjectDependenciesCMakeVarXXX"] = phoenixGlobalDep; //cmake variable to hold test dependencies
304 mapReplace["XXXProjectNameTargetLinkLinDependenciesXXX"] = targetLinkBody; //full target_link_library command of generated lib
305 mapReplace["XXXCxxWorkflowUrlXXX"] = projectConfig.ciToolkitUrl+"@"+projectConfig.ciToolkitVersion; //Url and version of the CI workflow
306 mapReplace["xxxphoenixprojectpixipackagenamexxx"] = projectConfig.name.toLower(); //name of the pixi package
307 mapReplace["xxxprojectnamepixiextradependenciesxxx"] = pixiBody; //extra pixi dependencies
308 mapReplace["XXXProjectNameMarkdownListDependenciesXXX"] = markdownDepList; //markdown list of Phoenix dependencies
309 mapReplace["XXXcreationDateXXX"] = dateStr; //creation date
310 mapReplace["XXXProjectAuthorListPixiXXX"] = authorListPixi; //author list for pixi.toml
311 mapReplace["XXXAuthorListXXX"] = projectAuthorList; //author list for codemeta.json
312 mapReplace["XXXContributorListXXX"] = projectContributorList; //contributor list for codemeta.json
313 mapReplace["XXXMaintainerXXX"] = maintainer; //maintainer for codemeta.json
314 mapReplace["XXXKeywordListsXXX"] = keywordsBody; //keyword list for codemeta.json
315 return mapReplace;
316}
317
319
322PMapString generateAllReplacementData(const ProjectConfig & projectConfig){
323 // Generate various bodies using dedicated functions
324 PString cmakeFindBody = generateCmakeFindBody(projectConfig);
325 PString phoenixPullExtraModule = generatePhoenixPullExtraModule(projectConfig);
326 PString phoenixFindModule = generatePhoenixFindModule(projectConfig);
327 PString phoenixGlobalDep = generatePhoenixGlobalDep(projectConfig);
328 PString targetLinkBody = generateTargetLinkBody(projectConfig);
329 PString pixiBody = generatePixiBody(projectConfig);
330 PString markdownDepList = generateMarkdownDepList(projectConfig);
331 PString authorListPixi = generateAuthorListPixi(projectConfig);
332 PString projectAuthorList = generateProjectAuthorList(projectConfig);
333 PString projectContributorList = generateProjectContributorList(projectConfig);
334 PString maintainer = generateMaintainer(projectConfig);
335 PString keywordsBody = generateKeywordsBody(projectConfig);
336
337 time_t timestamp;
338 PString dateStr = ctime(&(timestamp = time(nullptr)));
339 dateStr = dateStr.eraseLastChar("\n"); // Remove the trailing \n
340
341 // Generate the replacement map
342 return generateReplacementMap(projectConfig, cmakeFindBody, phoenixPullExtraModule,
343 phoenixFindModule, phoenixGlobalDep, targetLinkBody,
344 pixiBody, markdownDepList, authorListPixi, projectAuthorList,
345 projectContributorList, maintainer, keywordsBody, dateStr);
346}
347
349
354bool simple_project_load_config(ProjectParam & param, const PPath & pdataDir, const PVecPath & vecClassConfigFile){
355 bool b(true);
356 for(const PPath & classConfigFile : vecClassConfigFile){
357 PDataConfig dataConfig;
358 dataConfig.getFileName() = classConfigFile;
359 if(!parserClassConfig(dataConfig.getVecClassConfig(), dataConfig.getVecInclude(), classConfigFile)){
360 std::cerr << "simple_project_load_config : can't load file '" << classConfigFile << "'" << std::endl;
361 b = false; //Best effort strategy
362 }
363 param.vecDataConfig.push_back(dataConfig);
364
365 PPath destFile = pdataDir / classConfigFile.getFileName();
366 PString fileContent = classConfigFile.loadFileContent();
367 if(!destFile.saveFileContent(fileContent)){
368 std::cerr << "simple_project_load_config : cannot copy pdata file to project pdata directory '"<<destFile<<"'" << std::endl;
369 b = false; //Best effort strategy
370 }
371 }
372 return b;
373}
374
376
380 if(projectParam.mode.type == ProjectType::CPP){
381 PTraitBackendManager manager;
383 manager.addTraitBackend<CppTraitCopy>();
390 return generator_class_full(manager, projectParam);
391 }else if(projectParam.mode.type == ProjectType::WRAPPER){
396 return wrapper_generator_class_full(manager, projectParam);
397 }
398 return false;
399}
400
402
408bool simple_project_generator(const PPath & descriptionFile, const PVecPath & vecClassConfigFile, const PString & projectType,
409 const GeneratorMode & mode)
410{
411 //First, let's read the toml config of the project
412 ProjectConfig projectConfig;
413 if(!project_generator_loadConfig(projectConfig, descriptionFile)){
414 std::cerr << "simple_project_generator : cannot parse project description file '"<<descriptionFile<<"'" << std::endl;
415 return false;
416 }
417 //Then look in the config files if the packages exists
418 if(!project_generator_loadPackageInfo(projectConfig)){
419 std::cerr << "simple_project_generator : cannot find package info of project '"<<projectConfig.name<<"'" << std::endl;
420 return false;
421 }
422 // Generate replacement data
423 PMapString mapReplace = generateAllReplacementData(projectConfig);
424 PPath inputConfigPlaceholderDir = PPath(SYSTEM_INSTALL_DIR) / PPath("share") / PPath("PhoenixGenerator") / PPath("Projects") / PPath(projectType), outputPath("./");
425 if(!directory_replace_placeholder(outputPath, inputConfigPlaceholderDir, mapReplace)){
426 std::cerr << "simple_project_generator : cannot replace placeholder in project generation '"<<projectConfig.name<<"'" << std::endl;
427 return false;
428 }
429 PPath mainPath = PPath(".") / PPath(projectConfig.name);
430 PPath srcPath = mainPath / PPath("src"), pdataDir = mainPath / PPath("pdata");
431 if(!pdataDir.createDirectory()){
432 std::cerr << "simple_project_generator : cannot create pdata directory '"<<pdataDir<<"'" << std::endl;
433 return false;
434 }
435 ProjectParam param;
436 param.mode = mode;
437 param.name = projectConfig.name;
438 param.version = projectConfig.version;
439 param.outputProjectDir = mainPath;
440 param.outputSourceDir = srcPath;
441 if(param.mode.type == ProjectType::CPP){
442 param.outputTestDir = mainPath / PPath("TESTS");
443 }else if(param.mode.type == ProjectType::WRAPPER){
444 param.outputTestDir = mainPath / PPath("tests");
445 }
446
447 if(!simple_project_load_config(param, pdataDir, vecClassConfigFile)){
448 std::cerr << "simple_project_generator : cannot load config to generate project in '"<<srcPath<<"'" << std::endl;
449 return false;
450 }
452 std::cerr << "simple_project_generator : cannot generate sources in '"<<srcPath<<"'" << std::endl;
453 return false;
454 }
455 // Generate class generator script
456 if(!generateClassGeneratorScript(vecClassConfigFile, pdataDir, param.mode)){
457 std::cerr << "simple_project_generator : cannot generate class generator script in pdata directory '"<<pdataDir<<"'" << std::endl;
458 return false;
459 }
460 return true;
461}
462
463
Class generator for setter trait.
Class generator for setter trait.
Class generator for setter trait.
Class generator for setter trait.
Class generator for setter trait.
Class generator for setter trait.
Class generator for setter trait.
Class generator for setter trait.
Class to describe a basic class.
Definition PDataConfig.h:17
const PVecClassConfig & getVecClassConfig() const
Get the vector of all config class of the current pdata file.
const PPath & getFileName() const
Get the file name of the current PDataConfig.
const PVecPath & getVecInclude() const
Get the vector of all include files of the current pdata file.
Describes a package attributes.
const PString & getName() const
Gets the name of the PPackageAttribute.
const PString & getMaxVersion() const
Gets the maxVersion of the PPackageAttribute.
const PString & getUrl() const
Gets the url of the PPackageAttribute.
const PString & getCmakeFind() const
Gets the cmakeFind of the PPackageAttribute.
const PString & getCmakeLib() const
Gets the cmakeLib of the PPackageAttribute.
const PString & getMinVersion() const
Gets the minVersion of the PPackageAttribute.
const PString & getPixiName() const
Gets the pixiName of the PPackageAttribute.
Describes a package attributes.
const PString & getFirstName() const
Gets the firstName of the PProjectMembers.
const PString & getLastName() const
Gets the lastName of the PProjectMembers.
const PString & getEmail() const
Gets the email of the PProjectMembers.
const PString & getAffiliation() const
Gets the affiliation of the PProjectMembers.
Manager of the Trait backends.
void addTraitBackend()
Add a trait backend into the PTraitBackendManager.
Manager of the Trait backends.
void addTraitBackend()
Add a trait backend into the PWrapperTraitBackendManager.
Class generator for setter trait.
Class generator for setter trait.
Class generator for setter trait.
bool generator_class_full(const PTraitBackendManager &manager, const ProjectParam &projectParam)
Generate the full sources and related unit tests from configuration.
bool parserClassConfig(std::vector< PClassConfig > &listClassConfig, PVecPath &listInclude, const PPath &fileName)
Parser list class config.
bool project_generator_loadPackageInfo(ProjectConfig &config)
This function should load the package info file from share/PhoenixGenerator/Packages and retrieve the...
bool project_generator_loadConfig(ProjectConfig &config, const PPath &descriptionFile)
Load the project configuration.
bool generateClassGeneratorScript(const PVecPath &vecClassConfigFile, const PPath &scriptDir, const GeneratorMode &mode)
Generate a bash script to re generate all the classes from their pdata configuration files.
bool simple_project_load_config(ProjectParam &param, const PPath &pdataDir, const PVecPath &vecClassConfigFile)
Load configuration pdata of generated sources.
PString generateAuthorListPixi(const ProjectConfig &projectConfig)
Generate author list for Pixi.
PString generateCmakeFindBody(const ProjectConfig &projectConfig)
Generate CMake find_package commands for non-Phoenix dependencies.
PString generateProjectContributorList(const ProjectConfig &projectConfig)
Generate project contributor list for codemeta.json.
bool simple_project_generate_source(const ProjectParam &projectParam)
Save generated sources of project.
PString generateKeywordsBody(const ProjectConfig &projectConfig)
Generate keywords list for codemeta.json.
bool isPhoenixDependency(const PString &packageName)
Check if a package is a Phoenix dependency.
PString generatePhoenixFindModule(const ProjectConfig &projectConfig)
Generate Phoenix find module list.
PString generateMarkdownDepList(const ProjectConfig &projectConfig)
Generate markdown list of Phoenix dependencies.
PString generatePhoenixPullExtraModule(const ProjectConfig &projectConfig)
Generate Phoenix pull_extra_module commands.
PString generatePixiBody(const ProjectConfig &projectConfig)
Generate Pixi dependencies.
PMapString generateAllReplacementData(const ProjectConfig &projectConfig)
Generate all replacement data for project generation.
bool simple_project_generator(const PPath &descriptionFile, const PVecPath &vecClassConfigFile, const PString &projectType, const GeneratorMode &mode)
Create a simple project from a configuration.
PString generateMaintainer(const ProjectConfig &projectConfig)
Generate maintainer information for codemeta.json.
PString generateTargetLinkBody(const ProjectConfig &projectConfig)
Generate target_link_libraries command.
PString generateProjectAuthorList(const ProjectConfig &projectConfig)
Generate project author list for codemeta.json.
PString generatePhoenixGlobalDep(const ProjectConfig &projectConfig)
Generate Phoenix global dependencies variable.
PMapString generateReplacementMap(const ProjectConfig &projectConfig, const PString &cmakeFindBody, const PString &phoenixPullExtraModule, const PString &phoenixFindModule, const PString &phoenixGlobalDep, const PString &targetLinkBody, const PString &pixiBody, const PString &markdownDepList, const PString &authorListPixi, const PString &projectAuthorList, const PString &projectContributorList, const PString &maintainer, const PString &keywordsBody, const PString &dateStr)
Generate the replacement map for placeholders.
All the genertor modes.
ProjectType::ProjectType type
Type of the project to be generated.
Configuration of the project.
PString description
Description of the project.
ProjectMembersMap contributorMap
Map of the contributors of the project.
PString name
Name of the project.
PackageMap mapDependencies
Map of all dependencies of the project with structure PPackageAttribute values.
ProjectMembersMap authorMap
Map of authors of the project.
PString runnerTag
Specific runner tag if needed (could be MUST_big_runner)
PString ciToolkitUrl
CI toolkit url.
PString ciToolkitVersion
Version of the Phoenix CI toolkit component (optional, defaults to 3.0.4)
PString url
Project url.
PString version
Project version.
ProjectMembersMap maintainerMap
Map of maintainers of the project.
std::vector< PString > keywordList
List of keywords linked to the project.
Set of parameters to generate a project.
PPath outputProjectDir
Output path of the full project.
GeneratorMode mode
Mode to be used to generate the project.
PString version
Version of the project.
PPath outputTestDir
Output path of the unit tests.
PVecDataConfig vecDataConfig
Configuration of classes to be generated.
PString name
Name of the project.
PPath outputSourceDir
Output path of the sources.
bool wrapper_generator_class_full(const PWrapperTraitBackendManager &manager, const ProjectParam &projectParam)
Generate the full sources and related unit tests from configuration.