WASM app builder changes. (#36422)
authorZoltan Varga <vargaz@gmail.com>
Tue, 19 May 2020 01:11:09 +0000 (21:11 -0400)
committerGitHub <noreply@github.com>
Tue, 19 May 2020 01:11:09 +0000 (21:11 -0400)
* Add an ExtraAssemblies parameter to the WasmAppBuilder task.

* Pass more assemblies to the pinvoke table generator.

* Improve the wasm sample.

* Move WasmAppBuilder to tools-local.

src/mono/mono.proj
src/mono/netcore/sample/wasm/Makefile
src/mono/netcore/sample/wasm/WasmSample.csproj
src/mono/wasm/Makefile
src/mono/wasm/wasm.proj
tools-local/tasks/mobile.tasks/WasmAppBuilder/PInvokeTableGenerator.cs [moved from src/mono/msbuild/WasmAppBuilder/PInvokeTableGenerator.cs with 100% similarity]
tools-local/tasks/mobile.tasks/WasmAppBuilder/WasmAppBuilder.cs [moved from src/mono/msbuild/WasmAppBuilder/WasmAppBuilder.cs with 90% similarity]
tools-local/tasks/mobile.tasks/WasmAppBuilder/WasmAppBuilder.csproj [moved from src/mono/msbuild/WasmAppBuilder/WasmAppBuilder.csproj with 90% similarity]
tools-local/tasks/tasks.proj

index 175622c..20b28c5 100644 (file)
 
   <Import Project="Directory.Build.targets" />
 
-  <!-- Need to publish this since it references System.Reflection.MetadataLoadContext -->
-  <Target Name="BuildWasmAppBuilder" Condition="'$(TargetsBrowser)' == 'true'">
-    <MSBuild Projects="$(MonoProjectRoot)msbuild\WasmAppBuilder\WasmAppBuilder.csproj"
-             Properties="Configuration=$(Configuration);"
-             Targets="Restore;Build;Publish"/>
-  </Target>
-
   <!-- Ordering matters! Overwriting the Build target. -->
   <!-- General targets -->
-  <Target Name="Build" DependsOnTargets="BuildMonoRuntimeUnix;BuildMonoRuntimeWindows;BuildWasmAppBuilder;">
+  <Target Name="Build" DependsOnTargets="BuildMonoRuntimeUnix;BuildMonoRuntimeWindows">
     <PropertyGroup>
       <_MonoRuntimeFilePath Condition="'$(TargetsWindows)' == 'true' and '$(Platform)' == 'x64'">$(MonoObjDir)x64\Bin\$(Configuration)\mono-2.0-sgen.dll</_MonoRuntimeFilePath>
       <_MonoRuntimeFilePath Condition="'$(TargetsWindows)' == 'true' and '$(Platform)' == 'x86'">$(MonoObjDir)Win32\Bin\$(Configuration)\mono-2.0-sgen.dll</_MonoRuntimeFilePath>
index 09c42a4..e798a00 100644 (file)
@@ -1,12 +1,17 @@
 TOP=../../../../..
 
+DOTNET_Q_ARGS=--nologo -v:q -consoleloggerparameters:NoSummary
+
 all: build
 
 build:
-       $(TOP)/.dotnet/dotnet build /p:TargetArchitecture=wasm /p:TargetOS=Browser /p:Configuration=Release
+       $(TOP)/.dotnet/dotnet build $(DOTNET_Q_ARGS) /p:TargetArchitecture=wasm /p:TargetOS=Browser /p:Configuration=Release
 
 clean:
        rm -rf bin
 
 run:
-       cd bin/Release/publish && ~/.jsvu/v8 --expose_wasm runtime.js -- --run WasmSample.dll
+       cd bin/Release/publish && ~/.jsvu/v8 --expose_wasm runtime.js -- --enable-gc --run WasmSample.dll
+
+runtimepack:
+       EMSDK_PATH=$(TOP)/src/mono/wasm/emsdk $(TOP)/build.sh -c $(MONO_CONFIG) -os Browser -arch wasm -subset Mono+Libs
index 588f292..535fd28 100644 (file)
   </PropertyGroup>
 
   <Target Name="RebuildWasmAppBuilder">
-    <MSBuild Projects="$(RepoRoot)src\mono\msbuild\WasmAppBuilder\WasmAppBuilder.csproj"
+    <MSBuild Projects="$(RepoRoot)\tools-local\tasks\mobile.tasks\WasmAppBuilder\WasmAppBuilder.csproj"
              Properties="Configuration=$(Configuration)" Targets="Restore;Build;Publish" />
   </Target>
 
   <UsingTask TaskName="WasmAppBuilder" 
-      AssemblyFile="$(ArtifactsBinDir)\WasmAppBuilder\$(NetCoreAppCurrent)-$(Configuration)\publish\WasmAppBuilder.dll"/>
+      AssemblyFile="$(ArtifactsBinDir)\WasmAppBuilder\$(Configuration)\$(NetCoreAppCurrent)\publish\WasmAppBuilder.dll"/>
 
   <Target Name="BuildApp" DependsOnTargets="RebuildWasmAppBuilder;Build">
     <ItemGroup>
index 9cd0b9b..6dc4699 100644 (file)
@@ -43,10 +43,12 @@ emsdk_env.sh: | provision-wasm
        cd $(EMSDK_PATH) && ./emsdk construct_env $(CURDIR)/emsdk_env.sh
 
 MONO_OBJ_DIR=$(OBJDIR)/mono/Browser.wasm.$(CONFIG)
-MONO_LIBS = $(MONO_BIN_DIR)/{libmono-ee-interp.a,libmonosgen-2.0.a,libmono-ilgen.a,libmono-icall-table.a} ${SYS_NATIVE_DIR}/libSystem.Native.a
 MONO_INCLUDE_DIR=$(MONO_BIN_DIR)/include/mono-2.0
 BUILDS_BIN_DIR=$(MONO_BIN_DIR)/wasm/runtimes
 BUILDS_OBJ_DIR=$(MONO_OBJ_DIR)/wasm/runtimes
+MONO_LIBS = \
+       $(MONO_BIN_DIR)/{libmono-ee-interp.a,libmonosgen-2.0.a,libmono-ilgen.a,libmono-icall-table.a} \
+       ${SYS_NATIVE_DIR}/libSystem.Native.a
 
 EMCC_FLAGS=--profiling-funcs -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s BINARYEN=1 -s ALIASING_FUNCTION_POINTERS=0 -s NO_EXIT_RUNTIME=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'FS_createPath', 'FS_createDataFile', 'cwrap', 'setValue', 'getValue', 'UTF8ToString', 'addFunction']" -s "EXPORTED_FUNCTIONS=['_putchar']" --source-map-base http://example.com  -s WASM_OBJECT_FILES=0 -s FORCE_FILESYSTEM=1 -s USE_ZLIB=1
 EMCC_DEBUG_FLAGS =-g -Os -s ASSERTIONS=1 -DENABLE_NETCORE=1
@@ -90,7 +92,7 @@ $(eval $(call InterpBuildTemplate,debug,,$(EMCC_DEBUG_FLAGS),$(MONO_LIBS)))
 $(eval $(call InterpBuildTemplate,release,,$(EMCC_RELEASE_FLAGS),$(MONO_LIBS)))
 
 build:
-       EMSDK_PATH=$(PWD)/wasm/emsdk ../../../.dotnet/dotnet build /p:TargetArchitecture=wasm /p:TargetOS=Browser /p:Configuration=Release
+       EMSDK_PATH=$(PWD)/wasm/emsdk ../../../.dotnet/dotnet build /p:TargetArchitecture=wasm /p:TargetOS=Browser /p:Configuration=$(CONFIG)
 
 clean-emsdk:
        $(RM) -rf $(EMSDK_LOCAL_PATH)
index 3ea7167..d83f1fc 100644 (file)
@@ -4,7 +4,7 @@
   </PropertyGroup>
 
   <UsingTask TaskName="PInvokeTableGenerator"
-    AssemblyFile="$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WasmAppBuilder', '$(NetCoreAppCurrent)-$(MonoConfiguration)'))publish\WasmAppBuilder.dll"/>
+    AssemblyFile="$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WasmAppBuilder', '$(MonoConfiguration)', '$(NetCoreAppCurrent)'))publish\WasmAppBuilder.dll"/>
 
   <PropertyGroup>
     <WasmPInvokeTablePath>$(MonoObjDir)wasm/pinvoke-table.h</WasmPInvokeTablePath>
 
   <ItemGroup>
     <WasmPInvokeModules Include="libSystem.Native"/>
