/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * $URL$ * $Id$ * */ #include "visualstudio.h" #include #include namespace CreateProjectTool { ////////////////////////////////////////////////////////////////////////// // Visual Studio Provider (Visual Studio 2005 & 2008) ////////////////////////////////////////////////////////////////////////// VisualStudioProvider::VisualStudioProvider(StringList &global_warnings, std::map &project_warnings, const int version) : MSVCProvider(global_warnings, project_warnings, version) { } const char *VisualStudioProvider::getProjectExtension() { return ".vcproj"; } const char *VisualStudioProvider::getPropertiesExtension() { return ".vsprops"; } int VisualStudioProvider::getVisualStudioVersion() { if (_version == 9) return 2008; if (_version == 8) return 2005; error("Unsupported version passed to createScummVMSolution"); } #define OUTPUT_BUILD_EVENTS(isWin32) \ if (setup.runBuildEvents) { \ project << "\t\t\t\n" \ "\t\t\t\n"; \ } #define OUTPUT_CONFIGURATION_SCUMMVM(config, platform, props, isWin32) { \ project << "\t\t\n" \ "\t\t\t\n" \ "\t\t\t\n"; \ OUTPUT_BUILD_EVENTS(isWin32) \ project << "\t\t\n"; \ } #define OUTPUT_CONFIGURATION_SCUMMVM_DEBUG(config, platform, props, isWin32) { \ project << "\t\t\n" \ "\t\t\t\n" \ "\t\t\t\n"; \ OUTPUT_BUILD_EVENTS(isWin32) \ project << "\t\t\n"; \ } #define OUTPUT_CONFIGURATION(config, platform, props) { \ project << "\t\t\n" \ "\t\t\t\n" \ "\t\t\n"; \ } void VisualStudioProvider::createProjectFile(const std::string &name, const std::string &uuid, const BuildSetup &setup, const std::string &moduleDir, const StringList &includeList, const StringList &excludeList) { const std::string projectFile = setup.outputDir + '/' + name + getProjectExtension(); std::ofstream project(projectFile.c_str()); if (!project) error("Could not open \"" + projectFile + "\" for writing"); project << "\n" "= 9) project << "\tTargetFrameworkVersion=\"131072\"\n"; project << "\t>\n" "\t\n" "\t\t\n" "\t\t\n" "\t\n" "\t\n"; // Check for project-specific warnings: std::map< std::string, std::list >::iterator warningsIterator = _projectWarnings.find(name); if (name == "scummvm") { std::string libraries; for (StringList::const_iterator i = setup.libraries.begin(); i != setup.libraries.end(); ++i) libraries += ' ' + *i + ".lib"; // Win32 OUTPUT_CONFIGURATION_SCUMMVM_DEBUG("Debug", "Win32", "", true); OUTPUT_CONFIGURATION_SCUMMVM_DEBUG("Analysis", "Win32", "", true); OUTPUT_CONFIGURATION_SCUMMVM("Release", "Win32", "", true); // x64 // For 'x64' we must disable NASM support. Usually we would need to disable the "nasm" feature for that and // re-create the library list, BUT since NASM doesn't link any additional libraries, we can just use the // libraries list created for IA-32. If that changes in the future, we need to adjust this part! OUTPUT_CONFIGURATION_SCUMMVM_DEBUG("Debug", "x64", "64", false); OUTPUT_CONFIGURATION_SCUMMVM_DEBUG("Analysis", "x64", "64", false); OUTPUT_CONFIGURATION_SCUMMVM("Release", "x64", "64", false); } else { std::string warnings = ""; if (warningsIterator != _projectWarnings.end()) for (StringList::const_iterator i = warningsIterator->second.begin(); i != warningsIterator->second.end(); ++i) warnings += *i + ';'; std::string toolConfig; toolConfig = (!warnings.empty() ? "DisableSpecificWarnings=\"" + warnings + "\"" : ""); toolConfig += (name == "tinsel" ? "DebugInformationFormat=\"3\" " : ""); toolConfig += (name == "sword25" ? "DisableLanguageExtensions=\"false\" " : ""); // Win32 OUTPUT_CONFIGURATION("Debug", "Win32", ""); OUTPUT_CONFIGURATION("Analysis", "Win32", ""); OUTPUT_CONFIGURATION("Release", "Win32", ""); OUTPUT_CONFIGURATION("Debug", "x64", "64"); OUTPUT_CONFIGURATION("Analysis", "x64", "64"); OUTPUT_CONFIGURATION("Release", "x64", "64"); } project << "\t\n" "\t\n"; std::string modulePath; if (!moduleDir.compare(0, setup.srcDir.size(), setup.srcDir)) { modulePath = moduleDir.substr(setup.srcDir.size()); if (!modulePath.empty() && modulePath.at(0) == '/') modulePath.erase(0, 1); } if (modulePath.size()) addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix + '/' + modulePath); else addFilesToProject(moduleDir, project, includeList, excludeList, setup.filePrefix); project << "\t\n" "\n"; } void VisualStudioProvider::writeReferences(std::ofstream &output) { output << "\tProjectSection(ProjectDependencies) = postProject\n"; for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) { if (i->first == "scummvm") continue; output << "\t\t{" << i->second << "} = {" << i->second << "}\n"; } output << "\tEndProjectSection\n"; } void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) { std::string warnings; for (StringList::const_iterator i = _globalWarnings.begin(); i != _globalWarnings.end(); ++i) warnings += *i + ';'; std::string definesList; for (StringList::const_iterator i = defines.begin(); i != defines.end(); ++i) { if (i != defines.begin()) definesList += ';'; definesList += *i; } // Add define to include revision header if (runBuildEvents) definesList += "SCUMMVM_INTERNAL_REVISION;"; properties << "\n" "\n" "\t\n" "\t\n" "\t\n" "\t\n" "\n"; properties.flush(); } void VisualStudioProvider::createBuildProp(const BuildSetup &setup, bool isRelease, bool isWin32, bool enableAnalysis) { const std::string outputType = (enableAnalysis ? "Analysis" : (isRelease ? "Release" : "Debug")); const std::string outputBitness = (isWin32 ? "32" : "64"); std::ofstream properties((setup.outputDir + '/' + "ScummVM_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension()).c_str()); if (!properties) error("Could not open \"" + setup.outputDir + '/' + "ScummVM_" + outputType + (isWin32 ? "" : "64") + getPropertiesExtension() + "\" for writing"); properties << "\n" "\n" "\t\n" "\t\n" "\t\n" "\n"; properties.flush(); properties.close(); } void VisualStudioProvider::writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix) { const std::string indentString = getIndent(indentation + 2); if (indentation) projectFile << getIndent(indentation + 1) << "\n"; 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 + '/'); } else { if (producesObjectFile(node->name)) { std::string name, ext; splitFilename(node->name, name, ext); const bool isDuplicate = (std::find(duplicate.begin(), duplicate.end(), name + ".o") != duplicate.end()); if (ext == "asm") { std::string objFileName = "$(IntDir)\\"; if (isDuplicate) objFileName += objPrefix; objFileName += "$(InputName).obj"; const std::string toolLine = indentString + "\t\t\n"; // NASM is not supported for x64, thus we do not need to add additional entries here :-). projectFile << indentString << "name) << "\">\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\n"; } else { if (isDuplicate) { const std::string toolLine = indentString + "\t\t\n"; projectFile << indentString << "name) << "\">\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\t\n" << toolLine << indentString << "\t\n" << indentString << "\n"; } else { projectFile << indentString << "name) << "\" />\n"; } } } else { projectFile << indentString << "name) << "\" />\n"; } } } if (indentation) projectFile << getIndent(indentation + 1) << "\n"; } } // End of CreateProjectTool namespace