Skip to content

Commit f4d1109

Browse files
committed
Build java-interop.dll for x86, x64
A problem since 6ede47a is that 32-bit and 64-bit execution environments (1) are A Thing, and (2) won't be going away. Thus building `java-interop.dll` for only one architecture isn't a scalable solution. "Embrace" this, and rework the `src/java-interop` build system to run `cmake` *separately* for 32-bit and 64-bit libraries.
1 parent e4be4ed commit f4d1109

File tree

4 files changed

+101
-38
lines changed

4 files changed

+101
-38
lines changed

build-tools/scripts/NativeToolchain.targets

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<Project DefaultTargets="Prepare" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2+
<Project>
33
<Target Name="GetNativeBuildCommands">
4-
<ItemGroup>
4+
<ItemGroup Condition=" '$(VSINSTALLROOT)' != '' And Exists('$(VSINSTALLROOT)') ">
55
<_Vcvarsall
6-
Condition=" '$(VSINSTALLROOT)' != '' And Exists('$(VSINSTALLROOT)') "
76
Include="$(VSINSTALLROOT)\VC\Auxiliary\Build\vcvarsall.bat"
87
/>
98
</ItemGroup>
109
<PropertyGroup Condition=" '@(_Vcvarsall->Count())' != '0' ">
1110
<_Vcvarsall>%(_Vcvarsall.Identity)</_Vcvarsall>
12-
<PrepareNativeToolchain>call "$(_Vcvarsall)" x86_amd64 &amp;&amp; </PrepareNativeToolchain>
13-
</PropertyGroup>
14-
<PropertyGroup>
15-
<NativeToolchainMake Condition=" '$(OS)' != 'Windows_NT' ">make</NativeToolchainMake>
16-
<NativeToolchainMake Condition=" '$(OS)' == 'Windows_NT' ">nmake</NativeToolchainMake>
11+
<PrepareNativeToolchain>call "$(_Vcvarsall)" </PrepareNativeToolchain>
1712
</PropertyGroup>
1813
<PropertyGroup>
1914
<CmakeGenerator Condition=" '$(OS)' != 'Windows_NT' ">-G "Unix Makefiles"</CmakeGenerator>

build-tools/scripts/RunCmake.proj

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Prepare" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3-
<Target Name="Cmake">
4-
3+
<Target Name="Cmake"
4+
DependsOnTargets="_ValidateCmake;_RunCmake"
5+
/>
6+
<Target Name="_ValidateCmake">
57
<Error
68
Condition=" '$(CmakePath)' == '' "
79
Text="Set the `%24(CmakePath)` property."
@@ -18,12 +20,18 @@
1820
Condition=" '$(CmakeBuildDir)' == '' "
1921
Text="Set the `%24(CmakeBuildDir)` property."
2022
/>
23+
</Target>
2124

25+
<Target Name="_RunCmake">
26+
<PropertyGroup>
27+
<_SourceDir>$(CmakeSourceDir.Replace('%5c', '/'))</_SourceDir>
28+
<_BuildDir>$(CmakeBuildDir.Replace('%5c', '/'))</_BuildDir>
29+
<_ExtraArgs>$(CmakeExtraArgs.Replace('%5c', '/'))</_ExtraArgs>
30+
</PropertyGroup>
2231
<Exec
2332
ContinueOnError="WarnAndContinue"
24-
Command="$(PrepareNativeToolchain) $(CmakePath) $(CmakeGenerator) -S $(CmakeSourceDir) -B $(CmakeBuildDir) $(CmakeExtraArgs)"
33+
Command="$(PrepareNativeToolchain) $(CmakePath) $(CmakeGenerator) -S &quot;$(_SourceDir)&quot; -B &quot;$(_BuildDir)&quot; $(_ExtraArgs) &amp;&amp; $(CmakePath) --build &quot;$(_BuildDir)&quot; -v"
2534
/>
26-
2735
<PropertyGroup>
2836
<_CmakeStatus>$(MSBuildLastTaskResult)</_CmakeStatus>
2937
</PropertyGroup>

src/Java.Runtime.Environment/Java.Interop/JreRuntime.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,15 @@ public JreRuntime CreateJreVM ()
7070

