void MSBuildProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int, const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { // Reset lists _filters.clear(); _compileFiles.clear(); _includeFiles.clear(); _otherFiles.clear(); _resourceFiles.clear(); _asmFiles.clear(); // Compute the list of files _filters.push_back(""); // init filters computeFileList(dir, duplicate, objPrefix, filePrefix); _filters.pop_back(); // remove last empty filter // Output compile files if (!_compileFiles.empty()) { projectFile << "\t<ItemGroup>\n"; for (std::list<FileEntry>::const_iterator entry = _compileFiles.begin(); entry != _compileFiles.end(); ++entry) { const bool isDuplicate = (std::find(duplicate.begin(), duplicate.end(), (*entry).name + ".o") != duplicate.end()); // Deal with duplicated file names if (isDuplicate) { projectFile << "\t\t<ClCompile Include=\"" << (*entry).path << "\">\n" "\t\t\t<ObjectFileName>$(IntDir)" << (*entry).prefix << "%(Filename).obj</ObjectFileName>\n"; projectFile << "\t\t</ClCompile>\n"; } else { projectFile << "\t\t<ClCompile Include=\"" << (*entry).path << "\" />\n"; } } projectFile << "\t</ItemGroup>\n"; } // Output include, other and resource files outputFiles(projectFile, _includeFiles, "ClInclude"); outputFiles(projectFile, _otherFiles, "None"); outputFiles(projectFile, _resourceFiles, "ResourceCompile"); // Output asm files if (!_asmFiles.empty()) { projectFile << "\t<ItemGroup>\n"; for (std::list<FileEntry>::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<CustomBuild Include=\"" << (*entry).path << "\">\n" "\t\t\t<FileType>Document</FileType>\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 : "")); projectFile << "\t\t</CustomBuild>\n"; } projectFile << "\t</ItemGroup>\n"; } }
void MSBuildProvider::computeFileList(const FileNode &dir, const StringList &duplicate, 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()) { // Update filter std::string _currentFilter = _filters.back(); _filters.back().append((_filters.back() == "" ? "" : "\\") + node->name); computeFileList(*node, duplicate, objPrefix + node->name + '_', filePrefix + node->name + '/'); // Reset filter _filters.push_back(_currentFilter); } else { // Filter files by extension std::string name, ext; splitFilename(node->name, name, ext); FileEntry entry; entry.name = name; entry.path = convertPathToWin(filePrefix + node->name); entry.filter = _filters.back(); entry.prefix = objPrefix; if (ext == "cpp" || ext == "c") _compileFiles.push_back(entry); else if (ext == "h") _includeFiles.push_back(entry); else if (ext == "rc") _resourceFiles.push_back(entry); else if (ext == "asm") _asmFiles.push_back(entry); else _otherFiles.push_back(entry); } } }
void MSBuildProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int, const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { // Reset lists _filters.clear(); _compileFiles.clear(); _includeFiles.clear(); _otherFiles.clear(); _resourceFiles.clear(); _asmFiles.clear(); // Compute the list of files _filters.push_back(""); // init filters computeFileList(dir, duplicate, objPrefix, filePrefix); _filters.pop_back(); // remove last empty filter // Output compile files if (!_compileFiles.empty()) { projectFile << "\t<ItemGroup>\n"; for (std::list<FileEntry>::const_iterator entry = _compileFiles.begin(); entry != _compileFiles.end(); ++entry) { const bool isDuplicate = (std::find(duplicate.begin(), duplicate.end(), (*entry).name + ".o") != duplicate.end()); // Deal with duplicated file names if (isDuplicate) { projectFile << "\t\t<ClCompile Include=\"" << (*entry).path << "\">\n" "\t\t\t<ObjectFileName>$(IntDir)" << (*entry).prefix << "%(Filename).obj</ObjectFileName>\n"; if (hasEnding((*entry).path, "base\\version.cpp")) projectFile << "\t\t\t<PreprocessorDefinitions Condition=\"'$(Configuration)'=='Debug'\">SCUMMVM_SVN_REVISION#" $(SCUMMVM_REVISION_STRING)";%(PreprocessorDefinitions)</PreprocessorDefinitions>\n"; projectFile << "\t\t</ClCompile>\n"; } else { projectFile << "\t\t<ClCompile Include=\"" << (*entry).path << "\" />\n"; } } projectFile << "\t</ItemGroup>\n"; } // Output include, other and resource files OUPUT_FILES_MSBUILD(_includeFiles, "ClInclude") OUPUT_FILES_MSBUILD(_otherFiles, "None") OUPUT_FILES_MSBUILD(_resourceFiles, "ResourceCompile") // Output asm files if (!_asmFiles.empty()) { projectFile << "\t<ItemGroup>\n"; for (std::list<FileEntry>::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<CustomBuild Include=\"" << (*entry).path << "\">\n" "\t\t\t<FileType>Document</FileType>\n"; OUTPUT_NASM_COMMAND_MSBUILD("Debug") OUTPUT_NASM_COMMAND_MSBUILD("Analysis") OUTPUT_NASM_COMMAND_MSBUILD("Release") projectFile << "\t\t</CustomBuild>\n"; } projectFile << "\t</ItemGroup>\n"; } }