Skip to content

Commit 9192828

Browse files
[jdk] Don't require javac/jar 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: - `JavaCPath` and `JarPath` are configured in `Configuration.OperatingSystem.props` - Usage of `javac` and `jar` across the repo use appropriate variables now - `generate-os-info` needs to set `JavaCPath` and `JarPath` - Created a new `<Ant>` MSBuild task - A couple places, Windows needs `JAVA_HOME` to be set, so we are doing this via `Environment.SetEnvironmentVariable` in a couple MSBuild tasks - `Configuration.OperatingSystem.props` is conditional, so it is possible to build xa-prep-tasks without it - `Which` needs to accept files without extensions last for Windows, `PATHEXT` should be empty on Unix
1 parent 100ca99 commit 9192828

File tree

20 files changed

+114
-39
lines changed

20 files changed

+114
-39
lines changed

Configuration.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
/>
1010
<Import
1111
Project="$(MSBuildThisFileDirectory)Configuration.OperatingSystem.props"
12-
Condition=" '$(DoNotLoadOSProperties)' != 'True' "
12+
Condition=" Exists('$(MSBuildThisFileDirectory)Configuration.OperatingSystem.props') And '$(DoNotLoadOSProperties)' != 'True' "
1313
/>
1414
<PropertyGroup>
1515
<ProductVersion>8.0.99</ProductVersion>
@@ -48,6 +48,7 @@
4848
<AndroidSdkDirectory>$(AndroidToolchainDirectory)\sdk</AndroidSdkDirectory>
4949
<AndroidNdkDirectory>$(AndroidToolchainDirectory)\ndk</AndroidNdkDirectory>
5050
<AntDirectory>$(AndroidToolchainDirectory)\ant</AntDirectory>
51+
<AntToolPath>$(AntDirectory)\bin</AntToolPath>
5152
<AndroidSupportedHostJitAbis Condition=" '$(AndroidSupportedHostJitAbis)' == '' ">$(HostOS)</AndroidSupportedHostJitAbis>
5253
<AndroidSupportedTargetJitAbis Condition=" '$(AndroidSupportedTargetJitAbis)' == '' ">armeabi-v7a:x86</AndroidSupportedTargetJitAbis>
5354
<JavaInteropSourceDirectory Condition=" '$(JavaInteropSourceDirectory)' == '' ">$(MSBuildThisFileDirectory)external\Java.Interop</JavaInteropSourceDirectory>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@
128128
<_AndroidMxeOutput Include="@(_AndroidMxeToolchain->'$(AndroidMxeFullPath)\%(Identity)\lib\libz.a')" />
129129
</ItemGroup>
130130
<Target Name="_AcceptAndroidSdkLicenses">
131-
<AcceptAndroidSdkLicenses AndroidSdkDirectory="$(AndroidSdkDirectory)" />
131+
<AcceptAndroidSdkLicenses AndroidSdkDirectory="$(AndroidSdkDirectory)" JavaSdkDirectory="$(JavaSdkDirectory)" />
132132
</Target>
133133
<Target Name="_CreateMxeToolchains"
134134
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="$(JavaCPath)">
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;$(JavaCPath)&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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@
3030
<_MonoAndroidJar>$(OutputPath)mono.android.jar</_MonoAndroidJar>
3131
</PropertyGroup>
3232
<Exec
33-
Command="javac $(_Target) $(_D) -bootclasspath $(_AndroidJar)$(PathSeparator)&quot;$(_MonoAndroidJar)&quot; @$(IntermediateOutputPath)jcw\classes.txt"
33+
Command="&quot;$(JavaCPath)&quot; $(_Target) $(_D) -bootclasspath $(_AndroidJar)$(PathSeparator)&quot;$(_MonoAndroidJar)&quot; @$(IntermediateOutputPath)jcw\classes.txt"
3434
/>
3535
<Exec
3636
Condition="Exists('$(_MonoAndroidJar)')"
37-
Command="jar uf &quot;$(_MonoAndroidJar)&quot; -C &quot;$(IntermediateOutputPath)jcw\bin&quot; ."
37+
Command="&quot;$(JarPath)&quot; uf &quot;$(_MonoAndroidJar)&quot; -C &quot;$(IntermediateOutputPath)jcw\bin&quot; ."
3838
/>
3939
<Exec
4040
Condition="!Exists('$(_MonoAndroidJar)')"
41-
Command="jar cf &quot;$(_MonoAndroidJar)&quot; -C &quot;$(IntermediateOutputPath)jcw\bin&quot; ."
41+
Command="&quot;$(JarPath)&quot; cf &quot;$(_MonoAndroidJar)&quot; -C &quot;$(IntermediateOutputPath)jcw\bin&quot; ."
4242
/>
4343
</Target>
4444
<Target Name="_GenerateMonoAndroidDex16"

