Skip to content

Commit 215d396

Browse files
[build] java is no longer required in PATH
Windows machines do not include Java in their path by default, so it is a better experience to not require it for the build. Changes to make this happen: - A new `JavaPaths` MSBuild task that sets `JAVA_HOME`, and can return the path to `javac` or `jar` - The `JdkInfo` task has been changed to inherit from `JavaPaths` - Usage of java command line tools througout the build are making use of `JavaPaths` now
1 parent bb808ad commit 215d396

File tree

8 files changed

+142
-65
lines changed

8 files changed

+142
-65
lines changed

build-tools/android-toolchain/android-toolchain.targets

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,12 @@
128128
<_AndroidMxeOutput Include="@(_AndroidMxeToolchain->'$(AndroidMxeFullPath)\%(Identity)\lib\libz.a')" />
129129
</ItemGroup>
130130
<Target Name="_AcceptAndroidSdkLicenses">
131-
<AcceptAndroidSdkLicenses AndroidSdkDirectory="$(AndroidSdkDirectory)" />
131+
<JavaPaths
132+
AndroidSdkPath="$(AndroidSdkPath)"
133+
AndroidNdkPath="$(AndroidNdkPath)"
134+
JavaSdkPath="$(JavaSdkDirectory)"
135+
/>
136+
<AcceptAndroidSdkLicenses AndroidSdkDirectory="$(AndroidSdkDirectory)" />
132137
</Target>
133138
<Target Name="_CreateMxeToolchains"
134139
DependsOnTargets="_SetMxeToolchainMakefileTimeToLastCommitTimestamp"

build-tools/dependencies/dependencies.projitems

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@
3434
<RequiredProgram Include="intltoolize" Condition=" '$(NeedMxe)' == 'true' And $(AndroidSupportedHostJitAbisForConditionalChecks.Contains (':mxe-Win64:'))">
3535
<Homebrew>intltool</Homebrew>
3636
</RequiredProgram>
37-
<RequiredProgram Include="javac">
37+
<RequiredProgram Include="$(_JavaC)">
3838
<MinimumVersion>1.8</MinimumVersion>
3939
<CurrentVersionCommand Condition=" '$(HostOS)' != 'Windows' ">$(MSBuildThisFileDirectory)..\scripts\javac-version</CurrentVersionCommand>
40-
<CurrentVersionCommand Condition=" '$(HostOS)' == 'Windows' ">javac -version 2&gt;&amp;1</CurrentVersionCommand>
40+
<CurrentVersionCommand Condition=" '$(HostOS)' == 'Windows' ">&quot;$(_JavaC)&quot; -version 2&gt;&amp;1</CurrentVersionCommand>
4141
<UbuntuInstall>$(_AptGetInstall) openjdk-8-jdk</UbuntuInstall>
4242
</RequiredProgram>
4343
<RequiredProgram Include="make" Condition=" '$(HostOS)' != 'Windows' " />

