void generateVCXProj()

in tools/winmd2objc/lib/CodeGen.cpp [2426:2676]


void generateVCXProj(const pair<wstring, pair<wstring, vector<shared_ptr<NameSpace>>>>& module,
                     const wstring& projectDirectoryPath,
                     const map<wstring, shared_ptr<ObjectModel::Symbol>>& types,
                     const map<wstring, pair<wstring, vector<shared_ptr<NameSpace>>>>& moduleMap,
                     const map<wstring, wstring>& namespaceMap,
                     const vector<wstring>& nugetDependencies,
                     const wstring& solutionName) {
    // We do not expect a project without any namespace info in it.
    assert(module.second.second.size() > 0);

    wstring additionalIncludePaths = CommandLineInfo::GetAdditionalIncludePaths();

    // clang-format off
    wstring packageReferences = LR"~(
  <ItemGroup>
    <PackageReference Include="Nuget.Build.Packaging" Version="0.2.3" />
    <PackageReference Include="WinObjC.Language" Version="*" />
    <PackageReference Include="WinObjC.Frameworks.UWP.Core" Version="*" />)~";
    for (auto& nugetInfo : nugetDependencies) {
        packageReferences += L"\n    ";
        packageReferences += nugetInfo;
    }
    packageReferences += LR"~(
  </ItemGroup>
)~";

    wstring vcxprojTemplate = LR"~(<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|ARM">
      <Configuration>Debug</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|ARM">
      <Configuration>Release</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
