PhoenixGenerator  2.2.0
Set of tools to generate code
Loading...
Searching...
No Matches
simple_project_generator.cpp File Reference
+ Include dependency graph for simple_project_generator.cpp:

Go to the source code of this file.

Functions

PMapString generateAllReplacementData (const ProjectConfig &projectConfig, const GeneratorMode &mode, const PVecPath &vecClassConfigFile)
 Generate all replacement data for project generation.
 
PString generateAuthorListPixi (const ProjectConfig &projectConfig)
 Generate author list for Pixi.
 
PString generateCmakeFindBody (const ProjectConfig &projectConfig)
 Generate CMake find_package commands for non-Phoenix dependencies.
 
bool generateCppClassesFull (const ProjectParam &projectParam)
 Generate C++ classes with all standard traits.
 
PString generateKeywordsBody (const ProjectConfig &projectConfig)
 Generate keywords list for codemeta.json.
 
PString generateMaintainer (const ProjectConfig &projectConfig)
 Generate maintainer information for codemeta.json.
 
PString generateMarkdownDepList (const ProjectConfig &projectConfig)
 Generate markdown list of Phoenix dependencies.
 
bool generateNanobindClassesFull (const ProjectParam &projectParam)
 Generate nanobind wrapper classes.
 
PString generateNanobindCmakeSources (const ProjectConfig &projectConfig, const PVecPath &vecClassConfigFile, const GeneratorMode &mode)
 Generate the nanobind cmake sources list.
 
PString generatePhoenixFindModule (const ProjectConfig &projectConfig)
 Generate Phoenix find module list.
 
PString generatePhoenixGlobalDep (const ProjectConfig &projectConfig)
 Generate Phoenix global dependencies variable.
 
PString generatePhoenixPullExtraModule (const ProjectConfig &projectConfig)
 Generate Phoenix pull_extra_module commands.
 
PString generatePixiBody (const ProjectConfig &projectConfig)
 Generate Pixi dependencies.
 
PString generateProjectAuthorList (const ProjectConfig &projectConfig)
 Generate project author list for codemeta.json.
 
PString generateProjectContributorList (const ProjectConfig &projectConfig)
 Generate project contributor list 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.
 
bool generateWrapperClassesFull (const ProjectParam &projectParam)
 Generate wrapper classes.
 
bool isPhoenixDependency (const PString &packageName)
 Check if a package is a Phoenix dependency.
 
bool simple_project_generate_source (const ProjectParam &projectParam)
 Save generated sources of project.
 
bool simple_project_generator (const PPath &descriptionFile, const PVecPath &vecClassConfigFile, const PString &projectType, const GeneratorMode &mode)
 Create a simple project from a configuration.
 
bool simple_project_load_config (ProjectParam &param, const PPath &pdataDir, const PVecPath &vecClassConfigFile)
 Load configuration pdata of generated sources.
 

Function Documentation

◆ generateAllReplacementData()

PMapString generateAllReplacementData ( const ProjectConfig & projectConfig,
const GeneratorMode & mode,
const PVecPath & vecClassConfigFile )

Generate all replacement data for project generation.

Parameters
projectConfig: project configuration
Returns
replacement map for placeholders

Definition at line 374 of file simple_project_generator.cpp.

374 {
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}
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.
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.
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.
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.
ProjectType::ProjectType type
Type of the project to be generated.

References generateAuthorListPixi(), generateCmakeFindBody(), generateKeywordsBody(), generateMaintainer(), generateMarkdownDepList(), generateNanobindCmakeSources(), generatePhoenixFindModule(), generatePhoenixGlobalDep(), generatePhoenixPullExtraModule(), generatePixiBody(), generateProjectAuthorList(), generateProjectContributorList(), generateReplacementMap(), generateTargetLinkBody(), ProjectType::NANOBIND_WRAPPER, and GeneratorMode::type.

Referenced by simple_project_generator().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateAuthorListPixi()

PString generateAuthorListPixi ( const ProjectConfig & projectConfig)

Generate author list for Pixi.

Parameters
projectConfig: project configuration
Returns
author list for Pixi

Definition at line 191 of file simple_project_generator.cpp.

191 {
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}
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.
ProjectMembersMap authorMap
Map of authors of the project.

References ProjectConfig::authorMap, PProjectMembers::getEmail(), PProjectMembers::getFirstName(), and PProjectMembers::getLastName().

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateCmakeFindBody()

PString generateCmakeFindBody ( const ProjectConfig & projectConfig)

Generate CMake find_package commands for non-Phoenix dependencies.

Parameters
projectConfig: project configuration
Returns
CMake find_package commands

