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);
}