%s
  <PropertyGroup Label="Globals">
    <ProjectGuid>%s</ProjectGuid>
    <Keyword>DynamicLibrary</Keyword>
    <ProjectName>%s</ProjectName>
    <RootNamespace>%s</RootNamespace>
    <DefaultLanguage>en-US</DefaultLanguage>
    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
    <AppContainerApplication>true</AppContainerApplication>
    <ApplicationType>Windows Store</ApplicationType>
    <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
    <WindowsTargetPlatformMinVersion>10.0.17763.0</WindowsTargetPlatformMinVersion>
    <ApplicationTypeRevision>10.0</ApplicationTypeRevision>
    <IncludeOutputsInPackage>false</IncludeOutputsInPackage>
    <TargetFramework>uap10.0</TargetFramework>
    <TargetOsAndVersion Condition="'$(TargetOsAndVersion)' == ''">Universal Windows</TargetOsAndVersion>
    <EnableDotNetNativeCompatibleProfile Condition="'$(EnableDotNetNativeCompatibleProfile)'==''">true</EnableDotNetNativeCompatibleProfile>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v141</PlatformToolset>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v141</PlatformToolset>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <PlatformToolset>v141</PlatformToolset>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <PlatformToolset>v141</PlatformToolset>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
    <Import Project="..\..\)~" + solutionName + LR"~(.Packageable.props" />
  </ImportGroup>
  <ImportGroup Label="Shared">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <GenerateManifest>false</GenerateManifest>
    <IgnoreImportLibrary>false</IgnoreImportLibrary>
    <IslandwoodDRT>true</IslandwoodDRT>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <GenerateManifest>false</GenerateManifest>
    <IgnoreImportLibrary>false</IgnoreImportLibrary>
    <IslandwoodDRT>true</IslandwoodDRT>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
    <GenerateManifest>false</GenerateManifest>
    <IgnoreImportLibrary>false</IgnoreImportLibrary>
    <IslandwoodDRT>true</IslandwoodDRT>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
    <GenerateManifest>false</GenerateManifest>
    <IgnoreImportLibrary>false</IgnoreImportLibrary>
    <IslandwoodDRT>true</IslandwoodDRT>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>NotUsing</PrecompiledHeader>
      <CompileAsWinRT>false</CompileAsWinRT>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
      <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
      <ModuleDefinitionFile>$(MSBuildProjectDirectory)\..\..\)~" + g_srcDirectory + LR"~(%s_export.def</ModuleDefinitionFile>
    </Link>
    <ClangCompile>
      <AdditionalOptions> -fno-rtti -Wno-microsoft -Wno-extern-initializer  -Wno-ignored-attributes -DWINAPI_FAMILY=WINAPI_FAMILY_APP  -ffunction-sections  -fdata-sections -d2bigobj </AdditionalOptions>
      <IncludePaths>%%(IncludePaths);)~" + additionalIncludePaths + LR"~($(MSBuildProjectDirectory)\..\..\..\Universal;$(WINOBJC_SDK_ROOT)\include;$(WINOBJC_SDK_ROOT)\Frameworks\include;$(WINOBJC_SDK_ROOT)\include\xplat</IncludePaths>
      <UserIncludePaths>
      </UserIncludePaths>
      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
      <PreprocessorDefinitions>DEBUG=1;%s="";)~" + _getPreprcessorDefineString(L"=1") + LR"~(;</PreprocessorDefinitions>
    </ClangCompile>
  </ItemDefinitionGroup>)~";
  vcxprojTemplate += LR"~(
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <PrecompiledHeader>NotUsing</PrecompiledHeader>
      <CompileAsWinRT>false</CompileAsWinRT>
      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
      <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
      <ModuleDefinitionFile>$(MSBuildProjectDirectory)\..\..\)~" + g_srcDirectory + LR"~(%s_export.def</ModuleDefinitionFile>
    </Link>
    <ClangCompile>
      <AdditionalOptions> -fno-rtti -Wno-microsoft -Wno-extern-initializer  -Wno-ignored-attributes -DWINAPI_FAMILY=WINAPI_FAMILY_APP  -ffunction-sections  -fdata-sections -d2bigobj </AdditionalOptions>
      <IncludePaths>%%(IncludePaths);)~" + additionalIncludePaths + LR"~($(MSBuildProjectDirectory)\..\..\..\Universal;$(WINOBJC_SDK_ROOT)\include;$(WINOBJC_SDK_ROOT)\Frameworks\include;$(WINOBJC_SDK_ROOT)\include\xplat</IncludePaths>
      <OptimizationLevel>Full</OptimizationLevel>
      <WOCStdLib>true</WOCStdLib>
      <UserIncludePaths>
      </UserIncludePaths>
      <PreprocessorDefinitions>;%s="";)~" + _getPreprcessorDefineString(L"=1") + LR"~(;</PreprocessorDefinitions>
    </ClangCompile>
  </ItemDefinitionGroup>)~";
  vcxprojTemplate += LR"~(
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|arm'">
    <ClCompile>
      <PrecompiledHeader>NotUsing</PrecompiledHeader>
      <CompileAsWinRT>false</CompileAsWinRT>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
      <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
      <ModuleDefinitionFile>$(MSBuildProjectDirectory)\..\..\)~" + g_srcDirectory + LR"~(%s_export.def</ModuleDefinitionFile>
    </Link>
    <ClangCompile>
      <AdditionalOptions> -fno-rtti -Wno-microsoft -Wno-extern-initializer  -Wno-ignored-attributes -DWINAPI_FAMILY=WINAPI_FAMILY_APP  -ffunction-sections  -fdata-sections -d2bigobj </AdditionalOptions>
      <IncludePaths>%%(IncludePaths);)~" + additionalIncludePaths + LR"~($(MSBuildProjectDirectory)\..\..\..\Universal;$(WINOBJC_SDK_ROOT)\include;$(WINOBJC_SDK_ROOT)\Frameworks\include;$(WINOBJC_SDK_ROOT)\include\xplat</IncludePaths>
      <UserIncludePaths>
      </UserIncludePaths>
      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
      <PreprocessorDefinitions>DEBUG=1;%s="";)~" + _getPreprcessorDefineString(L"=1") + LR"~(;</PreprocessorDefinitions>
    </ClangCompile>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|arm'">
    <ClCompile>
      <PrecompiledHeader>NotUsing</PrecompiledHeader>
      <CompileAsWinRT>false</CompileAsWinRT>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
      <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
      <ModuleDefinitionFile>$(MSBuildProjectDirectory)\..\..\)~" + g_srcDirectory + LR"~(%s_export.def</ModuleDefinitionFile>
    </Link>
    <ClangCompile>
      <AdditionalOptions> -fno-rtti -Wno-microsoft -Wno-extern-initializer  -Wno-ignored-attributes -DWINAPI_FAMILY=WINAPI_FAMILY_APP  -ffunction-sections  -fdata-sections -d2bigobj </AdditionalOptions>
      <IncludePaths>%%(IncludePaths);)~" + additionalIncludePaths + LR"~($(MSBuildProjectDirectory)\..\..\..\Universal;$(WINOBJC_SDK_ROOT)\include;$(WINOBJC_SDK_ROOT)\Frameworks\include;$(WINOBJC_SDK_ROOT)\include\xplat</IncludePaths>
      <OptimizationLevel>Full</OptimizationLevel>
      <WOCStdLib>true</WOCStdLib>
      <UserIncludePaths>
      </UserIncludePaths>
      <PreprocessorDefinitions>;%s="";)~" + _getPreprcessorDefineString(L"=1") + LR"~(;</PreprocessorDefinitions>
    </ClangCompile>
  </ItemDefinitionGroup>
%s
  )~" + packageReferences + LR"~(
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
    <Import Project="$(MSBuildProjectDirectory)\..\..\)~" + solutionName + LR"~(.Packageable.targets" />
    <Import Project="$(MSBuildProjectDirectory)\..\..\..\Common\WinObjC.Frameworks.UWP.Common.targets" Condition="Exists('$(SolutionDir)\..\..\..\Common\WinObjC.Frameworks.UWP.Common.targets')" />
    <Import Project="$(WINOBJC_SDK_ROOT)\common\winobjc.packagereference.override.targets" Condition="Exists('$(WINOBJC_SDK_ROOT)\common\winobjc.packagereference.override.targets')"/>
  </ImportGroup>
</Project>)~";
    // clang-format on
    _wmkdir(projectDirectoryPath.c_str());

    FILE* vcxproj = nullptr;
    if (_wfopen_s(&vcxproj, (projectDirectoryPath + L"\\" + module.first + L".vcxproj").c_str(), L"w")) {
        wprintf(L"Failed to open vcxproj file: %s\\%s.vcxproj\n", projectDirectoryPath.c_str(), module.first.c_str());
        exit(1);
    }

    wstring moduleDefine = moduleDefineFromName(module.first);
    wstring moduleName = module.first;

    fwprintf(vcxproj,
             vcxprojTemplate.c_str(),
             generateProjectReferences(module.second.second, types, moduleMap, namespaceMap).c_str(),
             module.second.first.c_str(), // project guid
             moduleName.c_str(), // Proj Name
             moduleName.c_str(), // Root Namespace
             moduleName.c_str(), // 4x .def
             moduleDefine.c_str(), // 4x moduleDefine
             moduleName.c_str(), // 4x .def
             moduleDefine.c_str(), // 4x moduleDefine
             moduleName.c_str(), // 4x .def
             moduleDefine.c_str(), // 4x moduleDefine
             moduleName.c_str(), // 4x .def
             moduleDefine.c_str(), // 4x moduleDefine
             generateClangCompileStatements(module.second.second).c_str()); // ClangCompile

    fclose(vcxproj);
}