27 void scanDir(
const string& folder, vector<string>& sourceFiles, vector<string>& mainSourceFiles) {
30 virtual ~SourceFilesFilter() {}
32 bool accept(
const string& pathName,
const string& fileName)
override {
33 if (fileName ==
".")
return false;
34 if (fileName ==
"..")
return false;
35 if (FileSystem::getInstance()->isPath(pathName +
"/" + fileName) ==
true)
return true;
37 if (StringTools::endsWith(StringTools::toLowerCase(fileName),
".incl.cpp") ==
true)
return false;
38 if (StringTools::endsWith(StringTools::toLowerCase(fileName),
".include.cpp") ==
true)
return false;
40 if (StringTools::endsWith(StringTools::toLowerCase(fileName),
".cpp") ==
true)
return true;
45 SourceFilesFilter sourceFilesFilter;
48 FileSystem::getInstance()->list(folder, files, &sourceFilesFilter);
50 for (
const auto& fileName: files) {
51 if (StringTools::endsWith(fileName,
"-main.cpp") ==
true) {
52 mainSourceFiles.push_back(folder +
"/" + fileName);
54 if (StringTools::endsWith(fileName,
".cpp") ==
true) {
55 sourceFiles.push_back(folder +
"/" + fileName);
57 scanDir(folder +
"/" + fileName, sourceFiles, mainSourceFiles);
62 int main(
int argc,
char** argv)
64 Console::println(
string(
"nmakefilegenerator ") + Version::getVersion());
65 Console::println(Version::getCopyright());
69 Console::println(
"Usage: nmakefilegenerator path_to_source");
70 Application::exit(Application::EXITCODE_FAILURE);
73 auto pathToSource = string(argv[1]);
76 Console::println(
"Scanning source files");
77 vector<string> sourceFiles;
78 vector<string> mainSourceFiles;
79 scanDir(pathToSource, sourceFiles, mainSourceFiles);
82 string sourceFilesVariable =
"\\\n";
83 for (
const auto& file: sourceFiles) sourceFilesVariable+=
"\t" + file +
"\\\n";
84 sourceFilesVariable+=
"\n";
88 for (
const auto& file: mainSourceFiles) {
89 if (mainTargets.empty() ==
false) mainTargets+=
" ";
90 mainTargets+= StringTools::substring(file, file.rfind(
'/') + 1, file.find(
"-main.cpp"));
93 Console::println(
"Generating Makefile");
96 auto executableFolder = StringTools::replace(argv[0],
"\\",
"/");
97 auto tdme2Folder = StringTools::substring(executableFolder, 0, StringTools::toLowerCase(executableFolder).rfind(
"/tdme2/") +
string(
"/tdme2/").length());
100 auto makefileSource = FileSystem::getInstance()->getContentAsString(tdme2Folder +
"/resources/engine/templates/makefiles",
"Makefile.nmake");
101 auto makefileMainSourceTemplate = FileSystem::getInstance()->getContentAsString(tdme2Folder +
"/resources/engine/templates/makefiles",
"Makefile.nmake.main");
102 makefileSource = StringTools::replace(makefileSource,
"{$source-files}", sourceFilesVariable);
103 makefileSource = StringTools::replace(makefileSource,
"{$main-targets}", mainTargets);
104 makefileSource+=
"\n";
107 for (
const auto& file: mainSourceFiles) {
108 auto makefileMainSource = makefileMainSourceTemplate;
109 auto mainTarget = StringTools::substring(file, file.rfind(
'/') + 1, file.find(
"-main.cpp"));
110 auto mainTargetSource = file;
111 auto mainTargetExecutable = mainTarget +
".exe";
112 makefileMainSource = StringTools::replace(makefileMainSource,
"{$main-target}", mainTarget);
113 makefileMainSource = StringTools::replace(makefileMainSource,
"{$main-target-source}", mainTargetSource);
114 makefileMainSource = StringTools::replace(makefileMainSource,
"{$main-target-executable}", mainTargetExecutable);
115 makefileSource+= makefileMainSource +
"\n";
119 FileSystem::getInstance()->setContentFromString(
".",
"Makefile.nmake", makefileSource);
121 Console::println(
"An error occurred: " +
string(exception.what()));
125 Application::exit(Application::EXITCODE_SUCCESS);
Application base class, please make sure to allocate application on heap to have correct application ...
File system singleton class.
std::exception Exception
Exception base class.
int main(int argc, char **argv)
void scanDir(const string &folder, vector< string > &sourceFiles, vector< string > &mainSourceFiles)
File system file name filter interface.
virtual bool accept(const string &path, const string &file)=0
Accept a file.