コード例 #1
0
void MSVCProvider::createWorkspace(const BuildSetup &setup) {
	UUIDMap::const_iterator svmUUID = _uuidMap.find("scummvm");
	if (svmUUID == _uuidMap.end())
		error("No UUID for \"scummvm\" project created");

	const std::string svmProjectUUID = svmUUID->second;
	assert(!svmProjectUUID.empty());

	std::string solutionUUID = createUUID();

	std::ofstream solution((setup.outputDir + '/' + "scummvm.sln").c_str());
	if (!solution)
		error("Could not open \"" + setup.outputDir + '/' + "scummvm.sln\" for writing");

	solution << "Microsoft Visual Studio Solution File, Format Version " << _version + 1 << ".00\n";
	solution << "# Visual Studio " << getVisualStudioVersion() << "\n";

	solution << "Project(\"{" << solutionUUID << "}\") = \"scummvm\", \"scummvm" << getProjectExtension() << "\", \"{" << svmProjectUUID << "}\"\n";

	// Project dependencies are moved to vcxproj files in Visual Studio 2010
	if (_version < 10)
		writeReferences(solution);

	solution << "EndProject\n";

	// Note we assume that the UUID map only includes UUIDs for enabled engines!
	for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
		if (i->first == "scummvm")
			continue;

		solution << "Project(\"{" << solutionUUID << "}\") = \"" << i->first << "\", \"" << i->first << getProjectExtension() << "\", \"{" << i->second << "}\"\n"
		         << "EndProject\n";
	}

	solution << "Global\n"
	            "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n"
	            "\t\tDebug|Win32 = Debug|Win32\n"
				"\t\tAnalysis|Win32 = Analysis|Win32\n"
	            "\t\tRelease|Win32 = Release|Win32\n"
	            "\t\tDebug|x64 = Debug|x64\n"
				"\t\tAnalysis|x64 = Analysis|x64\n"
	            "\t\tRelease|x64 = Release|x64\n"
	            "\tEndGlobalSection\n"
	            "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n";

	for (UUIDMap::const_iterator i = _uuidMap.begin(); i != _uuidMap.end(); ++i) {
		solution << "\t\t{" << i->second << "}.Debug|Win32.ActiveCfg = Debug|Win32\n"
		            "\t\t{" << i->second << "}.Debug|Win32.Build.0 = Debug|Win32\n"
					"\t\t{" << i->second << "}.Analysis|Win32.ActiveCfg = Analysis|Win32\n"
					"\t\t{" << i->second << "}.Analysis|Win32.Build.0 = Analysis|Win32\n"
		            "\t\t{" << i->second << "}.Release|Win32.ActiveCfg = Release|Win32\n"
		            "\t\t{" << i->second << "}.Release|Win32.Build.0 = Release|Win32\n"
		            "\t\t{" << i->second << "}.Debug|x64.ActiveCfg = Debug|x64\n"
		            "\t\t{" << i->second << "}.Debug|x64.Build.0 = Debug|x64\n"
					"\t\t{" << i->second << "}.Analysis|x64.ActiveCfg = Analysis|x64\n"
					"\t\t{" << i->second << "}.Analysis|x64.Build.0 = Analysis|x64\n"
		            "\t\t{" << i->second << "}.Release|x64.ActiveCfg = Release|x64\n"
		            "\t\t{" << i->second << "}.Release|x64.Build.0 = Release|x64\n";
	}

	solution << "\tEndGlobalSection\n"
	            "\tGlobalSection(SolutionProperties) = preSolution\n"
	            "\t\tHideSolutionNode = FALSE\n"
	            "\tEndGlobalSection\n"
	            "EndGlobal\n";
}
コード例 #2
0
ファイル: msbuild.cpp プロジェクト: RobLoach/scummvm
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=\"" << (_version >= 12 ? _version : 4) << ".0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n"
            "\t<ItemGroup Label=\"ProjectConfigurations\">\n";

    outputConfiguration(project, "Debug", "Win32");
    outputConfiguration(project, "Debug", "x64");
    outputConfiguration(project, "Analysis", "Win32");
    outputConfiguration(project, "Analysis", "x64");
    outputConfiguration(project, "LLVM", "Win32");
    outputConfiguration(project, "LLVM", "x64");
    outputConfiguration(project, "Release", "Win32");
    outputConfiguration(project, "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\t<VCTargetsPath Condition=\"'$(VCTargetsPath" << _version << ")' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''\">$(VCTargetsPath" << _version << ")</VCTargetsPath>\n"
            "\t</PropertyGroup>\n";

    // Shared configuration
    project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n";

    std::string version = "v" + toString(_version) + "0";
    std::string llvm = "LLVM-vs" + toString(getVisualStudioVersion());

    outputConfigurationType(setup, project, name, "Release|Win32", version);
    outputConfigurationType(setup, project, name, "Analysis|Win32", version);
    outputConfigurationType(setup, project, name, "LLVM|Win32", llvm);
    outputConfigurationType(setup, project, name, "Debug|Win32", version);
    outputConfigurationType(setup, project, name, "Release|x64", version);
    outputConfigurationType(setup, project, name, "LLVM|x64", llvm);
    outputConfigurationType(setup, project, name, "Analysis|x64", version);
    outputConfigurationType(setup, project, name, "Debug|x64", version);

    project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n"
            "\t<ImportGroup Label=\"ExtensionSettings\">\n"
            "\t</ImportGroup>\n";

    outputProperties(project, "Release|Win32",  setup.projectDescription + "_Release.props");
    outputProperties(project, "Analysis|Win32", setup.projectDescription + "_Analysis.props");
    outputProperties(project, "LLVM|Win32",     setup.projectDescription + "_LLVM.props");
    outputProperties(project, "Debug|Win32",    setup.projectDescription + "_Debug.props");
    outputProperties(project, "Release|x64",    setup.projectDescription + "_Release64.props");
    outputProperties(project, "Analysis|x64",   setup.projectDescription + "_Analysis64.props");
    outputProperties(project, "LLVM|x64",       setup.projectDescription + "_LLVM64.props");
    outputProperties(project, "Debug|x64",      setup.projectDescription + "_Debug64.props");

    project << "\t<PropertyGroup Label=\"UserMacros\" />\n";

    // Project-specific settings (analysis uses debug properties)
    outputProjectSettings(project, name, setup, false, true, "Debug");
    outputProjectSettings(project, name, setup, false, true, "Analysis");
    outputProjectSettings(project, name, setup, false, true, "LLVM");
    outputProjectSettings(project, name, setup, true, true, "Release");
    outputProjectSettings(project, name, setup, false, false, "Debug");
    outputProjectSettings(project, name, setup, false, false, "Analysis");
    outputProjectSettings(project, name, setup, false, false, "LLVM");
    outputProjectSettings(project, name, setup, true, false, "Release");

    // 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 the main project
    if (name == setup.projectName)
        writeReferences(setup, project);

    // Output auto-generated test runner
    if (setup.tests) {
        project << "\t<ItemGroup>\n";
        project << "\t\t<ClCompile Include=\"test_runner.cpp\" />\n";
        project << "\t</ItemGroup>\n";
    }

    // Visual Studio 2015 automatically imports natvis files that are part of the project
    if (name == PROJECT_NAME && _version == 14) {
        project << "\t<ItemGroup>\n";
        project << "\t\t<None Include=\"" << setup.srcDir << "/devtools/create_project/scripts/scummvm.natvis\" />\n";
        project << "\t</ItemGroup>\n";
    }

    project << "\t<Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n"
            "\t<ImportGroup Label=\"ExtensionTargets\">\n"
            "\t</ImportGroup>\n";

    if (setup.tests) {
        // We override the normal target to ignore the exit code (this allows us to have a clean output and not message about the command exit code)
        project << "\t\t<Target Name=\"PostBuildEvent\">\n"
                << "\t\t\t<Message Text=\"Description: Run tests\" />\n"
                << "\t\t\t<Exec Command=\"$(TargetPath)\"  IgnoreExitCode=\"true\" />\n"
                << "\t\t</Target>\n";
    }

    project << "</Project>\n";

    // Output filter file if necessary
    createFiltersFile(setup, name);
}