Skip to content

Commit 32f0c9c

Browse files
authored
[Java.Interop.BootstrapTasks] Use JdkInfo (#349)
Context: dotnet/android-tools#29 (comment) Bumps to xamarin/xamarin-android-tools:master@75530565 The `<JdkInfo/>` task within `Java.Interop.BootstrapTasks.dll` isn't the *only* thing that needs to determine the path of an installed JDK. The IDEs could also use such functionality, as could xamarin-android. Add a submodule reference to xamarin-android-tools, and use `Xamarin.Android.Tools.JdkInfo` to find the preferred JDK, instead of having lots of custom probing with the `<JdkInfo/>` task. Finally, for consistency, move `src/Java.Interop.BootstrapTasks` to `build-tools/Java.Interop.BootstrapTasks`, as the `Java.Interop.BootstrapTasks.dll` assembly is only intended for in building Java.Interop *itself*, and not for "downlevel" distribution.
1 parent 78f7301 commit 32f0c9c

File tree

14 files changed

+160
-628
lines changed

14 files changed

+160
-628
lines changed

.gitmodules

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@
66
path = external/cecil
77
url = https://github.com/mono/cecil.git
88
branch = master
9+
[submodule "external/xamarin-android-tools"]
10+
path = external/xamarin-android-tools
11+
url = https://github.com/xamarin/xamarin-android-tools.git
12+
branch = master

Configuration.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
<PropertyGroup>
1717
<CecilSourceDirectory Condition=" '$(CecilSourceDirectory)' == '' ">$(MSBuildThisFileDirectory)external\cecil</CecilSourceDirectory>
1818
<UtilityOutputFullPath Condition=" '$(UtilityOutputFullPath)' == '' ">$(MSBuildThisFileDirectory)bin\$(Configuration)\</UtilityOutputFullPath>
19+
<XamarinAndroidToolsDirectory Condition=" '$(XamarinAndroidToolsDirectory)' == '' ">$(MSBuildThisFileDirectory)external\xamarin-android-tools</XamarinAndroidToolsDirectory>
1920
</PropertyGroup>
2021
<PropertyGroup>
2122
<CecilFullPath>$([System.IO.Path]::GetFullPath ('$(CecilSourceDirectory)'))</CecilFullPath>
23+
<XamarinAndroidToolsFullPath>$([System.IO.Path]::GetFullPath ('$(XamarinAndroidToolsDirectory)'))</XamarinAndroidToolsFullPath>
2224
</PropertyGroup>
2325
</Project>

Java.Interop.sln

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{4C173212-3
1717
EndProject
1818
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Java.Interop", "src\Java.Interop\Java.Interop.csproj", "{94BD81F7-B06F-4295-9636-F8A3B6BDC762}"
1919
EndProject
20-
Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "java-interop", "src\java-interop\java-interop.csproj", "{BB0AB9F7-0979-41A7-B7A9-877260655F94}"
20+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "java-interop", "src\java-interop\java-interop.csproj", "{BB0AB9F7-0979-41A7-B7A9-877260655F94}"
2121
EndProject
2222
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Java.Interop.Dynamic", "src\Java.Interop.Dynamic\Java.Interop.Dynamic.csproj", "{AD4468F8-8883-434B-9D4C-E1801BB3B52A}"
2323
EndProject
@@ -97,7 +97,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Cecil.Mdb",
9797
EndProject
9898
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Java.Interop.GenericMarshaler", "src\Java.Interop.GenericMarshaler\Java.Interop.GenericMarshaler.csproj", "{D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF}"
9999
EndProject
100-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Java.Interop.BootstrapTasks", "src\Java.Interop.BootstrapTasks\Java.Interop.BootstrapTasks.csproj", "{3E8E5C8C-59A6-4A9A-B55D-46AB14431B2A}"
100+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Java.Interop.BootstrapTasks", "build-tools\Java.Interop.BootstrapTasks\Java.Interop.BootstrapTasks.csproj", "{3E8E5C8C-59A6-4A9A-B55D-46AB14431B2A}"
101+
EndProject
102+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Android.Tools.AndroidSdk", "external\xamarin-android-tools\src\Xamarin.Android.Tools.AndroidSdk\Xamarin.Android.Tools.AndroidSdk.csproj", "{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}"
101103
EndProject
102104
Global
103105
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -349,6 +351,14 @@ Global
349351
{3E8E5C8C-59A6-4A9A-B55D-46AB14431B2A}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU
350352
{3E8E5C8C-59A6-4A9A-B55D-46AB14431B2A}.XAIntegrationRelease|Any CPU.ActiveCfg = Release|Any CPU
351353
{3E8E5C8C-59A6-4A9A-B55D-46AB14431B2A}.XAIntegrationRelease|Any CPU.Build.0 = Release|Any CPU
354+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
355+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Debug|Any CPU.Build.0 = Debug|Any CPU
356+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|Any CPU.ActiveCfg = Release|Any CPU
357+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.Release|Any CPU.Build.0 = Release|Any CPU
358+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationDebug|Any CPU.ActiveCfg = Debug|Any CPU
359+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationDebug|Any CPU.Build.0 = Debug|Any CPU
360+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationRelease|Any CPU.ActiveCfg = Release|Any CPU
361+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}.XAIntegrationRelease|Any CPU.Build.0 = Release|Any CPU
352362
EndGlobalSection
353363
GlobalSection(NestedProjects) = preSolution
354364
{0C001D50-4176-45AE-BDC8-BA626508B0CC} = {C8F58966-94BF-407F-914A-8654F8B8AE3B}
@@ -392,5 +402,6 @@ Global
392402
{C0487169-8F81-497F-919E-EB42B1D0243F} = {C8F58966-94BF-407F-914A-8654F8B8AE3B}
393403
{D1243BAB-23CA-4566-A2A3-3ADA2C2DC3AF} = {4C173212-371D-45D8-BA83-9226194F48DC}
394404
{3E8E5C8C-59A6-4A9A-B55D-46AB14431B2A} = {172B608B-E6F3-41CC-9949-203A76BA247C}
405+
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157} = {172B608B-E6F3-41CC-9949-203A76BA247C}
395406
EndGlobalSection
396407
EndGlobal

