diff --git a/devtools/create_project/cmake.cpp b/devtools/create_project/cmake.cpp index 2f5af0c5d7b..dfec5d3614b 100644 --- a/devtools/create_project/cmake.cpp +++ b/devtools/create_project/cmake.cpp @@ -264,7 +264,7 @@ void CMakeProvider::createProjectFile(const std::string &name, const std::string modulePath.erase(0, 1); } - if (modulePath.size()) + if (!modulePath.empty()) addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix + '/' + modulePath); else addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix); diff --git a/devtools/create_project/codeblocks.cpp b/devtools/create_project/codeblocks.cpp index ff6ce90f3a3..06f16f5da80 100644 --- a/devtools/create_project/codeblocks.cpp +++ b/devtools/create_project/codeblocks.cpp @@ -202,7 +202,7 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s modulePath.erase(0, 1); } - if (modulePath.size()) + if (!modulePath.empty()) addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix + '/' + modulePath); else addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix); diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index 6741e173b6c..bdc21ed9642 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -1266,6 +1266,12 @@ void splitFilename(const std::string &fileName, std::string &name, std::string & ext = (dot == std::string::npos) ? std::string() : fileName.substr(dot + 1); } +void splitPath(const std::string &path, std::string &dir, std::string &file) { + const std::string::size_type sep = path.find_last_of('/'); + dir = (sep == std::string::npos) ? path : path.substr(0, sep); + file = (sep == std::string::npos) ? std::string() : path.substr(sep + 1); +} + std::string basename(const std::string &fileName) { const std::string::size_type slash = fileName.find_last_of('/'); if (slash == std::string::npos) @@ -1273,14 +1279,14 @@ std::string basename(const std::string &fileName) { return fileName.substr(slash + 1); } +bool producesObjectExtension(const std::string &ext) { + return (ext == "cpp" || ext == "c" || ext == "asm" || ext == "m" || ext == "mm"); +} + bool producesObjectFile(const std::string &fileName) { std::string n, ext; splitFilename(fileName, n, ext); - - if (ext == "cpp" || ext == "c" || ext == "asm" || ext == "m" || ext == "mm") - return true; - else - return false; + return producesObjectExtension(ext); } std::string toString(int num) { @@ -1293,10 +1299,10 @@ std::string toString(int num) { * Checks whether the give file in the specified directory is present in the given * file list. * - * This function does as special match against the file list. Object files (.o) are - * excluded by default and it will not take file extensions into consideration, - * when the extension of a file in the specified directory is one of "h", "cpp", - * "c" or "asm". + * This function does as special match against the file list. + * By default object files (.o) are excluded, header files (.h) are included, + * and it will not take file extensions into consideration, when the extension + * of a file in the specified directory is one of "m", "cpp", "c" or "asm". * * @param dir Parent directory of the file. * @param fileName File name to match. @@ -1304,6 +1310,9 @@ std::string toString(int num) { * @return "true" when the file is in the list, "false" otherwise. */ bool isInList(const std::string &dir, const std::string &fileName, const StringList &fileList) { + if (fileList.empty()) + return false; + std::string compareName, extensionName; splitFilename(fileName, compareName, extensionName); @@ -1311,28 +1320,34 @@ bool isInList(const std::string &dir, const std::string &fileName, const StringL compareName += '.'; for (StringList::const_iterator i = fileList.begin(); i != fileList.end(); ++i) { - if (i->compare(0, dir.size(), dir)) - continue; // When no comparison name is given, we try to match whether a subset of // the given directory should be included. To do that we must assure that // the first character after the substring, having the same size as dir, must // be a path delimiter. if (compareName.empty()) { + if (i->compare(0, dir.size(), dir)) + continue; if (i->size() >= dir.size() + 1 && i->at(dir.size()) == '/') return true; else continue; } - const std::string lastPathComponent = ProjectProvider::getLastPathComponent(*i); + std::string listDir, listFile; + splitPath(*i, listDir, listFile); + if (dir.compare(0, listDir.size(), listDir)) + continue; + if (extensionName == "o") { return false; - } else if (!producesObjectFile(fileName) && extensionName != "h") { - if (fileName == lastPathComponent) + } else if (extensionName == "h") { + return true; + } else if (!producesObjectExtension(extensionName)) { + if (fileName == listFile) return true; } else { - if (!lastPathComponent.compare(0, compareName.size(), compareName)) + if (!listFile.compare(0, compareName.size(), compareName)) return true; } } @@ -1470,10 +1485,8 @@ FileNode *scanFiles(const std::string &dir, const StringList &includeList, const std::string name, ext; splitFilename(i->name, name, ext); - if (ext != "h") { - if (!isInList(dir, i->name, includeList)) - continue; - } + if (!isInList(dir, i->name, includeList)) + continue; FileNode *child = new FileNode(i->name); assert(child); @@ -1555,7 +1568,7 @@ void ProjectProvider::createProject(BuildSetup &setup) { createModuleList(*i, setup.defines, setup.testDirs, in, ex, true); } - createProjectFile(detProject, detUUID, setup, setup.srcDir, in, ex); + createProjectFile(detProject, detUUID, setup, setup.srcDir + "/engines", in, ex); } if (setup.tests) { diff --git a/devtools/create_project/create_project.h b/devtools/create_project/create_project.h index cfd8146d1d7..4961fe4581d 100644 --- a/devtools/create_project/create_project.h +++ b/devtools/create_project/create_project.h @@ -384,6 +384,17 @@ std::string convertPathToWin(const std::string &path); */ void splitFilename(const std::string &fileName, std::string &name, std::string &ext); +/** + * Splits a full path into directory and filename. + * This assumes the last part is the filename, even if it + * has no extension. + * + * @param path Path to split + * @param name Reference to a string, where to store the directory part. + * @param ext Reference to a string, where to store the filename part. + */ +void splitPath(const std::string &path, std::string &dir, std::string &file); + /** * Returns the basename of a path. * examples: diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index 73b344f9f21..f628bdbf44d 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -153,7 +153,7 @@ void MSBuildProvider::createProjectFile(const std::string &name, const std::stri modulePath.erase(0, 1); } - if (modulePath.size()) + if (!modulePath.empty()) addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix + '/' + modulePath); else addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix); diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp index fc12ebe2ec5..e436ae80849 100644 --- a/devtools/create_project/visualstudio.cpp +++ b/devtools/create_project/visualstudio.cpp @@ -118,7 +118,7 @@ void VisualStudioProvider::createProjectFile(const std::string &name, const std: modulePath.erase(0, 1); } - if (modulePath.size()) + if (!modulePath.empty()) addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix + '/' + modulePath); else addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix); diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index 9f63b00bf13..e34d637ff84 100644 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -329,7 +329,7 @@ void XcodeProvider::createProjectFile(const std::string &, const std::string &, } std::ofstream project; - if (modulePath.size()) + if (!modulePath.empty()) addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix + '/' + modulePath); else addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix);