Skip to content

Commit 2b16e1c

Browse files
radicallewing
andauthored
[release/6.0-preview7] [wasm] Add support for using custom native libraries (#56013)
* [wasm] Add support for using custom native libraries (#55797) (cherry picked from commit d574b03) * [wasm] Use compile rsp instead of link, for compiling native files (#55848) .. and fix logging that broke recently. `tasks/Common/Utils.cs`: TaskLoggingHelper Utils.Logger is a static field, which must be set by task else any methods in Utils, eg. RunProcess, silently fail to log any messages. Also, this would be a problem when building multiple projects in parallel, since the logger is a task-specific one. Instead, we pass logger as an arg to all the methods. (cherry picked from commit 3301e9d) * Link with EmccCompileOptimizationFlag==-Oz by default in release (#55939) (cherry picked from commit 04072ff) * [wasm] Fix regression in compiling .bc -> .o files (#56063) * [wasm] Add back --emit-llvm that got removed mistakenly, in an earlier commit .. found thanks to Jerome Laban. * [wasm] Set EmccCompile's messages to MessageImportance.Low by default. .. and to MessageImportance.Normal if `$(EmccVerbose)==true`. * [wasm] Quote filenames passed to emcc compile command line * Add more blazorwasm tests - for debug/release, aot/relinking * Bump sdk for workload testing to 6.0.100-rc.1.21370.2 * [wasm] Fix regression in compiling bitcode -> .o The `-emit-llvm` arg has been incorrectly added, and removed from the args used for compiling .bc->.o . This commit fixes it, and adds a crude test for it, so we don't regress again. * Fix build (cherry picked from commit 1d8ad03) * [wasm] Bump sdk for workload testing to 6.0.100-preview.7.21372.19 Co-authored-by: Larry Ewing <lewing@microsoft.com>
1 parent bc84c7a commit 2b16e1c

28 files changed

+381
-143
lines changed

eng/Versions.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@
162162
<SQLitePCLRawbundle_greenVersion>2.0.4</SQLitePCLRawbundle_greenVersion>
163163
<MoqVersion>4.12.0</MoqVersion>
164164
<FsCheckVersion>2.14.3</FsCheckVersion>
165-
<SdkVersionForWorkloadTesting>6.0.100-preview.7.21362.5</SdkVersionForWorkloadTesting>
165+
<SdkVersionForWorkloadTesting>6.0.100-preview.7.21372.19</SdkVersionForWorkloadTesting>
166166
<!-- Docs -->
167167
<MicrosoftPrivateIntellisenseVersion>5.0.0-preview-20201009.2</MicrosoftPrivateIntellisenseVersion>
168168
<!-- ILLink -->

src/mono/wasm/build/WasmApp.Native.targets

Lines changed: 57 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
</_WasmBuildNativeCoreDependsOn>
1919

2020
<WasmBuildNativeOnlyDependsOn>
21+
_InitializeCommonProperties;
2122
_PrepareForWasmBuildNativeOnly;
2223
_WasmBuildNativeCore;
2324
</WasmBuildNativeOnlyDependsOn>
@@ -38,13 +39,14 @@
3839
<Target Name="WasmBuildNativeOnly" DependsOnTargets="$(WasmBuildNativeOnlyDependsOn)" Condition="'$(WasmBuildNative)' == 'true'" />
3940

4041
<Target Name="_PrepareForWasmBuildNativeOnly">
42+
<MakeDir Directories="$(_WasmIntermediateOutputPath)" />
43+
4144
<ItemGroup>
4245
<_WasmAssembliesInternal Remove="@(_WasmAssembliesInternal)" />
4346
<_WasmAssembliesInternal Include="@(WasmAssembliesToBundle->Distinct())" />
4447
</ItemGroup>
4548
</Target>
4649

47-
4850
<Target Name="_SetupEmscripten">
4951
<PropertyGroup>
5052
<_EMSDKMissingPaths Condition="'$(_EMSDKMissingPaths)' == '' and ('$(EmscriptenSdkToolsPath)' == '' or !Exists('$(EmscriptenSdkToolsPath)'))">%24(EmscriptenSdkToolsPath)=$(EmscriptenSdkToolsPath) </_EMSDKMissingPaths>
@@ -115,8 +117,9 @@
115117

116118
<PropertyGroup>
117119
<WasmBuildNative Condition="'$(RunAOTCompilation)' == 'true'">true</WasmBuildNative>
118-
<WasmBuildNative Condition="'$(WasmBuildNative)' == '' and '$(PublishTrimmed)' != 'true'">false</WasmBuildNative>
119-
<WasmBuildNative Condition="'$(WasmBuildNative)' == '' and '$(Configuration)' == 'Release'">true</WasmBuildNative>
120+
<WasmBuildNative Condition="'$(WasmBuildNative)' == '' and @(NativeFileReference->Count()) > 0" >true</WasmBuildNative>
121+
<WasmBuildNative Condition="'$(WasmBuildNative)' == '' and '$(PublishTrimmed)' != 'true'" >false</WasmBuildNative>
122+
<WasmBuildNative Condition="'$(WasmBuildNative)' == '' and '$(Configuration)' == 'Release'" >true</WasmBuildNative>
120123
<WasmBuildNative Condition="'$(WasmBuildNative)' == ''">false</WasmBuildNative>
121124
</PropertyGroup>
122125

@@ -152,7 +155,11 @@
152155
<_EmccOptimizationFlagDefault Condition="'$(_EmccOptimizationFlagDefault)' == ''">-Oz</_EmccOptimizationFlagDefault>
153156

154157
<EmccCompileOptimizationFlag Condition="'$(EmccCompileOptimizationFlag)' == ''">$(_EmccOptimizationFlagDefault)</EmccCompileOptimizationFlag>
155-
<EmccLinkOptimizationFlag Condition="'$(EmccLinkOptimizationFlag)' == ''" >-O0 -s ASSERTIONS=$(_EmccAssertionLevelDefault)</EmccLinkOptimizationFlag>
158+
<EmccLinkOptimizationFlag Condition="'$(EmccLinkOptimizationFlag)' == ''" >$(EmccCompileOptimizationFlag)</EmccLinkOptimizationFlag>
159+
160+
<_EmccCompileRsp>$(_WasmIntermediateOutputPath)emcc-compile.rsp</_EmccCompileRsp>
161+
<_EmccCompileOutputMessageImportance Condition="'$(EmccVerbose)' == 'true'">Normal</_EmccCompileOutputMessageImportance>
162+
<_EmccCompileOutputMessageImportance Condition="'$(EmccVerbose)' != 'true'">Low</_EmccCompileOutputMessageImportance>
156163
</PropertyGroup>
157164

158165
<ItemGroup>
@@ -161,15 +168,42 @@
161168
<_EmccCommonFlags Include="-s DISABLE_EXCEPTION_CATCHING=0" />
162169
<_EmccCommonFlags Include="-g" Condition="'$(WasmNativeStrip)' == 'false'" />
163170
<_EmccCommonFlags Include="-v" Condition="'$(EmccVerbose)' != 'false'" />
171+
172+
<_EmccIncludePaths Include="$(_WasmIntermediateOutputPath.TrimEnd('\/'))" />
173+
<_EmccIncludePaths Include="$(_WasmRuntimePackIncludeDir)mono-2.0" />
174+
<_EmccIncludePaths Include="$(_WasmRuntimePackIncludeDir)wasm" />
175+
176+
<!-- Adding optimization flag at the top, so it gets precedence -->
177+
<_EmccCFlags Include="$(EmccCompileOptimizationFlag)" />
178+
<_EmccCFlags Include="@(_EmccCommonFlags)" />
179+
180+
<_EmccCFlags Include="-DENABLE_AOT=1" Condition="'$(RunAOTCompilation)' == 'true'" />
181+
<_EmccCFlags Include="-DDRIVER_GEN=1" Condition="'$(RunAOTCompilation)' == 'true'" />
182+
<_EmccCFlags Include="-DINVARIANT_GLOBALIZATION=1" Condition="'$(InvariantGlobalization)' == 'true'" />
183+
<_EmccCFlags Include="-DLINK_ICALLS=1" Condition="'$(WasmLinkIcalls)' == 'true'" />
184+
<_EmccCFlags Include="-DCORE_BINDINGS" />
185+
<_EmccCFlags Include="-DGEN_PINVOKE=1" />
186+
<_EmccCFlags Include="-emit-llvm" />
187+
188+
<_EmccCFlags Include="&quot;-I%(_EmccIncludePaths.Identity)&quot;" />
189+
<_EmccCFlags Include="-g" Condition="'$(WasmNativeDebugSymbols)' == 'true'" />
190+
191+
<_EmccCFlags Include="$(EmccExtraCFlags)" />
192+
193+
<_WasmRuntimePackSrcFile Include="$(_WasmRuntimePackSrcDir)*.c" />
194+
<_WasmRuntimePackSrcFile ObjectFile="$(_WasmIntermediateOutputPath)%(FileName).o" />
195+
196+
<_DotnetJSSrcFile Include="$(_WasmRuntimePackSrcDir)\*.js" />
197+
<_WasmNativeFileForLinking Include="@(NativeFileReference)" />
164198
</ItemGroup>
165199

166-
<ItemGroup>
167-
<_DotnetJSSrcFile Include="$(_WasmRuntimePackSrcDir)\*.js" />
168-
</ItemGroup>
200+
<Error Text="Could not find NativeFileReference %(NativeFileReference.Identity)" Condition="'%(NativeFileReference.Identity)' != '' and !Exists(%(NativeFileReference.Identity))" />
169201
</Target>
170202

171203
<Target Name="_GeneratePInvokeTable">
172204
<ItemGroup>
205+
<_WasmPInvokeModules Include="%(_WasmNativeFileForLinking.FileName)" Condition="'%(_WasmNativeFileForLinking.ScanForPInvokes)' != 'false'" />
206+
173207
<_WasmPInvokeModules Include="libSystem.Native" />
174208
<_WasmPInvokeModules Include="libSystem.IO.Compression.Native" />
175209
<_WasmPInvokeModules Include="libSystem.Globalization.Native" />
@@ -194,38 +228,13 @@
194228

195229
<Target Name="_WasmCompileNativeFiles">
196230
<ItemGroup>
197-
<_EmccIncludePaths Include="$(_WasmIntermediateOutputPath.TrimEnd('\/'))" />
198-
<_EmccIncludePaths Include="$(_WasmRuntimePackIncludeDir)mono-2.0" />
199-
<_EmccIncludePaths Include="$(_WasmRuntimePackIncludeDir)wasm" />
200-
201-
<!-- Adding optimization flag at the top, so it gets precedence -->
202-
<_EmccCFlags Include="$(EmccCompileOptimizationFlag)" />
203-
<_EmccCFlags Include="@(_EmccCommonFlags)" />
204-
205-
<_EmccCFlags Include="-DENABLE_AOT=1" Condition="'$(RunAOTCompilation)' == 'true'" />
206-
<_EmccCFlags Include="-DDRIVER_GEN=1" Condition="'$(RunAOTCompilation)' == 'true'" />
207-
<_EmccCFlags Include="-DINVARIANT_GLOBALIZATION=1" Condition="'$(InvariantGlobalization)' == 'true'" />
208-
<_EmccCFlags Include="-DLINK_ICALLS=1" Condition="'$(WasmLinkIcalls)' == 'true'" />
209-
<_EmccCFlags Include="-DCORE_BINDINGS" />
210-
<_EmccCFlags Include="-DGEN_PINVOKE=1" />
211-
<_EmccCFlags Include="-emit-llvm" />
212-
213-
<_EmccCFlags Include="&quot;-I%(_EmccIncludePaths.Identity)&quot;" />
214-
<_EmccCFlags Include="-g" Condition="'$(WasmNativeDebugSymbols)' == 'true'" />
215-
<_EmccCFlags Include="-s EXPORTED_FUNCTIONS='[@(_ExportedFunctions->'&quot;%(Identity)&quot;', ',')]'" Condition="@(_ExportedFunctions->Count()) > 0" />
216-
217-
<_EmccCFlags Include="$(EmccExtraCFlags)" />
218-
219-
<_WasmRuntimePackSrcFile Remove="@(_WasmRuntimePackSrcFile)" />
220-
<_WasmRuntimePackSrcFile Include="$(_WasmRuntimePackSrcDir)\*.c" />
221-
<_WasmRuntimePackSrcFile ObjectFile="$(_WasmIntermediateOutputPath)%(FileName).o" />
231+
<_WasmSourceFileToCompile Remove="@(_WasmSourceFileToCompile)" />
222232
<_WasmSourceFileToCompile Include="@(_WasmRuntimePackSrcFile)" />
223233
</ItemGroup>
224234

225235
<PropertyGroup>
226236
<_EmBuilder Condition="$([MSBuild]::IsOSPlatform('WINDOWS'))">embuilder.bat</_EmBuilder>
227237
<_EmBuilder Condition="!$([MSBuild]::IsOSPlatform('WINDOWS'))">embuilder.py</_EmBuilder>
228-
<_EmccCompileRsp>$(_WasmIntermediateOutputPath)emcc-compile.rsp</_EmccCompileRsp>
229238
</PropertyGroup>
230239

231240
<WriteLinesToFile Lines="@(_EmccCFlags)" File="$(_EmccCompileRsp)" Overwrite="true" WriteOnlyWhenDifferent="true" />
@@ -234,7 +243,15 @@
234243
<Exec Command="$(_EmBuilder) build MINIMAL" EnvironmentVariables="@(EmscriptenEnvVars)" StandardOutputImportance="Low" StandardErrorImportance="Low" />
235244

236245
<Message Text="Compiling native assets with emcc. This may take a while ..." Importance="High" />
237-
<EmccCompile SourceFiles="@(_WasmSourceFileToCompile)" Arguments='"@$(_EmccDefaultFlagsRsp)" "@$(_EmccCompileRsp)"' EnvironmentVariables="@(EmscriptenEnvVars)" />
246+
<EmccCompile
247+
SourceFiles="@(_WasmSourceFileToCompile)"
248+
Arguments='"@$(_EmccDefaultFlagsRsp)" "@$(_EmccCompileRsp)"'
249+
EnvironmentVariables="@(EmscriptenEnvVars)"
250+
OutputMessageImportance="$(_EmccCompileOutputMessageImportance)" />
251+
252+
<ItemGroup>
253+
<WasmNativeAsset Include="%(_WasmSourceFileToCompile.ObjectFile)" />
254+
</ItemGroup>
238255
</Target>
239256

240257
<ItemGroup Condition="'$(Configuration)' == 'Debug' and '@(_MonoComponent->Count())' == 0">
@@ -259,8 +276,9 @@
259276
<EmccCompile
260277
Condition="@(_BitCodeFile->Count()) > 0"
261278
SourceFiles="@(_BitCodeFile)"
262-
Arguments="&quot;@$(_EmccDefaultFlagsRsp)&quot; @(_EmccLDFlags->'%(Identity)', ' ')"
263-
EnvironmentVariables="@(EmscriptenEnvVars)" />
279+
Arguments="&quot;@$(_EmccDefaultFlagsRsp)&quot; @(_EmccLDFlags, ' ')"
280+
EnvironmentVariables="@(EmscriptenEnvVars)"
281+
OutputMessageImportance="$(_EmccCompileOutputMessageImportance)" />
264282

265283
<ItemGroup>
266284
<!-- order seems to matter -->
@@ -271,6 +289,8 @@
271289
Include="$(MicrosoftNetCoreAppRuntimePackRidNativeDir)\*.a"
272290
Exclude="@(_MonoRuntimeComponentDontLink->'$(MicrosoftNetCoreAppRuntimePackRidNativeDir)\%(Identity)')" />
273291

292+
<_WasmExtraJSFile Include="@(Content)" Condition="'%(Content.Extension)' == '.js'" />
293+
274294
<_EmccLinkStepArgs Include="@(_EmccLDFlags)" />
275295
<_EmccLinkStepArgs Include="--js-library &quot;%(_DotnetJSSrcFile.Identity)&quot;" />
276296
<_EmccLinkStepArgs Include="--js-library &quot;%(_WasmExtraJSFile.Identity)&quot;" Condition="'%(_WasmExtraJSFile.Kind)' == 'js-library'" />
@@ -483,6 +503,5 @@ EMSCRIPTEN_KEEPALIVE void mono_wasm_load_profiler_aot (const char *desc) { mono_
483503
<ParameterGroup>
484504
<EmccProperties ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="false" Output="true" />
485505
</ParameterGroup>
486-
</UsingTask>
487-
506+
</UsingTask>
488507
</Project>

src/mono/wasm/build/WasmApp.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
<WasmBuildAppAfterThisTarget Condition="'$(WasmBuildAppAfterThisTarget)' == ''">Publish</WasmBuildAppAfterThisTarget>
99
<WasmBuildAppDependsOn>
10+
_InitializeCommonProperties;
1011
_BeforeWasmBuildApp;
1112
_WasmResolveReferences;
1213
_WasmAotCompileApp;

src/mono/wasm/build/WasmApp.targets

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@
8080
<!--<WasmStripAOTAssemblies Condition="'$(AOTMode)' == 'LLVMOnlyInterp'">false</WasmStripAOTAssemblies>-->
8181
<!--<WasmStripAOTAssemblies Condition="'$(WasmStripAOTAssemblies)' == ''">$(RunAOTCompilation)</WasmStripAOTAssemblies>-->
8282
<WasmStripAOTAssemblies>false</WasmStripAOTAssemblies>
83+
84+
<!-- emcc, and mono-aot-cross don't like relative paths for output files -->
85+
<_WasmIntermediateOutputPath>$([MSBuild]::NormalizeDirectory($(IntermediateOutputPath), 'wasm'))</_WasmIntermediateOutputPath>
8386
<_BeforeWasmBuildAppDependsOn />
8487
</PropertyGroup>
8588

@@ -90,7 +93,7 @@
9093

9194
<Target Name="_WasmCoreBuild" BeforeTargets="WasmBuildApp" DependsOnTargets="$(WasmBuildAppDependsOn)" />
9295

93-
<Target Name="_BeforeWasmBuildApp" DependsOnTargets="$(_BeforeWasmBuildAppDependsOn)">
96+
<Target Name="_InitializeCommonProperties">
9497
<Error Condition="'$(MicrosoftNetCoreAppRuntimePackDir)' == '' and ('%(ResolvedRuntimePack.PackageDirectory)' == '' or !Exists(%(ResolvedRuntimePack.PackageDirectory)))"
9598
Text="Could not find %25(ResolvedRuntimePack.PackageDirectory)=%(ResolvedRuntimePack.PackageDirectory)" />
9699

@@ -100,11 +103,12 @@
100103
<MicrosoftNetCoreAppRuntimePackRidDir>$([MSBuild]::NormalizeDirectory($(MicrosoftNetCoreAppRuntimePackRidDir)))</MicrosoftNetCoreAppRuntimePackRidDir>
101104
<MicrosoftNetCoreAppRuntimePackRidNativeDir>$([MSBuild]::NormalizeDirectory($(MicrosoftNetCoreAppRuntimePackRidDir), 'native'))</MicrosoftNetCoreAppRuntimePackRidNativeDir>
102105

103-
<!-- FIXME: confirm that this won't get used before this -->
104106
<_WasmRuntimePackIncludeDir>$([MSBuild]::NormalizeDirectory($(MicrosoftNetCoreAppRuntimePackRidNativeDir), 'include'))</_WasmRuntimePackIncludeDir>
105107
<_WasmRuntimePackSrcDir>$([MSBuild]::NormalizeDirectory($(MicrosoftNetCoreAppRuntimePackRidNativeDir), 'src'))</_WasmRuntimePackSrcDir>
106108
</PropertyGroup>
109+
</Target>
107110

111+
<Target Name="_BeforeWasmBuildApp" DependsOnTargets="$(_BeforeWasmBuildAppDependsOn)">
108112
<Error Condition="'$(IntermediateOutputPath)' == ''" Text="%24(IntermediateOutputPath) property needs to be set" />
109113
<Error Condition="!Exists('$(MicrosoftNetCoreAppRuntimePackRidDir)')" Text="MicrosoftNetCoreAppRuntimePackRidDir=$(MicrosoftNetCoreAppRuntimePackRidDir) doesn't exist" />
110114
<Error Condition="@(WasmAssembliesToBundle->Count()) == 0" Text="WasmAssembliesToBundle item is empty. No assemblies to process" />
@@ -115,8 +119,6 @@
115119
<WasmMainAssemblyFileName Condition="'$(WasmMainAssemblyFileName)' == ''">$(TargetFileName)</WasmMainAssemblyFileName>
116120

117121
<WasmAppDir>$([MSBuild]::NormalizeDirectory($(WasmAppDir)))</WasmAppDir>
118-
<!-- emcc, and mono-aot-cross don't like relative paths for output files -->
119-
<_WasmIntermediateOutputPath>$([MSBuild]::NormalizeDirectory($(IntermediateOutputPath), 'wasm'))</_WasmIntermediateOutputPath>
120122
</PropertyGroup>
121123

122124
<MakeDir Directories="$(_WasmIntermediateOutputPath)" />

src/tasks/AndroidAppBuilder/AndroidApkFileReplacerTask.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ public class AndroidApkFileReplacerTask : Task
2626

2727
public override bool Execute()
2828
{
29-
Utils.Logger = Log;
30-
var apkBuilder = new ApkBuilder();
29+
var apkBuilder = new ApkBuilder(Log);
3130
apkBuilder.OutputDir = OutputDir;
3231
apkBuilder.AndroidSdk = AndroidSdk;
3332
apkBuilder.MinApiLevel = MinApiLevel;

src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,9 @@ public class AndroidAppBuilderTask : Task
8787

8888
public override bool Execute()
8989
{
90-
Utils.Logger = Log;
91-
9290
string abi = DetermineAbi();
9391

94-
var apkBuilder = new ApkBuilder();
92+
var apkBuilder = new ApkBuilder(Log);
9593
apkBuilder.ProjectName = ProjectName;
9694
apkBuilder.AppDir = AppDir;
9795
apkBuilder.OutputDir = OutputDir;

0 commit comments

Comments
 (0)