PhoenixGenerator  2.2.0
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
30
31//Nanobind Trait Backend
33#include "NanobindTraitMethod.h"
40
41//C++ Generator
42#include "generator_class_cpp.h"
43//Wrapper Generator
45//Nanobind Generator
46#include "nanobind_generator.h"
47
49
51
54bool isPhoenixDependency(const PString & packageName){
55 return (packageName.isSameBegining("Phoenix") || packageName.isSameBegining("phoenix"));
56}
57
59
62PString generateCmakeFindBody(const ProjectConfig & projectConfig){
63 PString cmakeFindBody;
64 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
65 const PPackageAttribute & pkgAttr = depIt->second;
66 if(!isPhoenixDependency(pkgAttr.getName())){
67 if(!pkgAttr.getCmakeFind().empty()){
68 cmakeFindBody += "find_package("+pkgAttr.getCmakeFind()+")";
69 }
70 }
71 }
72 return cmakeFindBody;
73}
74
76
79PString generatePhoenixPullExtraModule(const ProjectConfig & projectConfig){
80 PString phoenixPullExtraModule;
81 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
82 const PPackageAttribute & pkgAttr = depIt->second;
83 if(isPhoenixDependency(pkgAttr.getName())){
84 phoenixPullExtraModule += "pull_extra_module(\""+pkgAttr.getName()+"\" \""+pkgAttr.getUrl()+"\")\n";
85 }
86 }
87 return phoenixPullExtraModule;
88}
89
91
94PString generatePhoenixFindModule(const ProjectConfig & projectConfig){
95 PString phoenixFindModule;
96 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
97 const PPackageAttribute & pkgAttr = depIt->second;
98 if(isPhoenixDependency(pkgAttr.getName())){
99 phoenixFindModule += " "+pkgAttr.getName();
100 }
101 }
102 return phoenixFindModule;
103}
104
106
109PString generatePhoenixGlobalDep(const ProjectConfig & projectConfig){
110 PString phoenixGlobalDep;
111 phoenixGlobalDep += "set(" + projectConfig.name.toUpper() + "_TEST_DEPENDENCIES\n";
112 phoenixGlobalDep += "\t" + projectConfig.name.toSnakeCase() + "\n";
113 for(PackageMap::const_reverse_iterator depIt = projectConfig.mapDependencies.rbegin(); depIt != projectConfig.mapDependencies.rend(); ++depIt){
114 const PPackageAttribute & pkgAttr = depIt->second;
115 if(isPhoenixDependency(pkgAttr.getName())){
116 phoenixGlobalDep += "\t"+pkgAttr.getCmakeLib()+"\n";
117 }
118 }
119 phoenixGlobalDep += ")";
120 return phoenixGlobalDep;
121}
122
124
127PString generateTargetLinkBody(const ProjectConfig & projectConfig){
128 PString targetLinkBody;
129 targetLinkBody += "target_link_libraries("+projectConfig.name.toSnakeCase()+" ";
130 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
131 const PPackageAttribute & pkgAttr = depIt->second;
132 if(!isPhoenixDependency(pkgAttr.getName())){
133 targetLinkBody += pkgAttr.getCmakeLib()+" ";
134 }
135 }
136 // Add Phoenix dependencies (to ensure proper linking even if phoenix_create_find should handle it)
137 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
138 const PPackageAttribute & pkgAttr = depIt->second;
139 if(isPhoenixDependency(pkgAttr.getName())){
140 targetLinkBody += pkgAttr.getCmakeLib()+" ";
141 }
142 }
143 targetLinkBody += ")\n";
144 return targetLinkBody;
145}
146
148
151PString generatePixiBody(const ProjectConfig & projectConfig){
152 PString pixiBody;
153 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
154 const PPackageAttribute & pkgAttr = depIt->second;
155 PString pixi_name = pkgAttr.getPixiName().toLower();
156 PString min_version = pkgAttr.getMinVersion();
157 PString max_version = pkgAttr.getMaxVersion();
158 if(pixi_name == "") continue;
159 else if(min_version.empty() && max_version.empty()){
160 pixiBody += pixi_name + " = \"*\"\n";
161 }else if(max_version.empty()){
162 pixiBody += pixi_name + " = \"" + min_version + "\"\n";
163 }else{
164 pixiBody += pixi_name + " = \"" + min_version;
165 if(!min_version.empty() && !max_version.empty()) pixiBody += ",";
166 pixiBody += max_version + "\"\n";
167 }
168 }
169 return pixiBody;
170}
171
173
176PString generateMarkdownDepList(const ProjectConfig & projectConfig){
177 PString packageMdList;
178 for(PackageMap::const_iterator depIt = projectConfig.mapDependencies.begin(); depIt != projectConfig.mapDependencies.end(); ++depIt){
179 const PPackageAttribute & pkgAttr = depIt->second;
180 if(isPhoenixDependency(pkgAttr.getName())){
181 packageMdList += "- ["+pkgAttr.getName()+"]("+pkgAttr.getUrl()+")\n";
182 }
183 }
184 return packageMdList;
185}
186
188
191PString generateAuthorListPixi(const ProjectConfig & projectConfig){
192 PString authorListPixi;
193 authorListPixi += "authors = [\n";
194 for(ProjectMembersMap::const_iterator it = projectConfig.authorMap.begin(); it != projectConfig.authorMap.end(); ++it){
195 const PProjectMembers & author = it->second;
196 authorListPixi += " \"" + author.getFirstName() + " " + author.getLastName() + " <" + author.getEmail() + ">\",\n";
197 }
198 authorListPixi += "]\n";
199 return authorListPixi;
200}
201
203
206PString generateProjectAuthorList(const ProjectConfig & projectConfig){
207 PString projectAuthorList;
208 bool firstAuthor = true;
209 for(ProjectMembersMap::const_iterator it = projectConfig.authorMap.begin(); it != projectConfig.authorMap.end(); ++it){
210 const PProjectMembers & author = it->second;
211 if(!firstAuthor) projectAuthorList += ",\n";
212 projectAuthorList += " {\n";
213 projectAuthorList += " \"@type\": \"Person\",\n";
214 projectAuthorList += " \"givenName\": \"" + author.getFirstName() + "\",\n";
215 projectAuthorList += " \"familyName\": \"" + author.getLastName() + "\",\n";
216 projectAuthorList += " \"email\": \"" + author.getEmail() + "\",\n";
217 projectAuthorList += " \"affiliation\": {\n";
218 projectAuthorList += " \"@type\": \"Organization\",\n";
219 projectAuthorList += " \"name\": \"" + author.getAffiliation() + "\"\n";
220 projectAuthorList += " }\n";
221 projectAuthorList += " }";
222 firstAuthor = false;
223 }
224 return projectAuthorList;
225}
226
228
231PString generateProjectContributorList(const ProjectConfig & projectConfig){
232 PString projectContributorList;
233 bool firstContributor = true;
234 for(ProjectMembersMap::const_iterator it = projectConfig.contributorMap.begin(); it != projectConfig.contributorMap.end(); ++it){
235 const PProjectMembers & contributor = it->second;
236 if(!firstContributor) projectContributorList += ",\n";
237 projectContributorList += " {\n";
238 projectContributorList += " \"@type\": \"Person\",\n";
239 projectContributorList += " \"givenName\": \"" + contributor.getFirstName() + "\",\n";
240 projectContributorList += " \"familyName\": \"" + contributor.getLastName() + "\",\n";
241 projectContributorList += " \"email\": \"" + contributor.getEmail() + "\",\n";
242 projectContributorList += " \"affiliation\": {\n";
243 projectContributorList += " \"@type\": \"Organization\",\n";
244 projectContributorList += " \"name\": \"" + contributor.getAffiliation() + "\"\n";
245 projectContributorList += " }\n";
246 projectContributorList += " }";
247 firstContributor = false;
248 }
249 return projectContributorList;
250}
251
253
256PString generateMaintainer(const ProjectConfig & projectConfig){
257 PString maintainer;
258 const PProjectMembers & maintainerPerson = projectConfig.maintainerMap.begin()->second;
259 maintainer += " \"@type\": \"Person\",\n";
260 maintainer += " \"givenName\": \"" + maintainerPerson.getFirstName() + "\",\n";
261 maintainer += " \"familyName\": \"" + maintainerPerson.getLastName() + "\",\n";
262 maintainer += " \"email\": \"" + maintainerPerson.getEmail() + "\",\n";
263 maintainer += " \"affiliation\": {\n";
264 maintainer += " \"@type\": \"Organization\",\n";
265 maintainer += " \"name\": \"" + maintainerPerson.getAffiliation() + "\"\n";
266 maintainer += " }";
267 return maintainer;
268}
269
271
274PString generateKeywordsBody(const ProjectConfig & projectConfig){
275 PString keywordsBody;
276 if(!projectConfig.keywordList.empty()){
277 bool firstKeyword = true;
278 for(std::vector<PString>::const_iterator it = projectConfig.keywordList.begin(); it != projectConfig.keywordList.end(); ++it){
279 if(!firstKeyword) keywordsBody += ",\n";
280 keywordsBody += " \"" + *it + "\"";
281 firstKeyword = false;
282 }
283 }
284 return keywordsBody;
285}
286
288
293PString generateNanobindCmakeSources(const ProjectConfig & projectConfig, const PVecPath & vecClassConfigFile, const GeneratorMode & mode){
294 PString nanobindSources;
295 nanobindSources += "# We are now ready to compile the actual extension module\n";
296
297 for(const PPath & classConfigFile : vecClassConfigFile){
298 PPath baseFileName = classConfigFile.getFileName().eraseExtension();
299 PString bindingSource = baseFileName + "_binding.cpp";
300 PString fileModuleName = baseFileName.toLower() + "_module";
301
302 nanobindSources += "nanobind_add_module(\n";
303 nanobindSources += "\t" + fileModuleName + " # Name of the module\n";
304 nanobindSources += "\tSTABLE_ABI # Compatible Python 3.12+ stable ABI\n";
305 nanobindSources += "\tNB_STATIC # Static linking\n";
306 nanobindSources += "\tLTO # Link-time optimization\n";
307 nanobindSources += "\t" + bindingSource + " # Source file\n";
308 nanobindSources += ")\n";
309 nanobindSources += "target_link_libraries(" + fileModuleName + " PRIVATE " + projectConfig.name.toSnakeCase() + ")\n";
310 nanobindSources += "install(TARGETS " + fileModuleName + " LIBRARY DESTINATION ${LIBRARY_DIRECTORY} ARCHIVE DESTINATION ${LIBRARY_DIRECTORY})\n\n";
311 }
312
313 return nanobindSources;
314}
315
317
334PMapString generateReplacementMap(const ProjectConfig & projectConfig, const GeneratorMode & mode, const PString & cmakeFindBody, const PString & phoenixPullExtraModule,
335 const PString & phoenixFindModule, const PString & phoenixGlobalDep, const PString & targetLinkBody,
336 const PString & pixiBody, const PString & markdownDepList, const PString & authorListPixi,
337 const PString & projectAuthorList, const PString & projectContributorList, const PString & maintainer,
338 const PString & keywordsBody, const PString & dateStr, const PString & nanobindCMakeSources)
339{
340 PMapString mapReplace;
342 mapReplace["xxxnanobind_sourcesxxx"] = nanobindCMakeSources; //nanobind cmake sources
343 }
344 mapReplace["XXXProjectNameXXX"] = projectConfig.name; //project name
345 mapReplace["XXXPROJECT_NAMEXXX"] = projectConfig.name.toUpper(); //project name uppercase
346 mapReplace["xxxproject_namexxx"] = projectConfig.name.toSnakeCase(); //project library
347 mapReplace["XXXProjectNameDescriptionXXX"] = projectConfig.description; //description
348 mapReplace["XXXProjectNameUrlXXX"] = projectConfig.url; //project url
349 mapReplace["XXXProjectVersionXXX"] = projectConfig.version; //project version
350 mapReplace["XXXProjectNameHomepageUrlXXX"] = projectConfig.url; //project doc url (TODO add it or deduce it from the project url for gitlab)
351 mapReplace["XXXProjectNameRunnerTagXXX"] = projectConfig.runnerTag; //Project CI runner tag
352 mapReplace["XXXProjectFindPackageDependenciesXXX"] = cmakeFindBody; //project find_package
353 mapReplace["XXXProjectPhoenixDependenciesXXX"] = phoenixPullExtraModule; //project pull_extra_module
354 mapReplace["XXXProjectNameCMakeFindDependenciesXXX"] = phoenixFindModule; //project dependencies of phoenix_create_find
355 mapReplace["XXXProjectDependenciesCMakeVarXXX"] = phoenixGlobalDep; //cmake variable to hold test dependencies
356 mapReplace["XXXProjectNameTargetLinkLinDependenciesXXX"] = targetLinkBody; //full target_link_library command of generated lib
357 mapReplace["XXXCxxWorkflowUrlXXX"] = projectConfig.ciToolkitUrl+"@"+projectConfig.ciToolkitVersion; //Url and version of the CI workflow
358 mapReplace["xxxphoenixprojectpixipackagenamexxx"] = projectConfig.name.toLower(); //name of the pixi package
359 mapReplace["xxxprojectnamepixiextradependenciesxxx"] = pixiBody; //extra pixi dependencies
360 mapReplace["XXXProjectNameMarkdownListDependenciesXXX"] = markdownDepList; //markdown list of Phoenix dependencies
361 mapReplace["XXXcreationDateXXX"] = dateStr; //creation date
362 mapReplace["XXXProjectAuthorListPixiXXX"] = authorListPixi; //author list for pixi.toml
363 mapReplace["XXXAuthorListXXX"] = projectAuthorList; //author list for codemeta.json
364 mapReplace["XXXContributorListXXX"] = projectContributorList; //contributor list for codemeta.json
365 mapReplace["XXXMaintainerXXX"] = maintainer; //maintainer for codemeta.json
366 mapReplace["XXXKeywordListsXXX"] = keywordsBody; //keyword list for codemeta.json
367 return mapReplace;
368}
369
371
374PMapString generateAllReplacementData(const ProjectConfig & projectConfig, const GeneratorMode & mode, const PVecPath & vecClassConfigFile){
375 // Generate various bodies using dedicated functions
376 PString cmakeFindBody = generateCmakeFindBody(projectConfig);
377 PString phoenixPullExtraModule = generatePhoenixPullExtraModule(projectConfig);
378 PString phoenixFindModule = generatePhoenixFindModule(projectConfig);
379 PString phoenixGlobalDep = generatePhoenixGlobalDep(projectConfig);
380 PString targetLinkBody = generateTargetLinkBody(projectConfig);
381 PString pixiBody = generatePixiBody(projectConfig);
382 PString markdownDepList = generateMarkdownDepList(projectConfig);
383 PString authorListPixi = generateAuthorListPixi(projectConfig);
384 PString projectAuthorList = generateProjectAuthorList(projectConfig);
385 PString projectContributorList = generateProjectContributorList(projectConfig);
386 PString maintainer = generateMaintainer(projectConfig);
387 PString keywordsBody = generateKeywordsBody(projectConfig);
388 PString nanobindCMakeSources;
390 nanobindCMakeSources = generateNanobindCmakeSources(projectConfig, vecClassConfigFile, mode);
391 }
392
393 time_t timestamp;
394 PString dateStr = ctime(&(timestamp = time(nullptr)));
395 dateStr = dateStr.eraseLastChar("\n"); // Remove the trailing \n
396
397 // Generate the replacement map
398 return generateReplacementMap(projectConfig, mode, cmakeFindBody, phoenixPullExtraModule,
399 phoenixFindModule, phoenixGlobalDep, targetLinkBody,
400 pixiBody, markdownDepList, authorListPixi, projectAuthorList,
401 projectContributorList, maintainer, keywordsBody, dateStr, nanobindCMakeSources);
402}
403
405
410bool simple_project_load_config(ProjectParam & param, const PPath & pdataDir, const PVecPath & vecClassConfigFile){
411 bool b(true);
412 for(const PPath & classConfigFile : vecClassConfigFile){
413 PDataConfig dataConfig;
414 dataConfig.getFileName() = classConfigFile;
415 if(!parserClassConfig(dataConfig.getVecClassConfig(), dataConfig.getVecInclude(), classConfigFile)){
416 std::cerr << "simple_project_load_config : can't load file '" << classConfigFile << "'" << std::endl;
417 b = false; //Best effort strategy
418 }
419 param.vecDataConfig.push_back(dataConfig);
420
421 PPath destFile = pdataDir / classConfigFile.getFileName();
422 PString fileContent = classConfigFile.loadFileContent();
423 if(!destFile.saveFileContent(fileContent)){
424 std::cerr << "simple_project_load_config : cannot copy pdata file to project pdata directory '"<<destFile<<"'" << std::endl;
425 b = false; //Best effort strategy
426 }
427 }
428 return b;
429}
430
432
435bool generateCppClassesFull(const ProjectParam & projectParam){
436 PTraitBackendManager manager;
438 manager.addTraitBackend<CppTraitCopy>();
445 return generator_class_full(manager, projectParam);
446}
447
449
459
461
475
477
481 switch(projectParam.mode.type){
482 case ProjectType::CPP:
483 return generateCppClassesFull(projectParam);
485 return generateWrapperClassesFull(projectParam);
487 return generateCppClassesFull(projectParam) && generateNanobindClassesFull(projectParam);
488 default:
489 return false;
490 }
491}
492
494
500bool simple_project_generator(const PPath & descriptionFile, const PVecPath & vecClassConfigFile, const PString & projectType,
501 const GeneratorMode & mode)
502{
503 //First, let's read the toml config of the project
504 ProjectConfig projectConfig;
505 if(!project_generator_loadConfig(projectConfig, descriptionFile)){
506 std::cerr << "simple_project_generator : cannot parse project description file '"<<descriptionFile<<"'" << std::endl;
507 return false;
508 }
509 //Then look in the config files if the packages exists
510 if(!project_generator_loadPackageInfo(projectConfig)){
511 std::cerr << "simple_project_generator : cannot find package info of project '"<<projectConfig.name<<"'" << std::endl;
512 return false;
513 }
514 // Generate replacement data
515 PMapString mapReplace = generateAllReplacementData(projectConfig, mode, vecClassConfigFile);
516 PPath inputConfigPlaceholderDir = PPath(SYSTEM_INSTALL_DIR) / PPath("share") / PPath("PhoenixGenerator") / PPath("Projects") / PPath(projectType), outputPath("./");
517 if(!directory_replace_placeholder(outputPath, inputConfigPlaceholderDir, mapReplace)){
518 std::cerr << "simple_project_generator : cannot replace placeholder in project generation '"<<projectConfig.name<<"'" << std::endl;
519 return false;
520 }
521 PPath mainPath = PPath(".") / PPath(projectConfig.name);
522 PPath srcPath = mainPath / PPath("src"), pdataDir = mainPath / PPath("pdata");
523 if(!pdataDir.createDirectory()){
524 std::cerr << "simple_project_generator : cannot create pdata directory '"<<pdataDir<<"'" << std::endl;
525 return false;
526 }
527 ProjectParam param;
528 param.mode = mode;
529 param.name = projectConfig.name;
530 param.version = projectConfig.version;
531 param.outputProjectDir = mainPath;
532 param.outputSourceDir = srcPath;
534 param.outputTestDir = mainPath / PPath("TESTS");
535 }else if(param.mode.type == ProjectType::WRAPPER){
536 param.outputTestDir = mainPath / PPath("tests");
537 }
538
539 if(!simple_project_load_config(param, pdataDir, vecClassConfigFile)){
540 std::cerr << "simple_project_generator : cannot load config to generate project in '"<<srcPath<<"'" << std::endl;
541 return false;
542 }
544 std::cerr << "simple_project_generator : cannot generate sources in '"<<srcPath<<"'" << std::endl;
545 return false;
546 }
547 // Generate class generator script
548 if(!generateClassGeneratorScript(vecClassConfigFile, pdataDir, param.mode)){
549 std::cerr << "simple_project_generator : cannot generate class generator script in pdata directory '"<<pdataDir<<"'" << std::endl;
550 return false;
551 }
552 return true;
553}
554
555
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 generator for Nanobind property trait.
Class generator for Nanobind property trait.
Class generator for Nanobind property trait.
Class generator for Nanobind property trait.
Class generator for Nanobind property trait.
Class generator for Nanobind property trait.
Class generator for Nanobind property 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.
Manager of the Trait backends.
void addTraitBackend()
Add a trait backend into the PTraitBackendManager.
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 generator_nanobind_full(const PNanobindTraitBackendManager &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.
PMapString generateAllReplacementData(const ProjectConfig &projectConfig, const GeneratorMode &mode, const PVecPath &vecClassConfigFile)
Generate all replacement data for project generation.
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.
bool generateNanobindClassesFull(const ProjectParam &projectParam)
Generate nanobind wrapper classes.
PString generateKeywordsBody(const ProjectConfig &projectConfig)
Generate keywords list for codemeta.json.
PString generateNanobindCmakeSources(const ProjectConfig &projectConfig, const PVecPath &vecClassConfigFile, const GeneratorMode &mode)
Generate the nanobind cmake sources list.
bool generateCppClassesFull(const ProjectParam &projectParam)
Generate C++ classes with all standard traits.
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.
bool generateWrapperClassesFull(const ProjectParam &projectParam)
Generate wrapper classes.
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.
PMapString generateReplacementMap(const ProjectConfig &projectConfig, const GeneratorMode &mode, 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, const PString &nanobindCMakeSources)
Generate the replacement map for placeholders.
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.
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.