From e9b3974ff8306d2097f78b61a84ff6a73a0e70ff Mon Sep 17 00:00:00 2001 From: SupSuper Date: Wed, 11 Nov 2020 04:12:36 +0000 Subject: [PATCH] CREATE_PROJECT: Replace duplicate filename check with unique object files --- devtools/create_project/cmake.cpp | 4 +- devtools/create_project/cmake.h | 2 +- devtools/create_project/codeblocks.cpp | 4 +- devtools/create_project/codeblocks.h | 2 +- devtools/create_project/create_project.cpp | 30 +-------------- devtools/create_project/create_project.h | 6 +-- devtools/create_project/msbuild.cpp | 43 ++++++---------------- devtools/create_project/msbuild.h | 4 +- devtools/create_project/visualstudio.cpp | 25 ++++--------- devtools/create_project/visualstudio.h | 2 +- devtools/create_project/xcode.cpp | 4 +- devtools/create_project/xcode.h | 2 +- 12 files changed, 33 insertions(+), 95 deletions(-) diff --git a/devtools/create_project/cmake.cpp b/devtools/create_project/cmake.cpp index 6d106938403..1ff789bb921 100644 --- a/devtools/create_project/cmake.cpp +++ b/devtools/create_project/cmake.cpp @@ -320,14 +320,14 @@ void CMakeProvider::writeDefines(const BuildSetup &setup, std::ofstream &output) } void CMakeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { + const std::string &objPrefix, const std::string &filePrefix) { std::string lastName; for (FileNode::NodeList::const_iterator i = dir.children.begin(); i != dir.children.end(); ++i) { const FileNode *node = *i; if (!node->children.empty()) { - writeFileListToProject(*node, projectFile, indentation + 1, duplicate, objPrefix + node->name + '_', filePrefix + node->name + '/'); + writeFileListToProject(*node, projectFile, indentation + 1, objPrefix + node->name + '_', filePrefix + node->name + '/'); } else { std::string name, ext; splitFilename(node->name, name, ext); diff --git a/devtools/create_project/cmake.h b/devtools/create_project/cmake.h index f4a18b72b1d..d3b43c95660 100644 --- a/devtools/create_project/cmake.h +++ b/devtools/create_project/cmake.h @@ -48,7 +48,7 @@ protected: const StringList &includeList, const StringList &excludeList); void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + const std::string &objPrefix, const std::string &filePrefix); const char *getProjectExtension(); diff --git a/devtools/create_project/codeblocks.cpp b/devtools/create_project/codeblocks.cpp index ff596bf53d6..4d8826ba8eb 100644 --- a/devtools/create_project/codeblocks.cpp +++ b/devtools/create_project/codeblocks.cpp @@ -248,13 +248,13 @@ void CodeBlocksProvider::writeDefines(const StringList &defines, std::ofstream & } void CodeBlocksProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { + const std::string &objPrefix, const std::string &filePrefix) { for (FileNode::NodeList::const_iterator i = dir.children.begin(); i != dir.children.end(); ++i) { const FileNode *node = *i; if (!node->children.empty()) { - writeFileListToProject(*node, projectFile, indentation + 1, duplicate, objPrefix + node->name + '_', filePrefix + node->name + '/'); + writeFileListToProject(*node, projectFile, indentation + 1, objPrefix + node->name + '_', filePrefix + node->name + '/'); } else { std::string name, ext; splitFilename(node->name, name, ext); diff --git a/devtools/create_project/codeblocks.h b/devtools/create_project/codeblocks.h index 5baa21c2425..c720f0a8b09 100644 --- a/devtools/create_project/codeblocks.h +++ b/devtools/create_project/codeblocks.h @@ -43,7 +43,7 @@ protected: const StringList &includeList, const StringList &excludeList); void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + const std::string &objPrefix, const std::string &filePrefix); void writeReferences(const BuildSetup &setup, std::ofstream &output); diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index a916f6d512e..7bd0ea9487d 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -1757,37 +1757,9 @@ std::string ProjectProvider::getLastPathComponent(const std::string &path) { void ProjectProvider::addFilesToProject(const std::string &dir, std::ofstream &projectFile, const StringList &includeList, const StringList &excludeList, const std::string &filePrefix) { - // Check for duplicate object file names - StringList duplicate; - - for (StringList::const_iterator i = includeList.begin(); i != includeList.end(); ++i) { - std::string fileName = getLastPathComponent(*i); - std::transform(fileName.begin(), fileName.end(), fileName.begin(), tolower); - - // Leave out non object file names. - if (fileName.size() < 2 || fileName.compare(fileName.size() - 2, 2, ".o")) - continue; - - // Check whether an duplicate has been found yet - if (std::find(duplicate.begin(), duplicate.end(), fileName) != duplicate.end()) - continue; - - // Search for duplicates - StringList::const_iterator j = i; - ++j; - for (; j != includeList.end(); ++j) { - std::string candidateFileName = getLastPathComponent(*j); - std::transform(candidateFileName.begin(), candidateFileName.end(), candidateFileName.begin(), tolower); - if (fileName == candidateFileName) { - duplicate.push_back(fileName); - break; - } - } - } - FileNode *files = scanFiles(dir, includeList, excludeList); - writeFileListToProject(*files, projectFile, 0, duplicate, std::string(), filePrefix + '/'); + writeFileListToProject(*files, projectFile, 0, std::string(), filePrefix + '/'); delete files; } diff --git a/devtools/create_project/create_project.h b/devtools/create_project/create_project.h index 269e8d0e27c..cfd8146d1d7 100644 --- a/devtools/create_project/create_project.h +++ b/devtools/create_project/create_project.h @@ -521,18 +521,16 @@ protected: /** * Writes file entries for the specified directory node into - * the given project file. It will also take care of duplicate - * object files. + * the given project file. * * @param dir Directory node. * @param projectFile File stream to write to. * @param indentation Indentation level to use. - * @param duplicate List of duplicate object file names. * @param objPrefix Prefix to use for object files, which would name clash. * @param filePrefix Generic prefix to all files of the node. */ virtual void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) = 0; + const std::string &objPrefix, const std::string &filePrefix) = 0; /** * Output a list of project references to the file stream diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index 421a8f6afba..0dc41bf48a3 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -382,6 +382,7 @@ void MSBuildProvider::outputGlobalPropFile(const BuildSetup &setup, std::ofstrea << "\t\t\tDefault\n" << "\t\t\ttrue\n" << "\t\t\ttrue\n" + << "\t\t\t$(IntDir)dists\\msvc\\%(RelativeDir)\n" << "\t\t\t/utf-8 %(AdditionalOptions)\n" << "\t\t\n" << "\t\t\n" @@ -490,7 +491,7 @@ inline void outputNasmCommand(std::ostream &projectFile, const std::string &conf } // End of anonymous namespace -void MSBuildProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int, const StringList &duplicate, +void MSBuildProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int, const std::string &objPrefix, const std::string &filePrefix) { // Reset lists _filters.clear(); @@ -502,31 +503,11 @@ void MSBuildProvider::writeFileListToProject(const FileNode &dir, std::ofstream // Compute the list of files _filters.push_back(""); // init filters - computeFileList(dir, duplicate, objPrefix, filePrefix); + computeFileList(dir, objPrefix, filePrefix); _filters.pop_back(); // remove last empty filter - // Output compile files - if (!_compileFiles.empty()) { - projectFile << "\t\n"; - for (std::list::const_iterator entry = _compileFiles.begin(); entry != _compileFiles.end(); ++entry) { - std::string fileName = (*entry).name + ".o"; - std::transform(fileName.begin(), fileName.end(), fileName.begin(), tolower); - const bool isDuplicate = (std::find(duplicate.begin(), duplicate.end(), fileName) != duplicate.end()); - - // Deal with duplicated file names - if (isDuplicate) { - projectFile << "\t\t\n" - << "\t\t\t$(IntDir)" << (*entry).prefix << "%(Filename).obj\n"; - - projectFile << "\t\t\n"; - } else { - projectFile << "\t\t\n"; - } - } - projectFile << "\t\n"; - } - - // Output include, other and resource files + // Output compile, include, other and resource files + outputFiles(projectFile, _compileFiles, "ClCompile"); outputFiles(projectFile, _includeFiles, "ClInclude"); outputFiles(projectFile, _otherFiles, "None"); outputFiles(projectFile, _resourceFiles, "ResourceCompile"); @@ -536,15 +517,13 @@ void MSBuildProvider::writeFileListToProject(const FileNode &dir, std::ofstream projectFile << "\t\n"; for (std::list::const_iterator entry = _asmFiles.begin(); entry != _asmFiles.end(); ++entry) { - const bool isDuplicate = (std::find(duplicate.begin(), duplicate.end(), (*entry).name + ".o") != duplicate.end()); - projectFile << "\t\t\n" << "\t\t\tDocument\n"; - outputNasmCommand(projectFile, "Debug", (isDuplicate ? (*entry).prefix : "")); - outputNasmCommand(projectFile, "Analysis", (isDuplicate ? (*entry).prefix : "")); - outputNasmCommand(projectFile, "Release", (isDuplicate ? (*entry).prefix : "")); - outputNasmCommand(projectFile, "LLVM", (isDuplicate ? (*entry).prefix : "")); + outputNasmCommand(projectFile, "Debug", (*entry).prefix); + outputNasmCommand(projectFile, "Analysis", (*entry).prefix); + outputNasmCommand(projectFile, "Release", (*entry).prefix); + outputNasmCommand(projectFile, "LLVM", (*entry).prefix); projectFile << "\t\t\n"; } @@ -562,7 +541,7 @@ void MSBuildProvider::outputFiles(std::ostream &projectFile, const FileEntries & } } -void MSBuildProvider::computeFileList(const FileNode &dir, const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { +void MSBuildProvider::computeFileList(const FileNode &dir, const std::string &objPrefix, const std::string &filePrefix) { for (FileNode::NodeList::const_iterator i = dir.children.begin(); i != dir.children.end(); ++i) { const FileNode *node = *i; @@ -571,7 +550,7 @@ void MSBuildProvider::computeFileList(const FileNode &dir, const StringList &dup std::string _currentFilter = _filters.back(); _filters.back().append((_filters.back() == "" ? "" : "\\") + node->name); - computeFileList(*node, duplicate, objPrefix + node->name + '_', filePrefix + node->name + '/'); + computeFileList(*node, objPrefix + node->name + '_', filePrefix + node->name + '/'); // Reset filter _filters.push_back(_currentFilter); diff --git a/devtools/create_project/msbuild.h b/devtools/create_project/msbuild.h index e2c1b46bf8b..6631c64564c 100644 --- a/devtools/create_project/msbuild.h +++ b/devtools/create_project/msbuild.h @@ -38,7 +38,7 @@ protected: void outputProjectSettings(std::ofstream &project, const std::string &name, const BuildSetup &setup, bool isRelease, MSVC_Architecture arch, const std::string &configuration); void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) override; + const std::string &objPrefix, const std::string &filePrefix) override; void writeReferences(const BuildSetup &setup, std::ofstream &output) override; @@ -69,7 +69,7 @@ private: FileEntries _asmFiles; FileEntries _resourceFiles; - void computeFileList(const FileNode &dir, const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + void computeFileList(const FileNode &dir, const std::string &objPrefix, const std::string &filePrefix); void createFiltersFile(const BuildSetup &setup, const std::string &name); void outputFilter(std::ostream &filters, const FileEntries &files, const std::string &action); diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp index 36c086bc91d..369fbb0dd9e 100644 --- a/devtools/create_project/visualstudio.cpp +++ b/devtools/create_project/visualstudio.cpp @@ -226,6 +226,7 @@ void VisualStudioProvider::outputGlobalPropFile(const BuildSetup &setup, std::of properties << "\t\tWarningLevel=\"4\"\n" << "\t\tWarnAsError=\"false\"\n" << "\t\tCompileAs=\"0\"\n" + << "\t\tObjectFile=\"$(IntDir)dists\\msvc\\%(RelativeDir)\"\n" << "\t\t/>\n" << "\tchildren.empty()) { - writeFileListToProject(*node, projectFile, indentation + 1, duplicate, objPrefix + node->name + '_', filePrefix + node->name + '/'); + writeFileListToProject(*node, projectFile, indentation + 1, objPrefix + node->name + '_', filePrefix + node->name + '/'); } else { + std::string filePath = convertPathToWin(filePrefix + node->name); if (producesObjectFile(node->name)) { std::string name, ext; splitFilename(node->name, name, ext); - name += ".o"; - std::transform(name.begin(), name.end(), name.begin(), tolower); - const bool isDuplicate = (std::find(duplicate.begin(), duplicate.end(), name) != duplicate.end()); - std::string filePath = convertPathToWin(filePrefix + node->name); if (ext == "asm") { std::string objFileName = "$(IntDir)\\"; - if (isDuplicate) - objFileName += objPrefix; + objFileName += objPrefix; objFileName += "$(InputName).obj"; const std::string toolLine = indentString + "\t\t\n"; @@ -343,18 +340,10 @@ void VisualStudioProvider::writeFileListToProject(const FileNode &dir, std::ofst // NASM is not supported for x64, thus we do not need to add additional entries here :-). writeFileToProject(projectFile, filePath, ARCH_X86, indentString, toolLine); } else { - if (isDuplicate) { - const std::string toolLine = indentString + "\t\t\n"; - - for (std::list::const_iterator arch = _archs.begin(); arch != _archs.end(); ++arch) { - writeFileToProject(projectFile, filePath, *arch, indentString, toolLine); - } - } else { - projectFile << indentString << "name) << "\" />\n"; - } + projectFile << indentString << "\n"; } } else { - projectFile << indentString << "name) << "\" />\n"; + projectFile << indentString << "\n"; } } } diff --git a/devtools/create_project/visualstudio.h b/devtools/create_project/visualstudio.h index c89097fa0a6..dfb5d0fdb46 100644 --- a/devtools/create_project/visualstudio.h +++ b/devtools/create_project/visualstudio.h @@ -36,7 +36,7 @@ protected: const StringList &includeList, const StringList &excludeList); void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + const std::string &objPrefix, const std::string &filePrefix); void writeFileToProject(std::ofstream &projectFile, const std::string &filePath, MSVC_Architecture arch, const std::string &indentString, const std::string &toolLine); diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index d50fd938214..9f63b00bf13 100644 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -379,7 +379,7 @@ void XcodeProvider::outputMainProjectFile(const BuildSetup &setup) { // Files ////////////////////////////////////////////////////////////////////////// void XcodeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { + const std::string &objPrefix, const std::string &filePrefix) { // Ensure that top-level groups are generated for i.e. engines/ Group *group = touchGroupsForPath(filePrefix); @@ -393,7 +393,7 @@ void XcodeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &p } // Process child nodes if (!node->children.empty()) - writeFileListToProject(*node, projectFile, indentation + 1, duplicate, objPrefix + node->name + '_', filePrefix + node->name + '/'); + writeFileListToProject(*node, projectFile, indentation + 1, objPrefix + node->name + '_', filePrefix + node->name + '/'); } } diff --git a/devtools/create_project/xcode.h b/devtools/create_project/xcode.h index a32e6679377..ba3063c4644 100644 --- a/devtools/create_project/xcode.h +++ b/devtools/create_project/xcode.h @@ -46,7 +46,7 @@ protected: const StringList &includeList, const StringList &excludeList); void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, - const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + const std::string &objPrefix, const std::string &filePrefix); private: enum { kSettingsAsList = 0x01,