Definition at line 62 of file simple_project_generator.cpp.

62 {
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}
Describes a package attributes.
const PString & getName() const
Gets the name of the PPackageAttribute.
const PString & getCmakeFind() const
Gets the cmakeFind of the PPackageAttribute.
bool isPhoenixDependency(const PString &packageName)
Check if a package is a Phoenix dependency.
PackageMap mapDependencies
Map of all dependencies of the project with structure PPackageAttribute values.

References PPackageAttribute::getCmakeFind(), PPackageAttribute::getName(), isPhoenixDependency(), and ProjectConfig::mapDependencies.

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateCppClassesFull()

bool generateCppClassesFull ( const ProjectParam & projectParam)

Generate C++ classes with all standard traits.

Parameters
projectParam: ProjectParam to be used
Returns
true on success, false otherwise

Definition at line 435 of file simple_project_generator.cpp.

435 {
436 PTraitBackendManager manager;
438 manager.addTraitBackend<CppTraitCopy>();
445 return generator_class_full(manager, projectParam);
446}
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.
Manager of the Trait backends.
void addTraitBackend()
Add a trait backend into the PTraitBackendManager.
bool generator_class_full(const PTraitBackendManager &manager, const ProjectParam &projectParam)
Generate the full sources and related unit tests from configuration.

References PTraitBackendManager::addTraitBackend(), and generator_class_full().

Referenced by simple_project_generate_source().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateKeywordsBody()

PString generateKeywordsBody ( const ProjectConfig & projectConfig)

Generate keywords list for codemeta.json.

Parameters
projectConfig: project configuration
Returns
keywords list

Definition at line 274 of file simple_project_generator.cpp.

274 {
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}
std::vector< PString > keywordList
List of keywords linked to the project.

References ProjectConfig::keywordList.

Referenced by generateAllReplacementData().

+ Here is the caller graph for this function:

◆ generateMaintainer()

PString generateMaintainer ( const ProjectConfig & projectConfig)

Generate maintainer information for codemeta.json.

Parameters
projectConfig: project configuration
Returns
maintainer information

Definition at line 256 of file simple_project_generator.cpp.

256 {
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}
const PString & getAffiliation() const
Gets the affiliation of the PProjectMembers.
ProjectMembersMap maintainerMap
Map of maintainers of the project.

References PProjectMembers::getAffiliation(), PProjectMembers::getEmail(), PProjectMembers::getFirstName(), PProjectMembers::getLastName(), and ProjectConfig::maintainerMap.

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateMarkdownDepList()

PString generateMarkdownDepList ( const ProjectConfig & projectConfig)

Generate markdown list of Phoenix dependencies.

Parameters
projectConfig: project configuration
Returns
markdown list of Phoenix dependencies

Definition at line 176 of file simple_project_generator.cpp.

176 {
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}
const PString & getUrl() const
Gets the url of the PPackageAttribute.

References PPackageAttribute::getName(), PPackageAttribute::getUrl(), isPhoenixDependency(), and ProjectConfig::mapDependencies.

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateNanobindClassesFull()

bool generateNanobindClassesFull ( const ProjectParam & projectParam)

Generate nanobind wrapper classes.

Parameters
projectParam: ProjectParam to be used
Returns
true on success, false otherwise

Definition at line 464 of file simple_project_generator.cpp.

464 {
473 return generator_nanobind_full(manager, projectParam);
474}
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.
Manager of the Trait backends.
void addTraitBackend()
Add a trait backend into the PTraitBackendManager.
bool generator_nanobind_full(const PNanobindTraitBackendManager &manager, const ProjectParam &projectParam)
Generate the full sources and related unit tests from configuration.

References PNanobindTraitBackendManager::addTraitBackend(), and generator_nanobind_full().

Referenced by simple_project_generate_source().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateNanobindCmakeSources()

PString generateNanobindCmakeSources ( const ProjectConfig & projectConfig,
const PVecPath & vecClassConfigFile,
const GeneratorMode & mode )

Generate the nanobind cmake sources list.

Parameters
projectConfig: project configuration
vecClassConfigFile: vector of class config files
mode: generator mode
Returns
nanobind cmake sources list

Definition at line 293 of file simple_project_generator.cpp.

293 {
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}
PString name
Name of the project.

References ProjectConfig::name.

Referenced by generateAllReplacementData().

+ Here is the caller graph for this function:

◆ generatePhoenixFindModule()

PString generatePhoenixFindModule ( const ProjectConfig & projectConfig)

Generate Phoenix find module list.

Parameters
projectConfig: project configuration
Returns
Phoenix find module list

Definition at line 94 of file simple_project_generator.cpp.