build-tools/scripts/PrepareWindows.targets

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,27 @@
55
<_TopDir>$(MSBuildThisFileDirectory)..\..</_TopDir>
66
<_NuGet>.nuget\NuGet.exe</_NuGet>
77
</PropertyGroup>
8-
<ItemGroup>
9-
<_ConfigurationFile Include="Windows-Configuration.OperatingSystem.props">
10-
<Destination>$(_TopDir)\Configuration.OperatingSystem.props</Destination>
11-
</_ConfigurationFile>
12-
<_ConfigurationFile Include="Configuration.Java.Interop.Override.props">
13-
<Destination>$(_TopDir)\external\Java.Interop\Configuration.Override.props</Destination>
14-
</_ConfigurationFile>
15-
</ItemGroup>
168
<UsingTask AssemblyFile="$(_TopDir)\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.JdkInfo" />
9+
<UsingTask AssemblyFile="$(_TopDir)\bin\Build$(Configuration)\xa-prep-tasks.dll" TaskName="Xamarin.Android.BuildTools.PrepTasks.ReplaceFileContents" />
1710
<Target Name="Prepare">
1811
<Exec Command="git submodule update --init --recursive" WorkingDirectory="$(_TopDir)" />
19-
<Copy
20-
SourceFiles="@(_ConfigurationFile)"
21-
DestinationFiles="@(_ConfigurationFile->'%(Destination)')"
22-
SkipUnchangedFiles="True"
23-
/>
2412
<MSBuild Projects="$(MSBuildThisFileDirectory)..\xa-prep-tasks\xa-prep-tasks.csproj" />
2513
<JdkInfo
2614
AndroidSdkPath="$(AndroidSdkPath)"
2715
AndroidNdkPath="$(AndroidNdkPath)"
2816
JavaSdkPath="$(JavaSdkDirectory)"
29-
Output="$(_TopDir)\external\Java.Interop\bin\BuildDebug\JdkInfo.props"
17+
Output="$(_TopDir)\external\Java.Interop\bin\BuildDebug\JdkInfo.props">
18+
<Output TaskParameter="JavaSdkDirectory" PropertyName="_JavaSdkDirectory" />
19+
</JdkInfo>
20+
<Copy
21+
SourceFiles="Configuration.Java.Interop.Override.props"
22+
DestinationFiles="$(_TopDir)\external\Java.Interop\Configuration.Override.props"
23+
SkipUnchangedFiles="True"
24+
/>
25+
<ReplaceFileContents
26+
SourceFile="Windows-Configuration.OperatingSystem.props.in"
27+
DestinationFile="$(_TopDir)\Configuration.OperatingSystem.props"
28+
Replacements="@JAVA_HOME@=$(_JavaSdkDirectory)"
3029
/>
3130
<Exec Command="$(_NuGet) restore Xamarin.Android.sln" WorkingDirectory="$(_TopDir)" />
3231
<Exec Command="$(_NuGet) restore external\Java.Interop\Java.Interop.sln" WorkingDirectory="$(_TopDir)" />

build-tools/scripts/Windows-Configuration.OperatingSystem.props renamed to build-tools/scripts/Windows-Configuration.OperatingSystem.props.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,8 @@
99
<HostTriplet64 Condition=" '$(HostTriplet64)' == '' ">x86_64-win32</HostTriplet64>
1010
<HostCpuCount Condition=" '$(HostCpuCount)' == '' ">$([System.Environment]::ProcessorCount)</HostCpuCount>
1111
<HostBits Condition=" '$(HostBits)' == '' ">64</HostBits>
12+
<JavaSdkDirectory>@JAVA_HOME@</JavaSdkDirectory>
13+
<JavaCPath>$(JavaSdkDirectory)\bin\javac.exe</JavaCPath>
14+
<JarPath>$(JavaSdkDirectory)\bin\jar.exe</JarPath>
1215
</PropertyGroup>
1316
</Project>

