Skip to content

Commit

Permalink
Generate api-*.xml.in on the fly, using class-parse and api-xml-adjus…
Browse files Browse the repository at this point in the history
…ter.

It helps API generator changes more robust by running API generation
consistently with unit testing.
  • Loading branch information
atsushieno committed Feb 6, 2018
1 parent 383c12e commit 7d705bf
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 6 deletions.
5 changes: 5 additions & 0 deletions build-tools/api-xml-adjuster/api-xml-adjuster.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@
<Project>{1268EADF-8344-431C-81F6-FCB7CBC99F49}</Project>
<Name>Xamarin.Android.Tools.ApiXmlAdjuster</Name>
</ProjectReference>
<ProjectReference Include="..\..\external\Java.Interop\tools\class-parse\class-parse.csproj">
<Name>class-parse</Name>
<ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="api-xml-adjuster.targets" />
</Project>
54 changes: 54 additions & 0 deletions build-tools/api-xml-adjuster/api-xml-adjuster.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Import Project="..\..\src\Mono.Android\Mono.Android.projitems" />

<PropertyGroup>
<_TopDir>$(MSBuildThisFileDirectory)..\..</_TopDir>
<_OutputPath>$(_TopDir)\bin\Build$(Configuration)\</_OutputPath>
</PropertyGroup>

<Target Name="_DefineApiFiles">
<CreateItem Include="@(AndroidApiInfo)"
AdditionalMetadata="ParameterDescription=$(_TopDir)\src\Mono.Android\Profiles\api-%(AndroidApiInfo.Level).params.txt;ClassParseXml=$(_OutputPath)api\api-%(AndroidApiInfo.Level).xml.class-parse;ApiAdjustedXml=$(_OutputPath)api\api-%(AndroidApiInfo.Level).xml.in"
>
<Output TaskParameter="Include" ItemName="ApiFileDefinition"/>
</CreateItem>
</Target>

<Target Name="_ClassParse"
BeforeTargets="_AdjustApiXml"
DependsOnTargets="_DefineApiFiles"
Inputs="@(ApiFileDefinition -&gt; %(ApiFileDefinition.ParameterDescription))"
Outputs="@(ApiFileDefinition -&gt; %(ApiFileDefinition.ClassParseXml))">
<PropertyGroup>
<ClassParse>$(_TopDir)\bin\$(Configuration)\lib\xamarin.android\xbuild\Xamarin\Android\class-parse.exe</ClassParse>
</PropertyGroup>
<MakeDir Directories="$(_OutputPath)api" />
<Exec
Condition="Exists('$(_TopDir)\src\Mono.Android\Profiles\api-%(ApiFileDefinition.Level).params.txt')"
Command="$(ManagedRuntime) $(ClassParse) $(AndroidSdkDirectory)\platforms\android-%(ApiFileDefinition.Level)\android.jar -platform=%(ApiFileDefinition.Level) -parameter-names='%(ApiFileDefinition.ParameterDescription)' -o='%(ApiFileDefinition.ClassParseXml)'"
/>
</Target>
<Target Name="_AdjustApiXml"
AfterTargets="Build"
DependsOnTargets="_DefineApiFiles"
Inputs="@(ApiFileDefinition -&gt; %(ApiFileDefinition.ClassParseXml))"
Outputs="@(ApiFileDefinition -&gt; %(ApiFileDefinition.ApiAdjustedXml)">
<PropertyGroup>
<ApiXmlAdjuster>$(_TopDir)\bin\Build$(Configuration)\api-xml-adjuster.exe</ApiXmlAdjuster>
</PropertyGroup>
<Exec
Condition="Exists('$(_TopDir)\src\Mono.Android\Profiles\api-%(ApiFileDefinition.Level).params.txt')"
Command="$(ManagedRuntime) $(ApiXmlAdjuster) %(ApiFileDefinition.ClassParseXml) %(ApiFileDefinition.ApiAdjustedXml)"
/>
</Target>

<Target Name="_CleanApiXml"
BeforeTargets="Clean">

<Delete Files="%(ApiFileDefinition.ApiAdjustedXml)" />
<Delete Files="%(ApiFileDefinition.ClassParseXml)" />

</Target>

</Project>
5 changes: 5 additions & 0 deletions src/Mono.Android/Mono.Android.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,11 @@
<Compile Include="Xamarin.Android.Net\IAndroidAuthenticationModule.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\build-tools\api-xml-adjuster\api-xml-adjuster.csproj">
<Project>{8A6CB07C-E493-4A4F-AB94-038645A27118}</Project>
<Name>api-xml-adjuster</Name>
<ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>
<ProjectReference Include="..\..\build-tools\api-merge\api-merge.csproj">
<Project>{3FC3E78B-F7D4-42EA-BBE8-4535DF42BFF8}</Project>
<Name>api-merge</Name>
Expand Down
21 changes: 15 additions & 6 deletions src/Mono.Android/Mono.Android.targets
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,28 @@
/>
<Touch Files="Android.Runtime\JNIEnv.g.cs" />
</Target>
<ItemGroup>
<_AndroidProfile Include="Profiles\api-*.xml.in" />
</ItemGroup>
<Target Name="_GenerateApiDescription"
BeforeTargets="_GenerateBinding"
Inputs="Profiles\api-$(AndroidPlatformId).xml.in"
Inputs="..\..\bin\Build$(Configuration)\api\api-$(AndroidPlatformId).xml.in"
Outputs="$(IntermediateOutputPath)mcw\api.xml">
<MakeDir Directories="$(IntermediateOutputPath)mcw" />
<!-- This build targets is lame and designed in bogus mindset. ProjectReference is never designed properly to resolve required build
steps in explicitly-specifiable manner, and this target is actually
being built before ProjectReferences, therefore manual MSBuild
invocation is mandatory.
It is a result of lame dependency resolution hack, or design mistake
by choosing bogus technology called MSBuild.
-->
<MSBuild Projects="..\..\build-tools\api-xml-adjuster\api-xml-adjuster.csproj" />
<ItemGroup>
<_AndroidProfile Include="..\..\bin\Build$(Configuration)\api\api-*.xml.in" />
</ItemGroup>
<PropertyGroup>
<ApiMerge>..\..\bin\Build$(Configuration)\api-merge.exe</ApiMerge>
<_Profiles>@(_AndroidProfile->'%(Identity)', ' ')</_Profiles>
<_Glob>-s 'Profiles\api-*.xml.in'</_Glob>
<_LastProfile>--last-description=Profiles\api-$(AndroidPlatformId).xml.in</_LastProfile>
<_Glob>-s '..\..\bin\Build$(Configuration)\api\api-*.xml.in'</_Glob>
<_LastProfile>--last-description=..\..\bin\Build$(Configuration)\api\api-$(AndroidPlatformId).xml.in</_LastProfile>
<_Out>-o "$(IntermediateOutputPath)mcw\api.xml"</_Out>
</PropertyGroup>
<Exec
Expand Down

0 comments on commit 7d705bf

Please sign in to comment.