94 {
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}

References PPackageAttribute::getName(), isPhoenixDependency(), and ProjectConfig::mapDependencies.

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generatePhoenixGlobalDep()

PString generatePhoenixGlobalDep ( const ProjectConfig & projectConfig)

Generate Phoenix global dependencies variable.

Parameters
projectConfig: project configuration
Returns
Phoenix global dependencies variable

Definition at line 109 of file simple_project_generator.cpp.

109 {
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}
const PString & getCmakeLib() const
Gets the cmakeLib of the PPackageAttribute.

References PPackageAttribute::getCmakeLib(), PPackageAttribute::getName(), isPhoenixDependency(), ProjectConfig::mapDependencies, and ProjectConfig::name.

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generatePhoenixPullExtraModule()

PString generatePhoenixPullExtraModule ( const ProjectConfig & projectConfig)

Generate Phoenix pull_extra_module commands.

Parameters
projectConfig: project configuration
Returns
Phoenix pull_extra_module commands

Definition at line 79 of file simple_project_generator.cpp.

79 {
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}

References PPackageAttribute::getName(), PPackageAttribute::getUrl(), isPhoenixDependency(), and ProjectConfig::mapDependencies.

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generatePixiBody()

PString generatePixiBody ( const ProjectConfig & projectConfig)

Generate Pixi dependencies.

Parameters
projectConfig: project configuration
Returns
Pixi dependencies

Definition at line 151 of file simple_project_generator.cpp.

151 {
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}
const PString & getMaxVersion() const
Gets the maxVersion of the PPackageAttribute.
const PString & getMinVersion() const
Gets the minVersion of the PPackageAttribute.
const PString & getPixiName() const
Gets the pixiName of the PPackageAttribute.

References PPackageAttribute::getMaxVersion(), PPackageAttribute::getMinVersion(), PPackageAttribute::getPixiName(), and ProjectConfig::mapDependencies.

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateProjectAuthorList()

PString generateProjectAuthorList ( const ProjectConfig & projectConfig)

Generate project author list for codemeta.json.

Parameters
projectConfig: project configuration
Returns
project author list

Definition at line 206 of file simple_project_generator.cpp.

206 {
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}

References ProjectConfig::authorMap, PProjectMembers::getAffiliation(), PProjectMembers::getEmail(), PProjectMembers::getFirstName(), and PProjectMembers::getLastName().

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateProjectContributorList()

PString generateProjectContributorList ( const ProjectConfig & projectConfig)

Generate project contributor list for codemeta.json.

Parameters
projectConfig: project configuration
Returns
project contributor list

Definition at line 231 of file simple_project_generator.cpp.

231 {
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}
ProjectMembersMap contributorMap
Map of the contributors of the project.

References ProjectConfig::contributorMap, PProjectMembers::getAffiliation(), PProjectMembers::getEmail(), PProjectMembers::getFirstName(), and PProjectMembers::getLastName().

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateReplacementMap()

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.

Parameters
projectConfig: project configuration
mode: generator mode
cmakeFindBody: CMake find_package commands
phoenixPullExtraModule: Phoenix pull_extra_module commands
phoenixFindModule: Phoenix find module list
phoenixGlobalDep: Phoenix global dependencies variable
targetLinkBody: target_link_libraries command
pixiBody: Pixi dependencies
authorListPixi: author list for Pixi
projectAuthorList: project author list
projectContributorList: project contributor list
maintainer: maintainer information
keywordsBody: keywords list
dateStr: creation date string
nanobindCMakeSources: nanobind cmake sources list
Returns
replacement map for placeholders

Definition at line 334 of file simple_project_generator.cpp.

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}
PString description
Description 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.

References ProjectConfig::ciToolkitUrl, ProjectConfig::ciToolkitVersion, ProjectConfig::description, ProjectConfig::name, ProjectType::NANOBIND_WRAPPER, ProjectConfig::runnerTag, GeneratorMode::type, ProjectConfig::url, and ProjectConfig::version.

Referenced by generateAllReplacementData().

+ Here is the caller graph for this function:

◆ generateTargetLinkBody()

PString generateTargetLinkBody ( const ProjectConfig & projectConfig)

Generate target_link_libraries command.

Parameters
projectConfig: project configuration
Returns
target_link_libraries command

Definition at line 127 of file simple_project_generator.cpp.

127 {
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}

References PPackageAttribute::getCmakeLib(), PPackageAttribute::getName(), isPhoenixDependency(), ProjectConfig::mapDependencies, and ProjectConfig::name.

Referenced by generateAllReplacementData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateWrapperClassesFull()

