diff options
Diffstat (limited to 'tools/create_project')
-rw-r--r-- | tools/create_project/msbuild.cpp | 516 | ||||
-rw-r--r-- | tools/create_project/msbuild.h | 82 | ||||
-rw-r--r-- | tools/create_project/visualstudio.cpp | 377 | ||||
-rw-r--r-- | tools/create_project/visualstudio.h | 57 |
4 files changed, 1032 insertions, 0 deletions
diff --git a/tools/create_project/msbuild.cpp b/tools/create_project/msbuild.cpp new file mode 100644 index 0000000000..1bebc130dc --- /dev/null +++ b/tools/create_project/msbuild.cpp @@ -0,0 +1,516 @@ +/* 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 "msbuild.h" + +#include <fstream> + +#include <algorithm> + +namespace CreateProjectTool { + +////////////////////////////////////////////////////////////////////////// +// MSBuild Provider (Visual Studio 2010) +////////////////////////////////////////////////////////////////////////// + +MSBuildProvider::MSBuildProvider(StringList &global_warnings, std::map<std::string, StringList> &project_warnings, const int version) + : MSVCProvider(global_warnings, project_warnings, version) { + +} + +const char *MSBuildProvider::getProjectExtension() { + return ".vcxproj"; +} + +const char *MSBuildProvider::getPropertiesExtension() { + return ".props"; +} + +int MSBuildProvider::getVisualStudioVersion() { + return 2010; +} + +#define OUTPUT_CONFIGURATION_MSBUILD(config, platform) \ + (project << "\t\t<ProjectConfiguration Include=\"" << config << "|" << platform << "\">\n" \ + "\t\t\t<Configuration>" << config << "</Configuration>\n" \ + "\t\t\t<Platform>" << platform << "</Platform>\n" \ + "\t\t</ProjectConfiguration>\n") + +#define OUTPUT_CONFIGURATION_TYPE_MSBUILD(config) \ + (project << "\t<PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='" << config << "'\" Label=\"Configuration\">\n" \ + "\t\t<ConfigurationType>" << (name == "scummvm" ? "Application" : "StaticLibrary") << "</ConfigurationType>\n" \ + "\t</PropertyGroup>\n") + +#define OUTPUT_PROPERTIES_MSBUILD(config, properties) \ + (project << "\t<ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='" << config << "'\" Label=\"PropertySheets\">\n" \ + "\t\t<Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n" \ + "\t\t<Import Project=\"" << properties << "\" />\n" \ + "\t</ImportGroup>\n") + +void MSBuildProvider::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 << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n" + "\t<ItemGroup Label=\"ProjectConfigurations\">\n"; + + OUTPUT_CONFIGURATION_MSBUILD("Debug", "Win32"); + OUTPUT_CONFIGURATION_MSBUILD("Debug", "x64"); + OUTPUT_CONFIGURATION_MSBUILD("Analysis", "Win32"); + OUTPUT_CONFIGURATION_MSBUILD("Analysis", "x64"); + OUTPUT_CONFIGURATION_MSBUILD("Release", "Win32"); + OUTPUT_CONFIGURATION_MSBUILD("Release", "x64"); + + project << "\t</ItemGroup>\n"; + + // Project name & Guid + project << "\t<PropertyGroup Label=\"Globals\">\n" + "\t\t<ProjectGuid>{" << uuid << "}</ProjectGuid>\n" + "\t\t<RootNamespace>" << name << "</RootNamespace>\n" + "\t\t<Keyword>Win32Proj</Keyword>\n" + "\t</PropertyGroup>\n"; + + // Shared configuration + project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n"; + + OUTPUT_CONFIGURATION_TYPE_MSBUILD("Release|Win32"); + OUTPUT_CONFIGURATION_TYPE_MSBUILD("Analysis|Win32"); + OUTPUT_CONFIGURATION_TYPE_MSBUILD("Debug|Win32"); + OUTPUT_CONFIGURATION_TYPE_MSBUILD("Release|x64"); + OUTPUT_CONFIGURATION_TYPE_MSBUILD("Analysis|x64"); + OUTPUT_CONFIGURATION_TYPE_MSBUILD("Debug|x64"); + + project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n" + "\t<ImportGroup Label=\"ExtensionSettings\">\n" + "\t</ImportGroup>\n"; + + OUTPUT_PROPERTIES_MSBUILD("Release|Win32", "ScummVM_Release.props"); + OUTPUT_PROPERTIES_MSBUILD("Analysis|Win32", "ScummVM_Analysis.props"); + OUTPUT_PROPERTIES_MSBUILD("Debug|Win32", "ScummVM_Debug.props"); + OUTPUT_PROPERTIES_MSBUILD("Release|x64", "ScummVM_Release64.props"); + OUTPUT_PROPERTIES_MSBUILD("Analysis|x64", "ScummVM_Analysis64.props"); + OUTPUT_PROPERTIES_MSBUILD("Debug|x64", "ScummVM_Debug64.props"); + + project << "\t<PropertyGroup Label=\"UserMacros\" />\n"; + + // Project-specific settings (analysis uses debug properties) + outputProjectSettings(project, name, setup, false, true, false); + outputProjectSettings(project, name, setup, false, true, true); + outputProjectSettings(project, name, setup, true, true, false); + outputProjectSettings(project, name, setup, false, false, false); + outputProjectSettings(project, name, setup, false, false, true); + outputProjectSettings(project, name, setup, true, false, false); + + // Files + 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); + + // Output references for scummvm project + if (name == "scummvm") + writeReferences(project); + + project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n" + "\t<ImportGroup Label=\"ExtensionTargets\">\n" + "\t</ImportGroup>\n" + "</Project>\n"; + + // Output filter file if necessary + createFiltersFile(setup, name); +} + +#define OUTPUT_FILTER_MSBUILD(files, action) \ + if (!files.empty()) { \ + filters << "\t<ItemGroup>\n"; \ + for (std::list<FileEntry>::const_iterator entry = files.begin(); entry != files.end(); ++entry) { \ + if ((*entry).filter != "") { \ + filters << "\t\t<" action " Include=\"" << (*entry).path << "\">\n" \ + "\t\t\t<Filter>" << (*entry).filter << "</Filter>\n" \ + "\t\t</" action ">\n"; \ + } else { \ + filters << "\t\t<" action " Include=\"" << (*entry).path << "\" />\n"; \ + } \ + } \ + filters << "\t</ItemGroup>\n"; \ + } + +void MSBuildProvider::createFiltersFile(const BuildSetup &setup, const std::string &name) { + // No filters => no need to create a filter file + if (_filters.empty()) + return; + + // Sort all list alphabetically + _filters.sort(); + _compileFiles.sort(); + _includeFiles.sort(); + _otherFiles.sort(); + _resourceFiles.sort(); + _asmFiles.sort(); + + const std::string filtersFile = setup.outputDir + '/' + name + getProjectExtension() + ".filters"; + std::ofstream filters(filtersFile.c_str()); + if (!filters) + error("Could not open \"" + filtersFile + "\" for writing"); + + filters << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n"; + + // Output the list of filters + filters << "\t<ItemGroup>\n"; + for (std::list<std::string>::iterator filter = _filters.begin(); filter != _filters.end(); ++filter) { + filters << "\t\t<Filter Include=\"" << *filter << "\">\n" + "\t\t\t<UniqueIdentifier>" << createUUID() << "</UniqueIdentifier>\n" + "\t\t</Filter>\n"; + } + filters << "\t</ItemGroup>\n"; + + // Output files + OUTPUT_FILTER_MSBUILD(_compileFiles, "ClCompile") + OUTPUT_FILTER_MSBUILD(_includeFiles, "ClInclude") + OUTPUT_FILTER_MSBUILD(_otherFiles, "None") + OUTPUT_FILTER_MSBUILD(_resourceFiles, "ResourceCompile") + OUTPUT_FILTER_MSBUILD(_asmFiles, "CustomBuild") + + filters << "</Project>"; +} + +void MSBuildProvider::writeReferences(std::ofstream &output) { + output << "\t<ItemGroup>\n"; + + for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) { + if (i->first == "scummvm") + continue; + + output << "\t<ProjectReference Include=\"" << i->first << ".vcxproj\">\n" + "\t\t<Project>{" << i->second << "}</Project>\n" + "\t</ProjectReference>\n"; + } + + output << "\t</ItemGroup>\n"; +} + +void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::string &name, const BuildSetup &setup, bool isRelease, bool isWin32, bool enableAnalysis) { + const std::string configuration = (enableAnalysis ? "Analysis" : (isRelease ? "Release" : "Debug")); + + // Check for project-specific warnings: + std::map<std::string, StringList>::iterator warningsIterator = _projectWarnings.find(name); + + // Nothing to add here, move along! + if (name != "scummvm" && name != "sword25" && name != "tinsel" && warningsIterator == _projectWarnings.end()) + return; + + std::string warnings = ""; + if (warningsIterator != _projectWarnings.end()) + for (StringList::const_iterator i = warningsIterator->second.begin(); i != warningsIterator->second.end(); ++i) + warnings += *i + ';'; + + project << "\t<ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='" << configuration << "|" << (isWin32 ? "Win32" : "x64") << "'\">\n" + "\t\t<ClCompile>\n"; + + // Compile configuration + if (name == "scummvm" || name == "sword25") { + project << "\t\t\t<DisableLanguageExtensions>false</DisableLanguageExtensions>\n"; + } else { + if (name == "tinsel" && !isRelease) + project << "\t\t\t<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n"; + + if (warningsIterator != _projectWarnings.end()) + project << "\t\t\t<DisableSpecificWarnings>" << warnings << ";%(DisableSpecificWarnings)</DisableSpecificWarnings>\n"; + } + + project << "\t\t</ClCompile>\n"; + + // Link configuration for scummvm project + if (name == "scummvm") { + std::string libraries; + + for (StringList::const_iterator i = setup.libraries.begin(); i != setup.libraries.end(); ++i) + libraries += *i + ".lib;"; + + project << "\t\t<Link>\n" + "\t\t\t<OutputFile>$(OutDir)scummvm.exe</OutputFile>\n" + "\t\t\t<AdditionalDependencies>" << libraries << "%(AdditionalDependencies)</AdditionalDependencies>\n" + "\t\t</Link>\n"; + + if (setup.runBuildEvents) { + // Only generate revision number in debug builds + if (!isRelease) { + project << "\t\t<PreBuildEvent>\n" + "\t\t\t<Message>Generate internal_version.h</Message>\n" + "\t\t\t<Command>" << getPreBuildEvent() << "</Command>\n" + "\t\t</PreBuildEvent>\n"; + } + + // Copy data files to the build folder + project << "\t\t<PostBuildEvent>\n" + "\t\t\t<Message>Copy data files to the build folder</Message>\n" + "\t\t\t<Command>" << getPostBuildEvent(isWin32) << "</Command>\n" + "\t\t</PostBuildEvent>\n"; + } + } + + project << "\t</ItemDefinitionGroup>\n"; +} + +void MSBuildProvider::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) + definesList += *i + ';'; + + properties << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n" + "\t<PropertyGroup>\n" + "\t\t<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n" + "\t\t<_PropertySheetDisplayName>ScummVM_Global</_PropertySheetDisplayName>\n" + "\t\t<ExecutablePath>$(SCUMMVM_LIBS)\\bin;$(ExecutablePath)</ExecutablePath>\n" + "\t\t<LibraryPath>$(SCUMMVM_LIBS)\\lib\\" << (bits == 32 ? "x86" : "x64") << ";$(LibraryPath)</LibraryPath>\n" + "\t\t<IncludePath>$(SCUMMVM_LIBS)\\include;$(IncludePath)</IncludePath>\n" + "\t\t<OutDir>$(Configuration)" << bits << "\\</OutDir>\n" + "\t\t<IntDir>$(Configuration)" << bits << "/$(ProjectName)\\</IntDir>\n" + "\t</PropertyGroup>\n" + "\t<ItemDefinitionGroup>\n" + "\t\t<ClCompile>\n" + "\t\t\t<DisableLanguageExtensions>true</DisableLanguageExtensions>\n" + "\t\t\t<DisableSpecificWarnings>" << warnings << ";%(DisableSpecificWarnings)</DisableSpecificWarnings>\n" + "\t\t\t<AdditionalIncludeDirectories>$(SCUMMVM_LIBS)\\include;" << prefix << ";" << prefix << "\\engines;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n" + "\t\t\t<PreprocessorDefinitions>" << definesList << "%(PreprocessorDefinitions)</PreprocessorDefinitions>\n" + "\t\t\t<ExceptionHandling></ExceptionHandling>\n" + "\t\t\t<RuntimeTypeInfo>false</RuntimeTypeInfo>\n" + "\t\t\t<WarningLevel>Level4</WarningLevel>\n" + "\t\t\t<TreatWarningAsError>false</TreatWarningAsError>\n" + "\t\t\t<CompileAs>Default</CompileAs>\n" + "\t\t</ClCompile>\n" + "\t\t<Link>\n" + "\t\t\t<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>\n" + "\t\t\t<SubSystem>Console</SubSystem>\n" + "\t\t\t<EntryPointSymbol>WinMainCRTStartup</EntryPointSymbol>\n" + "\t\t</Link>\n" + "\t\t<ResourceCompile>\n" + "\t\t\t<PreprocessorDefinitions>HAS_INCLUDE_SET;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n" + "\t\t\t<AdditionalIncludeDirectories>" << prefix << ";%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n" + "\t\t</ResourceCompile>\n" + "\t</ItemDefinitionGroup>\n" + "</Project>\n"; + + properties.flush(); +} + +void MSBuildProvider::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 << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n" + "\t<ImportGroup Label=\"PropertySheets\">\n" + "\t\t<Import Project=\"ScummVM_Global" << (isWin32 ? "" : "64") << ".props\" />\n" + "\t</ImportGroup>\n" + "\t<PropertyGroup>\n" + "\t\t<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n" + "\t\t<_PropertySheetDisplayName>ScummVM_" << outputType << outputBitness << "</_PropertySheetDisplayName>\n" + "\t\t<LinkIncremental>" << (isRelease ? "false" : "true") << "</LinkIncremental>\n" + "\t</PropertyGroup>\n" + "\t<ItemDefinitionGroup>\n" + "\t\t<ClCompile>\n"; + + if (isRelease) { + properties << "\t\t\t<IntrinsicFunctions>true</IntrinsicFunctions>\n" + "\t\t\t<WholeProgramOptimization>true</WholeProgramOptimization>\n" + "\t\t\t<PreprocessorDefinitions>WIN32;RELEASE_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n" + "\t\t\t<StringPooling>true</StringPooling>\n" + "\t\t\t<BufferSecurityCheck>false</BufferSecurityCheck>\n" + "\t\t\t<DebugInformationFormat></DebugInformationFormat>\n" + "\t\t\t<EnablePREfast>" << (enableAnalysis ? "true" : "false") << "</EnablePREfast>\n" + "\t\t</ClCompile>\n" + "\t\t<Link>\n" + "\t\t\t<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>\n" + "\t\t\t<SetChecksum>true</SetChecksum>\n"; + } else { + properties << "\t\t\t<Optimization>Disabled</Optimization>\n" + "\t\t\t<PreprocessorDefinitions>WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n" + "\t\t\t<MinimalRebuild>true</MinimalRebuild>\n" + "\t\t\t<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n" + "\t\t\t<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n" + "\t\t\t<FunctionLevelLinking>true</FunctionLevelLinking>\n" + "\t\t\t<TreatWarningAsError>false</TreatWarningAsError>\n" + "\t\t\t<DebugInformationFormat>" << (isWin32 ? "EditAndContinue" : "ProgramDatabase") << "</DebugInformationFormat>\n" // For x64 format Edit and continue is not supported, thus we default to Program Database + "\t\t\t<EnablePREfast>" << (enableAnalysis ? "true" : "false") << "</EnablePREfast>\n" + "\t\t</ClCompile>\n" + "\t\t<Link>\n" + "\t\t\t<GenerateDebugInformation>true</GenerateDebugInformation>\n" + "\t\t\t<IgnoreSpecificDefaultLibraries>libcmt.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>\n"; + } + + properties << "\t\t</Link>\n" + "\t</ItemDefinitionGroup>\n" + "</Project>\n"; + + properties.flush(); + properties.close(); +} + +#define OUTPUT_NASM_COMMAND_MSBUILD(config) \ + projectFile << "\t\t\t<Command Condition=\"'$(Configuration)|$(Platform)'=='" << config << "|Win32'\">nasm.exe -f win32 -g -o \"$(IntDir)" << (isDuplicate ? (*entry).prefix : "") << "%(Filename).obj\" \"%(FullPath)\"</Command>\n" \ + "\t\t\t<Outputs Condition=\"'$(Configuration)|$(Platform)'=='" << config << "|Win32'\">$(IntDir)" << (isDuplicate ? (*entry).prefix : "") << "%(Filename).obj;%(Outputs)</Outputs>\n"; + +#define OUPUT_FILES_MSBUILD(files, action) \ + if (!files.empty()) { \ + projectFile << "\t<ItemGroup>\n"; \ + for (std::list<FileEntry>::const_iterator entry = files.begin(); entry != files.end(); ++entry) { \ + projectFile << "\t\t<" action " Include=\"" << (*entry).path << "\" />\n"; \ + } \ + projectFile << "\t</ItemGroup>\n"; \ + } + +bool hasEnding(std::string const &fullString, std::string const &ending) { + if (fullString.length() > ending.length()) { + return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending)); + } else { + return false; + } +} + + +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"; + } +} + +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); + } + } +} + +} // End of CreateProjectTool namespace diff --git a/tools/create_project/msbuild.h b/tools/create_project/msbuild.h new file mode 100644 index 0000000000..fa5311734b --- /dev/null +++ b/tools/create_project/msbuild.h @@ -0,0 +1,82 @@ +/* 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$ + * + */ + +#ifndef TOOLS_CREATE_PROJECT_MSBUILD_H +#define TOOLS_CREATE_PROJECT_MSBUILD_H + +#include "msvc.h" + +namespace CreateProjectTool { + +class MSBuildProvider : public MSVCProvider { +public: + MSBuildProvider(StringList &global_warnings, std::map<std::string, StringList> &project_warnings, const int version); + +protected: + void createProjectFile(const std::string &name, const std::string &uuid, const BuildSetup &setup, const std::string &moduleDir, + const StringList &includeList, const StringList &excludeList); + + void outputProjectSettings(std::ofstream &project, const std::string &name, const BuildSetup &setup, bool isRelease, bool isWin32, bool enableAnalysis); + + void writeFileListToProject(const FileNode &dir, std::ofstream &projectFile, const int indentation, + const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + + void writeReferences(std::ofstream &output); + + void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix); + + void createBuildProp(const BuildSetup &setup, bool isRelease, bool isWin32, bool enableAnalysis); + + const char *getProjectExtension(); + const char *getPropertiesExtension(); + int getVisualStudioVersion(); + +private: + struct FileEntry { + std::string name; + std::string path; + std::string filter; + std::string prefix; + + bool operator<(const FileEntry& rhs) const { + return path.compare(rhs.path) == -1; // Not exactly right for alphabetical order, but good enough + } + }; + typedef std::list<FileEntry> FileEntries; + + std::list<std::string> _filters; // list of filters (we need to create a GUID for each filter id) + FileEntries _compileFiles; + FileEntries _includeFiles; + FileEntries _otherFiles; + FileEntries _asmFiles; + FileEntries _resourceFiles; + + void computeFileList(const FileNode &dir, const StringList &duplicate, const std::string &objPrefix, const std::string &filePrefix); + void createFiltersFile(const BuildSetup &setup, const std::string &name); +}; + +} // End of CreateProjectTool namespace + +#endif // TOOLS_CREATE_PROJECT_MSBUILD_H diff --git a/tools/create_project/visualstudio.cpp b/tools/create_project/visualstudio.cpp new file mode 100644 index 0000000000..6a5b2272a9 --- /dev/null +++ b/tools/create_project/visualstudio.cpp @@ -0,0 +1,377 @@ +/* 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 <fstream> + +#include <algorithm> + +namespace CreateProjectTool { + +////////////////////////////////////////////////////////////////////////// +// Visual Studio Provider (Visual Studio 2005 & 2008) +////////////////////////////////////////////////////////////////////////// + +VisualStudioProvider::VisualStudioProvider(StringList &global_warnings, std::map<std::string, StringList> &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<Configuration Name=\"" << config << "|" << platform << "\" ConfigurationType=\"1\" InheritedPropertySheets=\".\\ScummVM_" << config << props << ".vsprops\">\n" \ + "\t\t\t<Tool\tName=\"VCCLCompilerTool\" DisableLanguageExtensions=\"false\" />\n" \ + "\t\t\t<Tool\tName=\"VCLinkerTool\" OutputFile=\"$(OutDir)/scummvm.exe\"\n" \ + "\t\t\t\tAdditionalDependencies=\"" << libraries << "\"\n" \ + "\t\t\t/>\n" \ + "\t\t</Configuration>\n"; \ +} + +#define OUTPUT_CONFIGURATION_SCUMMVM_DEBUG(config, platform, props, isWin32) { \ + project << "\t\t<Configuration Name=\"" << config << "|" << platform << "\" ConfigurationType=\"1\" InheritedPropertySheets=\".\\ScummVM_" << config << props << ".vsprops\">\n" \ + "\t\t\t<Tool\tName=\"VCCLCompilerTool\" DisableLanguageExtensions=\"false\" />\n" \ + "\t\t\t<Tool\tName=\"VCLinkerTool\" OutputFile=\"$(OutDir)/scummvm.exe\"\n" \ + "\t\t\t\tAdditionalDependencies=\"" << libraries << "\"\n" \ + "\t\t\t/>\n"; \ + if (setup.runBuildEvents) { \ + project << "\t\t\t<Tool\tName=\"VCPreBuildEventTool\"\n" \ + "\t\t\t\tCommandLine=\"" << getPreBuildEvent() << "\"\n" \ + "\t\t\t/>\n" \ + "\t\t\t<Tool\tName=\"VCPostBuildEventTool\"\n" \ + "\t\t\t\tCommandLine=\"" << getPostBuildEvent(isWin32) << "\"\n" \ + "\t\t\t/>\n" \ + "\t\t</Configuration>\n"; \ + } \ +} + +#define OUTPUT_CONFIGURATION(config, platform, props) { \ + project << "\t\t<Configuration Name=\"" << config << "|" << platform << "\" ConfigurationType=\"4\" InheritedPropertySheets=\".\\ScummVM_" << config << props << ".vsprops\">\n" \ + "\t\t\t<Tool Name=\"VCCLCompilerTool\" "<< toolConfig << "/>\n" \ + "\t\t</Configuration>\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 << "<?xml version=\"1.0\" encoding=\"windows-1252\"?>\n" + "<VisualStudioProject\n" + "\tProjectType=\"Visual C++\"\n" + "\tVersion=\"" << _version << ".00\"\n" + "\tName=\"" << name << "\"\n" + "\tProjectGUID=\"{" << uuid << "}\"\n" + "\tRootNamespace=\"" << name << "\"\n" + "\tKeyword=\"Win32Proj\"\n"; + + if (_version >= 9) + project << "\tTargetFrameworkVersion=\"131072\"\n"; + + project << "\t>\n" + "\t<Platforms>\n" + "\t\t<Platform Name=\"Win32\" />\n" + "\t\t<Platform Name=\"x64\" />\n" + "\t</Platforms>\n" + "\t<Configurations>\n"; + + // Check for project-specific warnings: + std::map< std::string, std::list<std::string> >::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</Configurations>\n" + "\t<Files>\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</Files>\n" + "</VisualStudioProject>\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 << "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n" + "<VisualStudioPropertySheet\n" + "\tProjectType=\"Visual C++\"\n" + "\tVersion=\"8.00\"\n" + "\tName=\"ScummVM_Global\"\n" + "\tOutputDirectory=\"$(ConfigurationName)" << bits << "\"\n" + "\tIntermediateDirectory=\"$(ConfigurationName)" << bits << "/$(ProjectName)\"\n" + "\t>\n" + "\t<Tool\n" + "\t\tName=\"VCCLCompilerTool\"\n" + "\t\tDisableLanguageExtensions=\"true\"\n" + "\t\tDisableSpecificWarnings=\"" << warnings << "\"\n" + "\t\tAdditionalIncludeDirectories=\"" << prefix << ";" << prefix << "\\engines;$(SCUMMVM_LIBS)\\include\"\n" + "\t\tPreprocessorDefinitions=\"" << definesList << "\"\n" + "\t\tExceptionHandling=\"0\"\n" + "\t\tRuntimeTypeInfo=\"false\"\n" + "\t\tWarningLevel=\"4\"\n" + "\t\tWarnAsError=\"false\"\n" + "\t\tCompileAs=\"0\"\n" + "\t\t/>\n" + "\t<Tool\n" + "\t\tName=\"VCLibrarianTool\"\n" + "\t\tIgnoreDefaultLibraryNames=\"\"\n" + "\t/>\n" + "\t<Tool\n" + "\t\tName=\"VCLinkerTool\"\n" + "\t\tIgnoreDefaultLibraryNames=\"\"\n" + "\t\tSubSystem=\"1\"\n" + "\t\tEntryPointSymbol=\"WinMainCRTStartup\"\n" + "\t/>\n" + "\t<Tool\n" + "\t\tName=\"VCResourceCompilerTool\"\n" + "\t\tPreprocessorDefinitions=\"HAS_INCLUDE_SET\"\n" + "\t\tAdditionalIncludeDirectories=\"$(SCUMMVM_LIBS)\\lib\\" << (bits == 32 ? "x86" : "x64") << "\"\n" + "\t/>\n" + "</VisualStudioPropertySheet>\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 << "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n" + "<VisualStudioPropertySheet\n" + "\tProjectType=\"Visual C++\"\n" + "\tVersion=\"8.00\"\n" + "\tName=\"ScummVM_" << outputType << outputBitness << "\"\n" + "\tInheritedPropertySheets=\".\\ScummVM_Global" << (isWin32 ? "" : "64") << ".vsprops\"\n" + "\t>\n" + "\t<Tool\n" + "\t\tName=\"VCCLCompilerTool\"\n"; + + if (isRelease) { + properties << "\t\tEnableIntrinsicFunctions=\"true\"\n" + "\t\tWholeProgramOptimization=\"true\"\n" + "\t\tPreprocessorDefinitions=\"WIN32;RELEASE_BUILD\"\n" + "\t\tStringPooling=\"true\"\n" + "\t\tBufferSecurityCheck=\"false\"\n" + "\t\tDebugInformationFormat=\"0\"\n" + "\t\tAdditionalOption=\"" << (enableAnalysis ? "/analyze" : "") << "\"\n" + "\t/>\n" + "\t<Tool\n" + "\t\tName=\"VCLinkerTool\"\n" + "\t\tLinkIncremental=\"1\"\n" + "\t\tIgnoreDefaultLibraryNames=\"\"\n" + "\t\tSetChecksum=\"true\"\n"; + } else { + properties << "\t\tOptimization=\"0\"\n" + "\t\tPreprocessorDefinitions=\"WIN32\"\n" + "\t\tMinimalRebuild=\"true\"\n" + "\t\tBasicRuntimeChecks=\"3\"\n" + "\t\tRuntimeLibrary=\"1\"\n" + "\t\tEnableFunctionLevelLinking=\"true\"\n" + "\t\tWarnAsError=\"false\"\n" + "\t\tDebugInformationFormat=\"" << (isWin32 ? "4" : "3") << "\"\n" // For x64 format "4" (Edit and continue) is not supported, thus we default to "3" + "\t\tAdditionalOption=\"" << (enableAnalysis ? "/analyze" : "") << "\"\n" + "\t/>\n" + "\t<Tool\n" + "\t\tName=\"VCLinkerTool\"\n" + "\t\tLinkIncremental=\"2\"\n" + "\t\tGenerateDebugInformation=\"true\"\n" + "\t\tIgnoreDefaultLibraryNames=\"libcmt.lib\"\n"; + } + + properties << "\t/>\n" + "</VisualStudioPropertySheet>\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) << "<Filter\tName=\"" << dir.name << "\">\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<Tool Name=\"VCCustomBuildTool\" CommandLine=\"nasm.exe -f win32 -g -o "" + objFileName + "" "$(InputPath)"
\" Outputs=\"" + objFileName + "\" />\n"; + + // NASM is not supported for x64, thus we do not need to add additional entries here :-). + projectFile << indentString << "<File RelativePath=\"" << convertPathToWin(filePrefix + node->name) << "\">\n" + << indentString << "\t<FileConfiguration Name=\"Debug|Win32\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "\t<FileConfiguration Name=\"Analysis|Win32\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "\t<FileConfiguration Name=\"Release|Win32\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "</File>\n"; + } else { + if (isDuplicate) { + const std::string toolLine = indentString + "\t\t<Tool Name=\"VCCLCompilerTool\" ObjectFile=\"$(IntDir)\\" + objPrefix + "$(InputName).obj\" XMLDocumentationFileName=\"$(IntDir)\\" + objPrefix + "$(InputName).xdc\" />\n"; + + projectFile << indentString << "<File RelativePath=\"" << convertPathToWin(filePrefix + node->name) << "\">\n" + << indentString << "\t<FileConfiguration Name=\"Debug|Win32\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "\t<FileConfiguration Name=\"Analysis|Win32\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "\t<FileConfiguration Name=\"Release|Win32\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "\t<FileConfiguration Name=\"Debug|x64\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "\t<FileConfiguration Name=\"Analysis|x64\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "\t<FileConfiguration Name=\"Release|x64\">\n" + << toolLine + << indentString << "\t</FileConfiguration>\n" + << indentString << "</File>\n"; + } else { + projectFile << indentString << "<File RelativePath=\"" << convertPathToWin(filePrefix + node->name) << "\" />\n"; + } + } + } else { + projectFile << indentString << "<File RelativePath=\"" << convertPathToWin(filePrefix + node->name) << "\" />\n"; + } + } + } + + if (indentation) + projectFile << getIndent(indentation + 1) << "</Filter>\n"; +} + +} // End of CreateProjectTool namespace diff --git a/tools/create_project/visualstudio.h b/tools/create_project/visualstudio.h new file mode 100644 index 0000000000..0cf572429b --- /dev/null +++ b/tools/create_project/visualstudio.h @@ -0,0 +1,57 @@ +/* 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$ + * + */ + +#ifndef TOOLS_CREATE_PROJECT_VISUALSTUDIO_H +#define TOOLS_CREATE_PROJECT_VISUALSTUDIO_H + +#include "msvc.h" + +namespace CreateProjectTool { + +class VisualStudioProvider : public MSVCProvider { +public: + VisualStudioProvider(StringList &global_warnings, std::map<std::string, StringList> &project_warnings, const int version); + +protected: + void createProjectFile(const std::string &name, const std::string &uuid, const BuildSetup &setup, const std::string &moduleDir, + 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); + + void writeReferences(std::ofstream &output); + + void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix); + + void createBuildProp(const BuildSetup &setup, bool isRelease, bool isWin32, bool enableAnalysis); + + const char *getProjectExtension(); + const char *getPropertiesExtension(); + int getVisualStudioVersion(); +}; + +} // End of CreateProjectTool namespace + +#endif // TOOLS_CREATE_PROJECT_VISUALSTUDIO_H |