Makefile

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ PACKAGES = \
2020
packages/NUnit.3.7.1/NUnit.3.7.1.nupkg \
2121
packages/NUnit.Console.3.7.0/NUnit.Console.3.7.0.nupkg
2222

23+
PREPARE_EXTERNAL_FILES = \
24+
external/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Xamarin.Android.Tools.AndroidSdk.csproj
25+
2326
DEPENDENCIES = \
2427
bin/Test$(CONFIGURATION)/libNativeTiming$(NATIVE_EXT)
2528

@@ -55,16 +58,18 @@ run-all-tests: run-tests run-test-jnimarshal run-test-generator-core run-ptests
5558

5659
include build-tools/scripts/msbuild.mk
5760

58-
prepare:: prepare-bootstrap prepare-external
61+
prepare:: prepare-bootstrap
5962

60-
prepare-bootstrap: bin/Build$(CONFIGURATION)/Java.Interop.BootstrapTasks.dll
63+
prepare-bootstrap: prepare-external bin/Build$(CONFIGURATION)/Java.Interop.BootstrapTasks.dll
6164

62-
bin/Build$(CONFIGURATION)/Java.Interop.BootstrapTasks.dll: src/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks.csproj \
63-
$(wildcard src/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks/*.cs)
64-
$(MSBUILD) $(MSBUILD_FLAGS) src/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks.csproj
65+
bin/Build$(CONFIGURATION)/Java.Interop.BootstrapTasks.dll: build-tools/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks.csproj \
66+
external/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Xamarin.Android.Tools.AndroidSdk.csproj \
67+
$(wildcard build-tools/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks/*.cs)
68+
$(MSBUILD) $(MSBUILD_FLAGS) "$<"
6569

66-
prepare-external: $(PACKAGES) $(NUNIT_CONSOLE)
70+
prepare-external $(PREPARE_EXTERNAL_FILES): $(PACKAGES) $(NUNIT_CONSOLE)
6771
git submodule update --init --recursive
72+
(cd external/xamarin-android-tools && $(MAKE) prepare)
6873

6974
clean:
7075
-$(MSBUILD) $(MSBUILD_FLAGS) /t:Clean

src/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks.csproj renamed to build-tools/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks.csproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@
4141
<Compile Include="Java.Interop.BootstrapTasks\DownloadUri.cs" />
4242
<Compile Include="Java.Interop.BootstrapTasks\JdkInfo.cs" />
4343
<Compile Include="Java.Interop.BootstrapTasks\OS.cs" />
44-
<Compile Include="Java.Interop.BootstrapTasks\RegistryEx.cs" />
4544
<Compile Include="Java.Interop.BootstrapTasks\SetEnvironmentVariable.cs" />
4645
<Compile Include="Properties\AssemblyInfo.cs" />
4746
</ItemGroup>
47+
<ItemGroup>
48+
<ProjectReference Include="$(XamarinAndroidToolsFullPath)\src\Xamarin.Android.Tools.AndroidSdk\Xamarin.Android.Tools.AndroidSdk.csproj">
49+
<Project>{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}</Project>
50+
<Name>Xamarin.Android.Tools.AndroidSdk</Name>
51+
</ProjectReference>
52+
</ItemGroup>
4853
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
4954
</Project>
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
using Microsoft.Build.Framework;
2+
using Microsoft.Build.Utilities;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Diagnostics;
6+
using System.IO;
7+
using System.Linq;
8+
using System.Text;
9+
using System.Text.RegularExpressions;
10+
using System.Xml.Linq;
11+
12+
using Xamarin.Android.Tools;
13+
14+
using XATInfo = Xamarin.Android.Tools.JdkInfo;
15+
16+
namespace Java.Interop.BootstrapTasks
17+
{
18+
public class JdkInfo : Task
19+
{
20+
const string JARSIGNER = "jarsigner.exe";
21+
const string MDREG_KEY = @"SOFTWARE\Novell\Mono for Android";
22+
const string MDREG_JAVA_SDK = "JavaSdkDirectory";
23+
24+
public string JdksRoot { get; set; }
25+
26+
public string MaximumJdkVersion { get; set; }
27+
28+
static Regex VersionExtractor = new Regex (@"(?<version>[\d]+(\.\d+)+)", RegexOptions.Compiled);
29+
30+
[Required]
31+
public ITaskItem PropertyFile { get; set; }
32+
33+
[Required]
34+
public ITaskItem MakeFragmentFile { get; set; }
35+
36+
[Output]
37+
public string JavaHomePath { get; set; }
38+
39+
public override bool Execute ()
40+
{
41+
var maxVersion = GetVersion (MaximumJdkVersion);
42+
43+
XATInfo jdk = XATInfo.GetKnownSystemJdkInfos (CreateLogger ())
44+
.Where (j => maxVersion != null ? j.Version <= maxVersion : true)
45+
.FirstOrDefault ();
46+
47+
if (jdk == null) {
48+
Log.LogError ("Could not determine JAVA_HOME location. Please set JdksRoot or export the JAVA_HOME environment variable.");
49+
return false;
50+
}
51+
52+
JavaHomePath = jdk.HomePath;
53+
54+
Directory.CreateDirectory (Path.GetDirectoryName (PropertyFile.ItemSpec));
55+
Directory.CreateDirectory (Path.GetDirectoryName (MakeFragmentFile.ItemSpec));
56+
57+
WritePropertyFile (jdk.JarPath, jdk.JavacPath, jdk.JdkJvmPath, jdk.IncludePath);
58+
WriteMakeFragmentFile (jdk.JarPath, jdk.JavacPath, jdk.JdkJvmPath, jdk.IncludePath);
59+
60+
return !Log.HasLoggedErrors;
61+
}
62+
63+
Version GetVersion (string value)
64+
{
65+
if (string.IsNullOrEmpty (value))
66+
return null;
67+
if (!value.Contains (".")) {
68+
value += ".0";
69+
}
70+
Version v;
71+
if (Version.TryParse (value, out v))
72+
return v;
73+
return null;
74+
}
75+
76+
Action<TraceLevel, string> CreateLogger ()
77+
{
78+
Action<TraceLevel, string> logger = (level, value) => {
79+
switch (level) {
80+
case TraceLevel.Error:
81+
Log.LogError ("{0}", value);
82+
break;
83+
case TraceLevel.Warning:
84+
Log.LogWarning ("{0}", value);
85+
break;
86+
default:
87+
Log.LogMessage (MessageImportance.Low, "{0}", value);
88+
break;
89+
}
90+
};
91+
return logger;
92+
}
93+
94+
void WritePropertyFile (string jarPath, string javacPath, string jdkJvmPath, IEnumerable<string> includes)
95+
{
96+
var msbuild = XNamespace.Get ("http://schemas.microsoft.com/developer/msbuild/2003");
97+
var project = new XElement (msbuild + "Project",
98+
new XElement (msbuild + "Choose",
99+
new XElement (msbuild + "When", new XAttribute ("Condition", " '$(JdkJvmPath)' == '' "),
100+
new XElement (msbuild + "PropertyGroup",
101+
new XElement (msbuild + "JdkJvmPath", jdkJvmPath)),
102+
new XElement (msbuild + "ItemGroup",
103+
includes.Select (i => new XElement (msbuild + "JdkIncludePath", new XAttribute ("Include", i)))))),
104+
new XElement (msbuild + "PropertyGroup",
105+
new XElement (msbuild + "JavaCPath", new XAttribute ("Condition", " '$(JavaCPath)' == '' "),
106+
javacPath),
107+
new XElement (msbuild + "JarPath", new XAttribute ("Condition", " '$(JarPath)' == '' "),
108+
jarPath)));
109+
project.Save (PropertyFile.ItemSpec);
110+
}
111+
112+
void WriteMakeFragmentFile (string jarPath, string javacPath, string jdkJvmPath, IEnumerable<string> includes)
113+
{
114+
using (var o = new StreamWriter (MakeFragmentFile.ItemSpec)) {
115+
o.WriteLine ($"export JI_JAR_PATH := {jarPath}");
116+
o.WriteLine ($"export JI_JAVAC_PATH := {javacPath}");
117+
o.WriteLine ($"export JI_JDK_INCLUDE_PATHS := {string.Join (" ", includes)}");
118+
o.WriteLine ($"export JI_JVM_PATH := {jdkJvmPath}");
119+
}
120+
}
121+
}
122+
}

src/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks/OS.cs renamed to build-tools/Java.Interop.BootstrapTasks/Java.Interop.BootstrapTasks/OS.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,5 @@ class OS {
66
public static readonly bool IsWindows = Path.DirectorySeparatorChar == '\\';
77
public static readonly bool IsMacOS = !IsWindows && Directory.Exists ("/Applications");
88
public static readonly bool IsLinux = !IsWindows && !IsMacOS;
9-
10-
public static readonly string NativeLibraryFormat;
11-
12-
static OS ()
13-
{
14-
if (IsWindows)
15-
NativeLibraryFormat = "{0}.dll";
16-
if (IsMacOS)
17-
NativeLibraryFormat = "lib{0}.dylib";
18-
if (IsLinux)
19-
NativeLibraryFormat = "lib{0}.so";
20-
}
219
}
2210
}

build-tools/scripts/PrepareWindows.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<UsingTask AssemblyFile="$(_TopDir)\bin\Build$(Configuration)\Java.Interop.BootstrapTasks.dll" TaskName="Java.Interop.BootstrapTasks.DownloadUri" />
1313
<Target Name="Prepare">
1414
<Exec Command="git submodule update --init --recursive" WorkingDirectory="$(_TopDir)" />
15-
<MSBuild Projects="$(MSBuildThisFileDirectory)..\..\src\Java.Interop.BootstrapTasks\Java.Interop.BootstrapTasks.csproj" />
15+
<MSBuild Projects="$(MSBuildThisFileDirectory)..\..\build-tools\Java.Interop.BootstrapTasks\Java.Interop.BootstrapTasks.csproj" />
1616
<MakeDir Directories="$(_NuGetPath)" />
1717
<DownloadUri
1818
SourceUris="$(_NuGetUri)"

external/xamarin-android-tools

Submodule xamarin-android-tools added at 7553056

0 commit comments

Comments
 (0)