7171
public class JreRuntime : JniRuntime
7272
{
73+
static JreRuntime ()
74+
{
75+
if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
76+
var baseDir = Path.GetDirectoryName (typeof (JreRuntime).Assembly.Location);
77+
var newDir = Path.Combine (baseDir, Environment.Is64BitProcess ? "win-x64" : "win-x86");
78+
NativeMethods.AddDllDirectory (newDir);
79+
}
80+
}
81+
7382
static int CreateJavaVM (out IntPtr javavm, out IntPtr jnienv, ref JavaVMInitArgs args)
7483
{
7584
return NativeMethods.java_interop_jvm_create (out javavm, out jnienv, ref args);
@@ -168,6 +177,9 @@ partial class NativeMethods {
168177

169178
[DllImport (JavaInteropLib, CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
170179
internal static extern int java_interop_jvm_create (out IntPtr javavm, out IntPtr jnienv, ref JavaVMInitArgs args);
180+
181+
[DllImport ("kernel32", CharSet=CharSet.Unicode)]
182+
internal static extern int AddDllDirectory (string NewDirectory);
171183
}
172184
}
173185

src/java-interop/Directory.Build.targets

Lines changed: 74 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,32 @@
66
<_JavaInteropLibName Condition=" '$(OS)' != 'Windows_NT' And Exists ('/Library/Frameworks/') ">libjava-interop.dylib</_JavaInteropLibName>
77
<_JavaInteropLibName Condition=" '$(OS)' != 'Windows_NT' And !Exists ('/Library/Frameworks/') ">libjava-interop.so</_JavaInteropLibName>
88
<_JavaInteropLibName Condition=" '$(OS)' == 'Windows_NT' ">java-interop.dll</_JavaInteropLibName>
9-
<_JavaInteropOutputPath>$(OutputPath)$(_JavaInteropLibName)</_JavaInteropOutputPath>
10-
<_BuildDir>$(MSBuildThisFileDirectory)$(IntermediateOutputPath)</_BuildDir>
11-
<_BuildDir>$(_BuildDir.Replace('%5c', '/'))</_BuildDir>
9+
</PropertyGroup>
10+
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT' ">
11+
<_PrimaryOutputPath>$(OutputPath)$(_JavaInteropLibName)</_PrimaryOutputPath>
12+
</PropertyGroup>
13+
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
14+
<_PrimaryDir>win-x64</_PrimaryDir>
15+
<_PrimaryArch>x86_amd64</_PrimaryArch>
16+
<_PrimaryOutputPath>$(OutputPath)$(_PrimaryDir)\$(_JavaInteropLibName)</_PrimaryOutputPath>
17+
<_SecondaryDir>win-x86</_SecondaryDir>
18+
<_SecondaryArch>x86</_SecondaryArch>
19+
<_SecondaryOutputPath>$(OutputPath)$(_SecondaryDir)\$(_JavaInteropLibName)</_SecondaryOutputPath>
1220
</PropertyGroup>
1321

14-
<ItemGroup>
15-
<None Include="$(_JavaInteropOutputPath)">
22+
<ItemGroup Condition=" '$(OS)' == 'Windows_NT' ">
23+
<None Include="$(_PrimaryOutputPath)">
24+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
25+
<Link>$(_PrimaryDir)\$(_JavaInteropLibName)</Link>
26+
</None>
27+
<None Include="$(_SecondaryOutputPath)">
28+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
29+
<Link>$(_SecondaryDir)\$(_JavaInteropLibName)</Link>
30+
</None>
31+
</ItemGroup>
32+
33+
<ItemGroup Condition=" '$(OS)' != 'Windows_NT' ">
34+
<None Include="$(_PrimaryOutputPath)">
1635
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
1736
</None>
1837
</ItemGroup>
@@ -26,14 +45,10 @@
2645

2746
<Target Name="_BuildLibs"
2847
BeforeTargets="Build"
29-
DependsOnTargets="_PrepareCmake;_BuildJavaInterop">
48+
DependsOnTargets="_BuildPrimaryLib;_BuildSecondaryLib">
3049
</Target>
3150

32-
<Target Name="_PrepareCmake"
33-
DependsOnTargets="GetNativeBuildCommands;_BuildJni_c"
34-
Inputs="CMakeLists.txt;$(MSBuildThisFileFullPath);NativeTiming.csproj"
35-
Outputs="$(IntermediateOutputPath)CMakeCache.txt">
36-
<MakeDir Directories="$(IntermediateOutputPath)" />
51+
<Target Name="_GetCmakeOptions">
3752
<PropertyGroup Condition=" '$(TargetFramework)' == 'net472' And '@(MonoIncludePath->Count())' != '0' ">
3853
<_MonoDirs>"-DMONO_INCLUDE_LIST=@(MonoIncludePath, ';')"</_MonoDirs>
3954
<_MonoLib>"-DMONO_LINK_FLAGS=$(MonoLibs)"</_MonoLib>
@@ -42,45 +57,78 @@
4257
<PropertyGroup>
4358
<_JdkDirs>"-DJDK_INCLUDE_LIST=@(JdkIncludePath, ';')"</_JdkDirs>
4459
<_Jni_c>"-DJNI_C_PATH=$(MSBuildThisFileDirectory)$(IntermediateOutputPath)jni.c"</_Jni_c>
45-
<_ExtraArgs>$([MSBuild]::Escape('$(_JdkDirs) $(_Jni_c) $(_EnableMono) $(_MonoDirs) $(_MonoLib)').Replace('%5c', '/'))</_ExtraArgs>
60+
<_ExtraArgs>$([MSBuild]::Escape('$(_JdkDirs) $(_Jni_c) $(_EnableMono) $(_MonoDirs) $(_MonoLib)'))</_ExtraArgs>
4661
</PropertyGroup>
62+
</Target>
63+
64+
<Target Name="_BuildPrimaryLib"
65+
DependsOnTargets="GetNativeBuildCommands;_BuildJni_c;_GetCmakeOptions"
66+
Inputs="CMakeLists.txt;$(MSBuildThisFileFullPath);java-interop.csproj"
67+
Outputs="$(_PrimaryOutputPath)">
68+
<MakeDir Directories="$(IntermediateOutputPath)$(_PrimaryDir)" />
4769
<ItemGroup>
48-
<_Cmake Include="PrepareNativeToolchain=$(PrepareNativeToolchain)" />
70+
<_Cmake
71+
Condition=" '$(PrepareNativeToolchain)' != '' "
72+
Include="PrepareNativeToolchain=$(PrepareNativeToolchain) $(_PrimaryArch) &amp;&amp;"
73+
/>
4974
<_Cmake Include="CmakePath=$(CmakePath)" />
5075
<_Cmake Include="CmakeGenerator=$(CmakeGenerator)" />
5176
<_Cmake Include="CmakeSourceDir=$(MSBuildThisFileDirectory)" />
52-
<_Cmake Include="CmakeBuildDir=$(_BuildDir)" />
77+
<_Cmake Include="CmakeBuildDir=$(MSBuildThisFileDirectory)$(IntermediateOutputPath)$(_PrimaryDir)" />
5378
<_Cmake Include="CmakeExtraArgs=$(_ExtraArgs)" />
5479
</ItemGroup>
5580
<MSBuild
5681
Projects="..\..\build-tools\scripts\RunCmake.proj"
5782
Properties="@(_Cmake)"
5883
Targets="Cmake"
5984
/>
60-
<Touch Files="$(IntermediateOutputPath)CMakeCache.txt" />
85+
<MakeDir Directories="$(OutputPath)$(_PrimaryDir)" />
86+
<ItemGroup>
87+
<_Libs Include="$(IntermediateOutputPath)$(_PrimaryDir)\$(_JavaInteropLibName)*" />
88+
</ItemGroup>
89+
<Copy
90+
SourceFiles="@(_Libs)"
91+
DestinationFolder="$(OutputPath)$(_PrimaryDir)"
92+
/>
93+
<Touch Files="$(_PrimaryOutputPath)" />
6194
</Target>
6295

63-
<Target Name="_BuildJavaInterop"
64-
DependsOnTargets="GetNativeBuildCommands"
65-
Inputs="timing.c;$(MSBuildThisFileFullPath);NativeTiming.csproj"
66-
Outputs="$(_JavaInteropOutputPath)">
67-
<Exec
68-
Command="$(PrepareNativeToolchain) $(CmakePath) --build &quot;$(_BuildDir)&quot; -v"
69-
WorkingDirectory="$(IntermediateOutputPath)"
96+
<Target Name="_BuildSecondaryLib"
97+
Condition=" '$(_SecondaryOutputPath)' != '' "
98+
DependsOnTargets="GetNativeBuildCommands;_BuildJni_c;_GetCmakeOptions"
99+
Inputs="CMakeLists.txt;$(MSBuildThisFileFullPath);java-interop.csproj"
100+
Outputs="$(_SecondaryOutputPath)">
101+
<MakeDir Directories="$(IntermediateOutputPath)$(_SecondaryDir)" />
102+
<ItemGroup>
103+
<_Cmake
104+
Condition=" '$(PrepareNativeToolchain)' != '' "
105+
Include="PrepareNativeToolchain=$(PrepareNativeToolchain) $(_SecondaryArch) &amp;&amp;"
106+
/>
107+
<_Cmake Include="CmakePath=$(CmakePath)" />
108+
<_Cmake Include="CmakeGenerator=$(CmakeGenerator)" />
109+
<_Cmake Include="CmakeSourceDir=$(MSBuildThisFileDirectory)" />
110+
<_Cmake Include="CmakeBuildDir=$(MSBuildThisFileDirectory)$(IntermediateOutputPath)$(_SecondaryDir)" />
111+
<_Cmake Include="CmakeExtraArgs=$(_ExtraArgs)" />
112+
</ItemGroup>
113+
<MSBuild
114+
Projects="..\..\build-tools\scripts\RunCmake.proj"
115+
Properties="@(_Cmake)"
116+
Targets="Cmake"
70117
/>
118+
<MakeDir Directories="$(OutputPath)$(_SecondaryDir)" />
71119
<ItemGroup>
72-
<_Libs Include="$(IntermediateOutputPath)$(_NativeTimingLibName)*" />
120+
<_Libs Include="$(IntermediateOutputPath)$(_SecondaryDir)\$(_JavaInteropLibName)*" />
73121
</ItemGroup>
74122
<Copy
75123
SourceFiles="@(_Libs)"
76-
DestinationFolder="$(OutputPath)"
124+
DestinationFolder="$(OutputPath)$(_SecondaryDir)"
77125
/>
78-
<Touch Files="$(_NativeTimingOutputPath)" />
126+
<Touch Files="$(_SecondaryOutputPath)" />
79127
</Target>
80128

81129
<Target Name="_Clean"
82130
AfterTargets="Clean">
83-
<Delete Files="$(_NativeTimingOutputPath)" />
131+
<Delete Files="@(None)" />
84132
</Target>
85133

86134
</Project>

0 commit comments

Comments
 (0)