bool generateWrapperClassesFull ( const ProjectParam & projectParam)

Generate wrapper classes.

Parameters
projectParam: ProjectParam to be used
Returns
true on success, false otherwise

Definition at line 452 of file simple_project_generator.cpp.

452 {
457 return wrapper_generator_class_full(manager, projectParam);
458}
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 wrapper_generator_class_full(const PWrapperTraitBackendManager &manager, const ProjectParam &projectParam)
Generate the full sources and related unit tests from configuration.

References PWrapperTraitBackendManager::addTraitBackend(), and wrapper_generator_class_full().

Referenced by simple_project_generate_source().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isPhoenixDependency()

bool isPhoenixDependency ( const PString & packageName)

Check if a package is a Phoenix dependency.

Parameters
packageName: name of the package
Returns
true if it's a Phoenix dependency, false otherwise

Definition at line 54 of file simple_project_generator.cpp.

54 {
55 return (packageName.isSameBegining("Phoenix") || packageName.isSameBegining("phoenix"));
56}

Referenced by generateCmakeFindBody(), generateMarkdownDepList(), generatePhoenixFindModule(), generatePhoenixGlobalDep(), generatePhoenixPullExtraModule(), and generateTargetLinkBody().

+ Here is the caller graph for this function:

◆ simple_project_generate_source()

bool simple_project_generate_source ( const ProjectParam & projectParam)

Save generated sources of project.

Parameters
projectParam: ProjectParam to be used
Returns
true on success, false otherwise

Definition at line 480 of file simple_project_generator.cpp.

480 {
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}
bool generateNanobindClassesFull(const ProjectParam &projectParam)
Generate nanobind wrapper classes.
bool generateCppClassesFull(const ProjectParam &projectParam)
Generate C++ classes with all standard traits.
bool generateWrapperClassesFull(const ProjectParam &projectParam)
Generate wrapper classes.
GeneratorMode mode
Mode to be used to generate the project.

References ProjectType::CPP, generateCppClassesFull(), generateNanobindClassesFull(), generateWrapperClassesFull(), ProjectParam::mode, ProjectType::NANOBIND_WRAPPER, GeneratorMode::type, and ProjectType::WRAPPER.

Referenced by simple_project_generator().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ simple_project_generator()

bool simple_project_generator ( const PPath & descriptionFile,
const PVecPath & vecClassConfigFile,
const PString & projectType,
const GeneratorMode & mode )

Create a simple project from a configuration.

Parameters
descriptionFile: description of the full project
vecClassConfigFile: vector of class configuration files (.pdata files)
projectType: type of the project (SimpleCpp)
mode: all modes of the generator (data/check/type/config stream)
Returns
true on success, false otherwise

Definition at line 500 of file simple_project_generator.cpp.

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}
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.
bool simple_project_generate_source(const ProjectParam &projectParam)
Save generated sources of project.
Configuration of the project.
Set of parameters to generate a project.
PPath outputProjectDir
Output path of the full project.
PString version
Version of the project.
PPath outputTestDir
Output path of the unit tests.
PString name
Name of the project.
PPath outputSourceDir
Output path of the sources.

References ProjectType::CPP, generateAllReplacementData(), generateClassGeneratorScript(), ProjectParam::mode, ProjectConfig::name, ProjectParam::name, ProjectType::NANOBIND_WRAPPER, ProjectParam::outputProjectDir, ProjectParam::outputSourceDir, ProjectParam::outputTestDir, project_generator_loadConfig(), project_generator_loadPackageInfo(), simple_project_generate_source(), simple_project_load_config(), GeneratorMode::type, ProjectConfig::version, ProjectParam::version, and ProjectType::WRAPPER.

+ Here is the call graph for this function:

◆ simple_project_load_config()

bool simple_project_load_config ( ProjectParam & param,
const PPath & pdataDir,
const PVecPath & vecClassConfigFile )

Load configuration pdata of generated sources.

Parameters
[out]param: ProjectParam to be updated
pdataDir: directory where to save pdata configuration
vecClassConfigFile: vector of class configuration files (.pdata files)
Returns
true on success, false otherwise

Definition at line 410 of file simple_project_generator.cpp.

410 {
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}
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.
bool parserClassConfig(std::vector< PClassConfig > &listClassConfig, PVecPath &listInclude, const PPath &fileName)
Parser list class config.
PVecDataConfig vecDataConfig
Configuration of classes to be generated.

References PDataConfig::getFileName(), PDataConfig::getVecClassConfig(), PDataConfig::getVecInclude(), parserClassConfig(), and ProjectParam::vecDataConfig.

Referenced by simple_project_generator().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: