From 6cf1de87acdb878e3a3e4ef7cc33d45adee4a592 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 9 Apr 2011 23:47:35 +0200 Subject: DEVTOOLS: Renamed 'tools' directory to 'devtools' --- devtools/create_project/visualstudio.cpp | 378 +++++++++++++++++++++++++++++++ 1 file changed, 378 insertions(+) create mode 100644 devtools/create_project/visualstudio.cpp (limited to 'devtools/create_project/visualstudio.cpp') diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp new file mode 100644 index 0000000000..2b7c8908cb --- /dev/null +++ b/devtools/create_project/visualstudio.cpp @@ -0,0 +1,378 @@ +/* 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_CONFIGURATION_SCUMMVM(config, platform, props) { \ + project << "\t\t\n" \ + "\t\t\t\n" \ + "\t\t\t\n" \ + "\t\t\n"; \ +} + +#define OUTPUT_CONFIGURATION_SCUMMVM_DEBUG(config, platform, props, isWin32) { \ + project << "\t\t\n" \ + "\t\t\t\n" \ + "\t\t\t\n"; \ + if (setup.runBuildEvents) { \ + project << "\t\t\t\n" \ + "\t\t\t\n"; \ + } \ + 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", ""); + + // 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", true); + OUTPUT_CONFIGURATION_SCUMMVM_DEBUG("Analysis", "x64", "64", true); + OUTPUT_CONFIGURATION_SCUMMVM("Release", "x64", "64"); + + } 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) { + 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; + } + + 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 -- cgit v1.2.3