build-tools/scripts/JavaCallableWrappers.targets

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<UsingTask AssemblyFile="$(MSBuildThisFileDirectory)..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.JavaPaths" />
34
<Target Name="GenerateJavaCallableWrappers"
45
AfterTargets="$(JavaCallableWrapperAfterTargets)"
56
Inputs="$(JavaCallableWrapperAbsAssembly)"
67
Outputs="$(OutputPath)mono.android.jar">
8+
<JavaPaths
9+
AndroidSdkPath="$(AndroidSdkPath)"
10+
AndroidNdkPath="$(AndroidNdkPath)"
11+
JavaSdkPath="$(JavaSdkDirectory)">
12+
<Output TaskParameter="JavaC" PropertyName="_JavaC" />
13+
<Output TaskParameter="Jar" PropertyName="_Jar" />
14+
</JavaPaths>
715
<MakeDir Directories="$(IntermediateOutputPath)jcw;$(IntermediateOutputPath)jcw\bin" />
816
<PropertyGroup>
917
<OutputPathAbs Condition="$([System.IO.Path]::IsPathRooted($(OutputPath)))">$(OutputPath)</OutputPathAbs>
@@ -30,15 +38,15 @@
3038
<_MonoAndroidJar>$(OutputPath)mono.android.jar</_MonoAndroidJar>
3139
</PropertyGroup>
3240
<Exec
33-
Command="javac $(_Target) $(_D) -bootclasspath $(_AndroidJar)$(PathSeparator)&quot;$(_MonoAndroidJar)&quot; @$(IntermediateOutputPath)jcw\classes.txt"
41+
Command="&quot;$(_JavaC)&quot; $(_Target) $(_D) -bootclasspath $(_AndroidJar)$(PathSeparator)&quot;$(_MonoAndroidJar)&quot; @$(IntermediateOutputPath)jcw\classes.txt"
3442
/>
3543
<Exec
3644
Condition="Exists('$(_MonoAndroidJar)')"
37-
Command="jar uf &quot;$(_MonoAndroidJar)&quot; -C &quot;$(IntermediateOutputPath)jcw\bin&quot; ."
45+
Command="&quot;$(_Jar)&quot; uf &quot;$(_MonoAndroidJar)&quot; -C &quot;$(IntermediateOutputPath)jcw\bin&quot; ."
3846
/>
3947
<Exec
4048
Condition="!Exists('$(_MonoAndroidJar)')"
41-
Command="jar cf &quot;$(_MonoAndroidJar)&quot; -C &quot;$(IntermediateOutputPath)jcw\bin&quot; ."
49+
Command="&quot;$(_Jar)&quot; cf &quot;$(_MonoAndroidJar)&quot; -C &quot;$(IntermediateOutputPath)jcw\bin&quot; ."
4250
/>
4351
</Target>
4452
<Target Name="_GenerateMonoAndroidDex16"

build-tools/scripts/RequiredPrograms.targets

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@
44
<UsingTask AssemblyFile="$(MSBuildThisFileDirectory)..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.PrepareInstall" />
55
<UsingTask AssemblyFile="$(MSBuildThisFileDirectory)..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.Which" />
66
<UsingTask AssemblyFile="$(MSBuildThisFileDirectory)..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.GitCommitTime" />
7+
<UsingTask AssemblyFile="$(MSBuildThisFileDirectory)..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.JavaPaths" />
78
<Target Name="CheckForRequiredPrograms"
89
Condition=" '@(RequiredProgram)' != '' "
910
Inputs="@(RequiredProgram)"
1011
Outputs="%(RequiredProgram.Identity)-BATCH">
12+
<JavaPaths
13+
AndroidSdkPath="$(AndroidSdkPath)"
14+
AndroidNdkPath="$(AndroidNdkPath)"
15+
JavaSdkPath="$(JavaSdkDirectory)">
16+
<Output TaskParameter="JavaC" PropertyName="_JavaC" />
17+
</JavaPaths>
1118
<Which
1219
HostOS="$(HostOS)"
1320
HostOSName="$(HostOsName)"
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using Microsoft.Build.Framework;
2+
using Microsoft.Build.Utilities;
3+
using System;
4+
using System.IO;
5+
using Xamarin.Android.Build.Utilities;
6+
7+
namespace Xamarin.Android.BuildTools.PrepTasks
8+
{
9+
public class JavaPaths : Task
10+
{
11+
public string AndroidNdkPath { get; set; }
12+
13+
public string AndroidSdkPath { get; set; }
14+
15+
public string JavaSdkPath { get; set; }
16+
17+
[Output]
18+
public string JavaC { get; set; }
19+
20+
[Output]
21+
public string Jar { get; set; }
22+
23+
public override bool Execute ()
24+
{
25+
LogMessages ();
26+
27+
AndroidLogger.Error += ErrorHandler;
28+
AndroidLogger.Warning += WarningHandler;
29+
AndroidLogger.Info += InfoHandler;
30+
try {
31+
AndroidSdk.Refresh (AndroidSdkPath, AndroidNdkPath, JavaSdkPath);
32+
33+
var javaSdkPath = AndroidSdk.JavaSdkPath;
34+
if (string.IsNullOrEmpty (javaSdkPath)) {
35+
Log.LogError ("JavaSdkPath is blank");
36+
return false;
37+
}
38+
39+
Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidSdk.JavaSdkPath)}: {javaSdkPath}");
40+
41+
return SetOutput (javaSdkPath);
42+
} finally {
43+
AndroidLogger.Error -= ErrorHandler;
44+
AndroidLogger.Warning -= WarningHandler;
45+
AndroidLogger.Info -= InfoHandler;
46+
}
47+
}
48+
49+
protected virtual void LogMessages()
50+
{
51+
Log.LogMessage (MessageImportance.Low, $"Task {nameof (JavaPaths)}");
52+
Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidNdkPath)}: {AndroidNdkPath}");
53+
Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidSdkPath)}: {AndroidSdkPath}");
54+
Log.LogMessage (MessageImportance.Low, $" {nameof (JavaSdkPath)}: {JavaSdkPath}");
55+
}
56+
57+
protected virtual bool SetOutput(string javaSdkPath)
58+
{
59+
Environment.SetEnvironmentVariable ("JAVA_HOME", javaSdkPath);
60+
61+
var directories = new string [] { Path.Combine (javaSdkPath, "bin") };
62+
string _;
63+
JavaC = Which.GetProgramLocation ("javac", out _, directories);
64+
Jar = Which.GetProgramLocation ("jar", out _, directories);
65+
66+
return !Log.HasLoggedErrors;
67+
}
68+
69+
private void ErrorHandler (string task, string message)
70+
{
71+
Log.LogError ($"{task}: {message}");
72+
}
73+
74+
private void WarningHandler (string task, string message)
75+
{
76+
Log.LogWarning ($"{task}: {message}");
77+
}
78+
79+
private void InfoHandler (string task, string message)
80+
{
81+
Log.LogMessage (MessageImportance.Low, $"{task}: {message}");
82+
}
83+
}
84+
}
Lines changed: 20 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,44 @@
11
using Microsoft.Build.Framework;
2-
using Microsoft.Build.Utilities;
32
using System.Collections.Generic;
43
using System.IO;
54
using System.Text;
65
using Xamarin.Android.Build.Utilities;
76

87
namespace Xamarin.Android.BuildTools.PrepTasks
98
{
10-
public class JdkInfo : Task
9+
public class JdkInfo : JavaPaths
1110
{
1211
[Required]
1312
public ITaskItem Output { get; set; }
1413

15-
public string AndroidNdkPath { get; set; }
16-
17-
public string AndroidSdkPath { get; set; }
18-
19-
public string JavaSdkPath { get; set; }
20-
21-
public override bool Execute ()
14+
protected override void LogMessages()
2215
{
2316
Log.LogMessage (MessageImportance.Low, $"Task {nameof (JdkInfo)}");
2417
Log.LogMessage (MessageImportance.Low, $" {nameof (Output)}: {Output}");
2518
Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidNdkPath)}: {AndroidNdkPath}");
2619
Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidSdkPath)}: {AndroidSdkPath}");
2720
Log.LogMessage (MessageImportance.Low, $" {nameof (JavaSdkPath)}: {JavaSdkPath}");
21+
}
2822

29-
AndroidLogger.Error += ErrorHandler;
30-
AndroidLogger.Warning += WarningHandler;
31-
AndroidLogger.Info += InfoHandler;
32-
try {
33-
AndroidSdk.Refresh (AndroidSdkPath, AndroidNdkPath, JavaSdkPath);
34-
35-
var javaSdkPath = AndroidSdk.JavaSdkPath;
36-
if (string.IsNullOrEmpty(javaSdkPath)) {
37-
Log.LogError ("JavaSdkPath is blank");
38-
return false;
39-
}
40-
41-
Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidSdk.JavaSdkPath)}: {javaSdkPath}");
42-
43-
var jvmPath = Path.Combine (javaSdkPath, "jre", "bin", "server", "jvm.dll");
44-
if (!File.Exists (jvmPath)) {
45-
Log.LogError ($"JdkJvmPath not found at {jvmPath}");
46-
return false;
47-
}
23+
protected override bool SetOutput (string javaSdkPath)
24+
{
25+
var jvmPath = Path.Combine (javaSdkPath, "jre", "bin", "server", "jvm.dll");
26+
if (!File.Exists (jvmPath)) {
27+
Log.LogError ($"JdkJvmPath not found at {jvmPath}");
28+
return false;
29+
}
4830

49-
var javaIncludePath = Path.Combine (javaSdkPath, "include");
50-
var includes = new List<string> { javaIncludePath };
51-
includes.AddRange (Directory.GetDirectories (javaIncludePath)); //Include dirs such as "win32"
31+
var javaIncludePath = Path.Combine (javaSdkPath, "include");
32+
var includes = new List<string> { javaIncludePath };
33+
includes.AddRange (Directory.GetDirectories (javaIncludePath)); //Include dirs such as "win32"
5234

53-
var includeXmlTags = new StringBuilder ();
54-
foreach (var include in includes) {
55-
includeXmlTags.AppendLine ($"<JdkIncludePath Include=\"{include}\" />");
56-
}
35+
var includeXmlTags = new StringBuilder ();
36+
foreach (var include in includes) {
37+
includeXmlTags.AppendLine ($"<JdkIncludePath Include=\"{include}\" />");
38+
}
5739

58-
Directory.CreateDirectory (Path.GetDirectoryName (Output.ItemSpec));
59-
File.WriteAllText (Output.ItemSpec, $@"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
40+
Directory.CreateDirectory (Path.GetDirectoryName (Output.ItemSpec));
41+
File.WriteAllText (Output.ItemSpec, $@"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
6042
<Choose>
6143
<When Condition="" '$(JdkJvmPath)' == '' "">
6244
<PropertyGroup>
@@ -69,28 +51,7 @@ public override bool Execute ()
6951
</Choose>
7052
</Project>");
7153

72-
return !Log.HasLoggedErrors;
73-
}
74-
finally {
75-
AndroidLogger.Error -= ErrorHandler;
76-
AndroidLogger.Warning -= WarningHandler;
77-
AndroidLogger.Info -= InfoHandler;
78-
}
79-
}
80-
81-
private void ErrorHandler (string task, string message)
82-
{
83-
Log.LogError ($"{task}: {message}");
84-
}
85-
86-
private void WarningHandler (string task, string message)
87-
{
88-
Log.LogWarning ($"{task}: {message}");
89-
}
90-
91-
private void InfoHandler (string task, string message)
92-
{
93-
Log.LogMessage (MessageImportance.Low, $"{task}: {message}");
54+
return !Log.HasLoggedErrors;
9455
}
9556
}
9657
}

