summaryrefslogtreecommitdiff
path: root/Tools/resources.targets
blob: 9f9617cef4becb964b30d72cb5213cd6d44a6e0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask TaskName="GenerateResourcesCode" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
  <UsingTask TaskName="NormalizeAssemblyName" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />

  <PropertyGroup>
    <GenerateResourceMSBuildRuntime>CurrentRuntime</GenerateResourceMSBuildRuntime>
    <GenerateResourceMSBuildArchitecture>CurrentArchitecture</GenerateResourceMSBuildArchitecture>
  </PropertyGroup>

  <PropertyGroup>
    <ResourcesSourceOutputDirectory Condition="'$(ResourcesSourceOutputDirectory)' == ''">$(MSBuildProjectDirectory)/Resources/</ResourcesSourceOutputDirectory>
    <StringResourcesPath Condition="'$(StringResourcesPath)'=='' And Exists('$(ResourcesSourceOutputDirectory)Strings.resx')">$(ResourcesSourceOutputDirectory)Strings.resx</StringResourcesPath>
    <IntermediateResOutputFileFullPath Condition="'$(MSBuildProjectExtension)' == '.csproj'">$(IntermediateOutputPath)SR.cs</IntermediateResOutputFileFullPath>
    <IntermediateResOutputFileFullPath Condition="'$(MSBuildProjectExtension)' == '.vbproj'">$(IntermediateOutputPath)SR.vb</IntermediateResOutputFileFullPath>
    <DefineConstants Condition="'$(ConfigurationGroup)' == 'Debug'">$(DefineConstants);DEBUGRESOURCES</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(BuildingUAPVertical)' == 'true'">
    <CompileDependsOn>
      CopyResxFilesToReswFiles;
      $(CompileDependsOn);
    </CompileDependsOn>
  </PropertyGroup>

  <Target Name="CalculateResourcesFileNames" Condition="'$(BuildingUAPVertical)' == 'true'">
    <ItemGroup>
      <_AllResxFiles Include="@(EmbeddedResource->'%(FullPath)')" Condition="'%(Extension)' == '.resx'">
        <ReswName Condition="'%(EmbeddedResource.ReswName)' == ''">%(EmbeddedResource.ManifestResourceName)</ReswName>
      </_AllResxFiles>
    </ItemGroup>

    <PropertyGroup>
      <ProjectHasResources Condition="'@(_AllResxFiles)' != ''">true</ProjectHasResources>
      <TestProjectNeedsModifiedPriFile Condition="'$(IsTestProject)' == 'true' AND '$(ProjectHasResources)' == 'true'">true</TestProjectNeedsModifiedPriFile>
      <TestResourcesFolderPath Condition="'$(TestProjectNeedsModifiedPriFile)' == 'true'">$(RuntimePath)$(AssemblyName).Resw</TestResourcesFolderPath>
      <_ResWDestinationPath Condition="'$(TestResourcesFolderPath)' != ''">$(TestResourcesFolderPath)</_ResWDestinationPath>
      <_ResWDestinationPath Condition="'$(TestResourcesFolderPath)' == ''">$(ResourcesFolderPath)</_ResWDestinationPath>
    </PropertyGroup>

    <ItemGroup>
      <_ReswOutputFiles Include="@(_AllResxFiles->'$(_ResWDestinationPath)/%(ReswName).resw')" />
    </ItemGroup>

  </Target>

  <Target Name="CopyResxFilesToReswFiles"
          Condition="'$(BuildingUAPVertical)' == 'true'"
          DependsOnTargets="CalculateResourcesFileNames"
          Inputs="@(_AllResxFiles)"
          Outputs="@(_ReswOutputFiles)" >

    <Copy SourceFiles="@(_AllResxFiles)"
          DestinationFiles="@(_ReswOutputFiles)"
          SkipUnchangedFiles="true">
          <Output TaskParameter="CopiedFiles" ItemName="FilesCreated" />
    </Copy>

    <!-- We need to touch the copied files so that the target that uses them can track the inputs and outputs with the copied timestamp -->
    <Touch Files="@(FilesCreated)" />

  </Target>

  <PropertyGroup Condition="'$(StringResourcesPath)'!=''">
      <CompileDependsOn>
          NormalizeAssemblyName;
          GenerateResourcesSource;
          $(CompileDependsOn);
      </CompileDependsOn>
  </PropertyGroup>

  <Target Name="NormalizeAssemblyName" Condition="'$(StringResourcesPath)'!='' AND '$(OmitResources)'!='true'">
    <NormalizeAssemblyName
        AssemblyName="$(AssemblyName)" >
        <Output TaskParameter="NormalizedAssemblyName" PropertyName="_NormalizedAssemblyName" />
    </NormalizeAssemblyName>

    <ItemGroup>
      <!--
         EmbeddedResource is defined outside the target and cannot be defined inside this target
         we need to update logical name and ReswName after we normalize the assembly name.
      -->
      <EmbeddedResource Condition="'%(EmbeddedResource.LogicalName)'=='FxResources.$(AssemblyName).SR.resources'">
        <LogicalName>FxResources.$(_NormalizedAssemblyName).SR.resources</LogicalName>
        <ReswName Condition="'$(BuildingUAPVertical)' == 'true'">FxResources.$(_NormalizedAssemblyName).SR</ReswName>
      </EmbeddedResource>
    </ItemGroup>
  </Target>

  <Target Name="GenerateResourcesSource" DependsOnTargets="NormalizeAssemblyName"
          Condition="'$(StringResourcesPath)'!='' AND '$(OmitResources)'!='true'"
          Inputs="$(StringResourcesPath)"
          Outputs="$(IntermediateResOutputFileFullPath)">

    <GenerateResourcesCode
        ResxFilePath="$(StringResourcesPath)"
        OutputSourceFilePath="$(IntermediateResOutputFileFullPath)"
        AssemblyName="$(_NormalizedAssemblyName)"
        SRNamespace="$(GenerateResourcesSRNamespace)"
        SRClassName="$(GenerateResourcesSRClassName)"
        ResourcesNamespace="$(GenerateResourcesResourcesNamespace)"
        ResourcesClassName="$(GenerateResourcesResourcesClassName)"
        AsConstants="$(GenerateResourcesCodeAsConstants)">
    </GenerateResourcesCode>

    <ItemGroup>
      <!-- The following Compile element has to be included dynamically inside the Target otherwise intellisense will not work -->
      <Compile Include="$(IntermediateResOutputFileFullPath)" />
    </ItemGroup>

    <ItemGroup>
      <FileWrites Include="$(IntermediateResOutputFileFullPath)" />
    </ItemGroup>
  </Target>

  <ItemGroup Condition="'$(StringResourcesPath)'!='' AND '$(OmitResources)'!='true'">
    <EmbeddedResource Include="$(StringResourcesPath)">
      <Visible>true</Visible>
      <LogicalName>FxResources.$(AssemblyName).SR.resources</LogicalName>
      <ReswName Condition="'$(BuildingUAPVertical)' == 'true'">FxResources.$(AssemblyName).SR</ReswName>
      <!-- Set the Generator metadata so that VS triggers design-time build whenever the .resx file is saved -->
      <Generator>MSBuild:GenerateResourcesSource</Generator>
    </EmbeddedResource>
  </ItemGroup>

  <Choose>
    <When Condition="Exists('$(StringResourcesPath)') And '$(SkipCommonResourcesIncludes)'=='' AND '$(OmitResources)'!='true'">
      <Choose>
        <When Condition="'$(MSBuildProjectExtension)' == '.csproj'">
          <ItemGroup>
            <Compile Include="$(CommonPath)/System/SR.cs">
              <Visible>true</Visible>
              <Link>Resources/Common/SR.cs</Link>
            </Compile>
          </ItemGroup>
        </When>
        <When Condition="'$(MSBuildProjectExtension)' == '.vbproj'">
          <ItemGroup>
            <Compile Include="$(CommonPath)/System/SR.vb">
              <Visible>true</Visible>
              <Link>Resources/Common/SR.vb</Link>
            </Compile>
          </ItemGroup>
        </When>
      </Choose>
    </When>
  </Choose>
</Project>