build-tools/scripts/generate-os-info

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ cat <<EOF > "$1"
120120
<HostCc64 Condition=" '\$(HostCc64)' == '' ">$HOST_CC64</HostCc64>
121121
<HostCxx32 Condition=" '\$(HostCxx32)' == '' ">$HOST_CXX32</HostCxx32>
122122
<HostCxx64 Condition=" '\$(HostCxx64)' == '' ">$HOST_CXX64</HostCxx64>
123+
<JavaCPath Condition=" '\$(JavaCPath)' == '' ">javac</JavaCPath>
124+
<JarPath Condition=" '\$(JarPath)' == '' ">jar</JarPath>
123125
</PropertyGroup>
124126
</Project>
125127
EOF

build-tools/xa-prep-tasks/Xamarin.Android.BuildTools.PrepTasks/AcceptAndroidSdkLicenses.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,21 @@ public class AcceptAndroidSdkLicenses : Task
1111
[Required]
1212
public string AndroidSdkDirectory { get; set; }
1313

14+
public string JavaSdkDirectory { get; set; }
15+
1416
public override bool Execute ()
1517
{
18+
Log.LogMessage (MessageImportance.Low, $"Task {nameof (AcceptAndroidSdkLicenses)}");
19+
Log.LogMessage (MessageImportance.Low, $" {nameof (AndroidSdkDirectory)}: {AndroidSdkDirectory}");
20+
Log.LogMessage (MessageImportance.Low, $" {nameof (JavaSdkDirectory)}: {JavaSdkDirectory}");
21+
1622
var licdir = Path.Combine (Path.Combine (AndroidSdkDirectory, "licenses"));
1723
Directory.CreateDirectory (licdir);
1824

25+
if (!string.IsNullOrEmpty (JavaSdkDirectory)) {
26+
Environment.SetEnvironmentVariable ("JAVA_HOME", JavaSdkDirectory);
27+
}
28+
1929
string _;
2030
var path = Which.GetProgramLocation ("sdkmanager", out _, new [] { Path.Combine (AndroidSdkDirectory, "tools", "bin") });
2131
var psi = new ProcessStartInfo (path, "--licenses") { UseShellExecute = false, RedirectStandardInput = true };

build-tools/xa-prep-tasks/Xamarin.Android.BuildTools.PrepTasks/JdkInfo.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public class JdkInfo : Task
1818

1919
public string JavaSdkPath { get; set; }
2020

21+
[Output]
22+
public string JavaSdkDirectory { get; set; }
23+
2124
public override bool Execute ()
2225
{
2326
Log.LogMessage (MessageImportance.Low, $"Task {nameof (JdkInfo)}");
@@ -67,8 +70,15 @@ public override bool Execute ()
6770
</ItemGroup>
6871
</When>
6972
</Choose>
73+
<PropertyGroup>
74+
<JavaCPath Condition="" '$(JavaCPath)' == '' "">{Path.Combine (javaSdkPath, "bin", "javac.exe")}</JavaCPath>
75+
<JarPath Condition="" '$(JarPath)' == '' "">{Path.Combine (javaSdkPath, "bin", "jar.exe")}</JarPath>
76+
</PropertyGroup>
7077
</Project>");
7178

79+
JavaSdkDirectory = javaSdkPath;
80+
Log.LogMessage (MessageImportance.Low, $" [Output] {nameof (JavaSdkDirectory)}: {JavaSdkDirectory}");
81+
7282
return !Log.HasLoggedErrors;
7383
}
7484
finally {

build-tools/xa-prep-tasks/Xamarin.Android.BuildTools.PrepTasks/Which.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ static Which ()
3131
var pathExt = Environment.GetEnvironmentVariable ("PATHEXT");
3232
var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
3333
FileExtensions = new string [(pathExts?.Length ?? 0) + 1];
34-
FileExtensions [0] = null;
3534
if (pathExts != null) {
36-
Array.Copy (pathExts, 0, FileExtensions, 1, pathExts.Length);
35+
Array.Copy (pathExts, 0, FileExtensions, 0, pathExts.Length);
3736
}
37+
FileExtensions [FileExtensions.Length - 1] = null;
3838
}
3939

4040
public static string GetProgramLocation (string programBasename, out string filename, string[] directories = null)

0 commit comments

Comments
 (0)