build-tools/xa-prep-tasks/xa-prep-tasks.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
<Compile Include="Xamarin.Android.BuildTools.PrepTasks\GitCommitHash.cs" />
4444
<Compile Include="Xamarin.Android.BuildTools.PrepTasks\GitCommitTime.cs" />
4545
<Compile Include="Xamarin.Android.BuildTools.PrepTasks\HashFileContents.cs" />
46+
<Compile Include="Xamarin.Android.BuildTools.PrepTasks\JavaPaths.cs" />
4647
<Compile Include="Xamarin.Android.BuildTools.PrepTasks\JdkInfo.cs" />
4748
<Compile Include="Xamarin.Android.BuildTools.PrepTasks\PathToolTask.cs" />
4849
<Compile Include="Xamarin.Android.BuildTools.PrepTasks\SystemUnzip.cs" />

src/proguard/proguard.targets

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2+
<UsingTask AssemblyFile="$(MSBuildThisFileDirectory)..\..\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.JavaPaths" />
23
<Target Name="_BuildProGuard">
4+
<JavaPaths
5+
AndroidSdkPath="$(AndroidSdkPath)"
6+
AndroidNdkPath="$(AndroidNdkPath)"
7+
JavaSdkPath="$(JavaSdkDirectory)"
8+
/>
39
<Exec
410
Command="$(AntDirectory)\bin\ant -verbose -f buildscripts\build.xml proguard"
511
WorkingDirectory="$(ProGuardSourceFullPath)"
@@ -24,6 +30,11 @@
2430
</Target>
2531
<Target Name="_CleanProGuard"
2632
AfterTargets="Clean">
33+
<JavaPaths
34+
AndroidSdkPath="$(AndroidSdkPath)"
35+
AndroidNdkPath="$(AndroidNdkPath)"
36+
JavaSdkPath="$(JavaSdkDirectory)"
37+
/>
2738
<Delete Files="$(OutputPath)\license.html" />
2839
<Delete Files="$(OutputPath)\lib\proguard.jar" />
2940
<Delete Files="$(OutputPath)\bin\proguard.sh" />

0 commit comments

Comments
 (0)