+    <WasmPInvokeModules Include="libSystem.Security.Cryptography.Native.OpenSsl"/>
     <WasmPInvokeAssemblies Include="$(MonoArtifactsPath)\System.Private.CoreLib.dll"/>
     <WasmPInvokeAssemblies Include="$(ArtifactsBinDir)\System.Runtime\$(NetCoreAppCurrent)-Unix-$(Configuration)\System.Runtime.dll"/>
     <WasmPInvokeAssemblies Include="$(ArtifactsBinDir)\System.Console\$(NetCoreAppCurrent)-Unix-$(Configuration)\System.Console.dll"/>
+    <WasmPInvokeAssemblies Include="$(ArtifactsBinDir)\System.Runtime.InteropServices.RuntimeInformation\$(NetCoreAppCurrent)-Unix-$(Configuration)\System.Runtime.InteropServices.RuntimeInformation.dll"/>
+    <WasmPInvokeAssemblies Include="$(ArtifactsBinDir)\System.IO.FileSystem\$(NetCoreAppCurrent)-Unix-$(Configuration)\System.IO.FileSystem.dll"/>
+    <WasmPInvokeAssemblies Include="$(ArtifactsBinDir)\System.IO.FileSystem.DriveInfo\$(NetCoreAppCurrent)-Unix-$(Configuration)\System.IO.FileSystem.DriveInfo.dll"/>
   </ItemGroup>
 
   <Target Name="CheckEnv">
   </Target>
 
   <Target Name="BuildWasmAppBuilder">
-    <MSBuild Projects="$(MonoProjectRoot)mono.proj"
+    <!-- Need to publish this since it references System.Reflection.MetadataLoadContext -->
+    <MSBuild Projects="$(RepoRoot)\tools-local\tasks\mobile.tasks\WasmAppBuilder\WasmAppBuilder.csproj"
              Properties="Configuration=$(Configuration)"
-             Targets="BuildWasmAppBuilder"/>
+             Targets="Restore;Build;Publish"/>
   </Target>
 
   <Target Name="BuildPInvokeTable" DependsOnTargets="CheckEnv;BuildWasmAppBuilder">
@@ -28,6 +28,7 @@ public class WasmAppBuilder : Task
     public string? MainJS { get; set; }
     [Required]
     public ITaskItem[]? AssemblySearchPaths { get; set; }
+    public ITaskItem[]? ExtraAssemblies { get; set; }
 
     Dictionary<string, Assembly>? Assemblies;
     Resolver? Resolver;
@@ -54,6 +55,13 @@ public class WasmAppBuilder : Task
         var mainAssembly = mlc.LoadFromAssemblyPath (MainAssembly);
         Add (mlc, mainAssembly);
 
+        if (ExtraAssemblies != null) {
+            foreach (var item in ExtraAssemblies) {
+                var refAssembly = mlc.LoadFromAssemblyPath (item.ItemSpec);
+                Add (mlc, refAssembly);
+            }
+        }
+
         // Create app
         Directory.CreateDirectory (AppDir!);
         Directory.CreateDirectory (Path.Join (AppDir, "managed"));
@@ -78,7 +86,7 @@ public class WasmAppBuilder : Task
         }
 
         using (var sw = File.CreateText (Path.Join (AppDir, "run-v8.sh"))) {
-            sw.WriteLine ("v8 --expose_wasm runtime.js -- --run " + Path.GetFileName (MainAssembly));
+            sw.WriteLine ("v8 --expose_wasm runtime.js -- --enable-gc --run " + Path.GetFileName (MainAssembly) + " $*");
         }
 
         return true;
@@ -1,7 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
+    <TargetFramework>$(NetCoreAppCurrent)</TargetFramework>
     <OutputType>Library</OutputType>
     <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
+    <Nullable>enable</Nullable>
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="Microsoft.Build" Version="$(RefOnlyMicrosoftBuildVersion)" />
index 5fc0d0a..a81e2f9 100644 (file)
@@ -5,6 +5,8 @@
                       Condition="'$(TargetOS)' != 'Android'" />
     <ProjectReference Remove="$(MSBuildThisFileDirectory)mobile.tasks\AppleAppBuilder\AppleAppBuilder.csproj"
                       Condition="'$(TargetOS)' != 'iOS' and '$(TargetOS)' != 'tvOS'" />
+    <ProjectReference Remove="$(MSBuildThisFileDirectory)mobile.tasks\WasmAppBuilder\WasmAppBuilder.csproj"
+                      Condition="'$(TargetOS)' != 'Browser'" />
     <ProjectReference Remove="$(MSBuildThisFileDirectory)mobile.tasks\AotCompilerTask\MonoAOTCompiler.csproj"
                       Condition="'$(TargetsMobile)' != 'true'" />
   </ItemGroup>