diff --git a/eng/native/gen-buildsys.cmd b/eng/native/gen-buildsys.cmd
index 83682d69cfc39..eea8bc39be833 100644
--- a/eng/native/gen-buildsys.cmd
+++ b/eng/native/gen-buildsys.cmd
@@ -109,7 +109,7 @@ if not "%__ConfigureOnly%" == "1" (
)
if /i "%__UseEmcmake%" == "1" (
- call "!EMSDK_PATH!/emsdk_env.cmd" > nul 2>&1 && emcmake "%CMakePath%" %__ExtraCmakeParams% --no-warn-unused-cli -G "%__CmakeGenerator%" -B %__IntermediatesDir% -S %__SourceDir%
+ call "!EMSDK_PATH!/pre_emsdk_env.cmd" > nul 2>&1 && call "!EMSDK_PATH!/emsdk_env.cmd" > nul 2>&1 && emcmake "%CMakePath%" %__ExtraCmakeParams% --no-warn-unused-cli -G "%__CmakeGenerator%" -B %__IntermediatesDir% -S %__SourceDir%
) else (
"%CMakePath%" %__ExtraCmakeParams% --no-warn-unused-cli -G "%__CmakeGenerator%" -B %__IntermediatesDir% -S %__SourceDir%
)
diff --git a/src/mono/browser/browser.proj b/src/mono/browser/browser.proj
index 759fa68ae5474..1a787c18c1eab 100644
--- a/src/mono/browser/browser.proj
+++ b/src/mono/browser/browser.proj
@@ -415,13 +415,13 @@
$(CMakeBuildRuntimeConfigureCmd) -DENABLE_JS_INTEROP_BY_VALUE=1
$(CMakeBuildRuntimeConfigureCmd) $(CMakeConfigurationEmsdkPath)
- call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env.cmd'))" && $(CMakeBuildRuntimeConfigureCmd)
- bash -c 'source $(EMSDK_PATH)/emsdk_env.sh 2>&1 && $(CMakeBuildRuntimeConfigureCmd)'
+ call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'pre_emsdk_env.cmd'))" && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env.cmd'))" && $(CMakeBuildRuntimeConfigureCmd)
+ bash -c 'source $(EMSDK_PATH)/pre_emsdk_env.sh && source $(EMSDK_PATH)/emsdk_env.sh 2>&1 && $(CMakeBuildRuntimeConfigureCmd)'
-v
cmake --build . --config $(Configuration) $(CmakeOptions)
- call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env.cmd'))" && $(CMakeBuildRuntimeCmd)
- bash -c 'source $(EMSDK_PATH)/emsdk_env.sh 2>&1 && $(CMakeBuildRuntimeCmd)'
+ call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'pre_emsdk_env.cmd'))" && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env.cmd'))" && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env.cmd'))" && $(CMakeBuildRuntimeCmd)
+ bash -c 'source $(EMSDK_PATH)/pre_emsdk_env.sh && source $(EMSDK_PATH)/emsdk_env.sh 2>&1 && $(CMakeBuildRuntimeCmd)'
<_CmakeEnvironmentVariable Include="ENABLE_JS_INTEROP_BY_VALUE=1" Condition="'$(WasmEnableJsInteropByValue)' != 'false'"/>
diff --git a/src/mono/browser/build/BrowserWasmApp.targets b/src/mono/browser/build/BrowserWasmApp.targets
index 3b5683433fe86..f15458a9273bf 100644
--- a/src/mono/browser/build/BrowserWasmApp.targets
+++ b/src/mono/browser/build/BrowserWasmApp.targets
@@ -175,12 +175,25 @@
+
+
+
+
+ $([System.Text.RegularExpressions.Regex]::Match($(NuGetLocalsOutput), 'global-packages:\s*([^;]+)').Groups[1].Value)
+
+
+ $([System.IO.Path]::Combine($(GlobalPackagesPath), 'runtime.$(_portableHostOS)-$(BuildArchitecture).microsoft.netcore.runtime.wasm.node.transport'))
<_EMSDKMissingPaths Condition="'$(_EMSDKMissingPaths)' == '' and ('$(EmscriptenSdkToolsPath)' == '' or !Exists('$(EmscriptenSdkToolsPath)'))">%24(EmscriptenSdkToolsPath)=$(EmscriptenSdkToolsPath)
<_EMSDKMissingPaths Condition="'$(_EMSDKMissingPaths)' == '' and ('$(EmscriptenNodeToolsPath)' == '' or !Exists('$(EmscriptenNodeToolsPath)'))">%24(EmscriptenNodeToolsPath)=$(EmscriptenNodeToolsPath)
<_EMSDKMissingPaths Condition="'$(_EMSDKMissingPaths)' == '' and ('$(EmscriptenUpstreamBinPath)' == '' or !Exists('$(EmscriptenUpstreamBinPath)'))">%24(EmscriptenUpstreamBinPath)=$(EmscriptenUpstreamBinPath)
+
+
+
+
+
<_ToolchainMissingErrorMessage Condition="'$(EMSDK_PATH)' == '' and '$(EmscriptenSdkToolsPath)' == ''">Could not find emscripten sdk. Either set %24(EMSDK_PATH), or use workloads to get the sdk.
@@ -189,19 +202,24 @@
<_ToolchainMissingErrorMessage Condition="'$(_ToolchainMissingErrorMessage)' == '' and '$(_UsingEMSDK_PATH)' == 'true' and '$(_EMSDKMissingPaths)' != ''">Specified Emscripten sdk at %24(EMSDK_PATH)=$(EMSDK_PATH) is missing some paths: $(_EMSDKMissingPaths).
<_IsToolchainMissing Condition="'$(_ToolchainMissingErrorMessage)' != ''">true
+ <_ToolchainMissingErrorMessage>$(_ToolchainMissingErrorMessage); [DEBUG] Directories at $(NodeTransportDir): %(NodeTransportDirContents.Identity); Directories at $(PackagesDir): %(PackagesDirContents.Identity);
$([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath)))
$([MSBuild]::NormalizeDirectory($(EmscriptenNodeToolsPath)))
$([MSBuild]::NormalizeDirectory($(EmscriptenUpstreamBinPath)))
+ <_EmscriptenNodePath>$([MSBuild]::NormalizePath($(EmscriptenNodeToolsPath), 'bin', 'node$(_ExeExt)'))
+
-
+
+
+
diff --git a/src/mono/browser/build/EmSdkRepo.Defaults.props b/src/mono/browser/build/EmSdkRepo.Defaults.props
index aa94ded228bfc..9e28b902f891f 100644
--- a/src/mono/browser/build/EmSdkRepo.Defaults.props
+++ b/src/mono/browser/build/EmSdkRepo.Defaults.props
@@ -7,15 +7,20 @@
$([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath), 'bin'))
$([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath), 'emscripten'))
+ <_PathToNugetsAvailable Condition="'$(NuGetPackageRoot)' != '' and '$(_portableHostOS)' != '' and '$(BuildArchitecture)' != '' and '$(NodePackageVersion)' != ''">true
+
- $([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath), 'node', 'bin'))
+ $([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath), 'node', 'bin'))
+ $([System.IO.Path]::Combine($(NuGetPackageRoot), 'runtime.$(_portableHostOS)-$(BuildArchitecture).microsoft.netcore.runtime.wasm.node.transport', '$(NodePackageVersion)', 'tools', '$(_portableHostOS)-$(BuildArchitecture)'))
<_UsingEMSDK_PATH>true
- $([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath)python))
+ <_PathToNugetsAvailable Condition="'$(NuGetPackageRoot)' != '' and '$(EmsdkVersion)' != '' and '$(BuildArchitecture)' != '' and '$(EmsdkPackageVersion)' != ''">true
+ $([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath)python))
+ $([MSBuild]::NormalizeDirectory($([System.IO.Path]::Combine($(NuGetPackageRoot), 'Microsoft.NET.Runtime.Emscripten.$(EmsdkVersion).Python.win-$(BuildArchitecture)', '$(EmsdkPackageVersion)', 'tools'))))
<_EMSDKMissingPaths Condition="'$(_EMSDKMissingPaths)' == '' and ('$(EmscriptenPythonToolsPath)' == '' or !Exists('$(EmscriptenPythonToolsPath)'))">%24(EmscriptenPythonToolsPath)=$(EmscriptenPythonToolsPath)
diff --git a/src/mono/mono.proj b/src/mono/mono.proj
index 5be3d221fd5b7..885c9cba4f0a6 100644
--- a/src/mono/mono.proj
+++ b/src/mono/mono.proj
@@ -170,127 +170,54 @@
.ps1
$(ProvisionEmscriptenDir)
- $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', 'browser'))
- emsdk
%(_VersionLines.Identity)
- <_EmsdkPaths Condition="'$(HostOS)' != 'windows'">
-CURRENT_SCRIPT=
-DIR="."
-
-# use shell specific method to get the path
-# to the current file being source'd.
-#
-# To add a shell, add another conditional below,
-# then add tests to scripts/test_source_env.sh
-
-if [ -n "%24{BASH_SOURCE-}" ]%3B then
- CURRENT_SCRIPT="%24BASH_SOURCE"
-elif [ -n "%24{ZSH_VERSION-}" ]%3B then
- CURRENT_SCRIPT="%24{(%):-%x}"
-elif [ -n "%24{KSH_VERSION-}" ]%3B then
- CURRENT_SCRIPT=%24{.sh.file}
-fi
-
-if [ -n "%24{CURRENT_SCRIPT-}" ]%3B then
- DIR=%24(dirname "%24CURRENT_SCRIPT")
- if [ -h "%24CURRENT_SCRIPT" ]%3B then
- # Now work out actual DIR since this is part of a symlink.
- # Since we can't be sure that readlink or realpath
- # are available, use tools more likely to be installed.
- # (This will still fail if sed is not available.)
- SYMDIR=%24(dirname "%24(ls -l "%24CURRENT_SCRIPT" | sed -n "s/.*-> //p")")
- if [ -z "%24SYMDIR" ]%3B then
- SYMDIR="."
- fi
- FULLDIR="%24DIR/%24SYMDIR"
- DIR=%24(cd "%24FULLDIR" > /dev/null 2>&1%3B /bin/pwd)
- unset SYMDIR
- unset FULLDIR
- fi
-fi
-unset CURRENT_SCRIPT
-
-if [ ! -f "%24DIR/emscripten/emcmake.py" ]%3B then
- echo "Error: unable to determine 'emsdk' directory. Perhaps you are using a shell or" 1>&2
- echo " environment that this script does not support." 1>&2
- echo 1>&2
- echo "A possible solution is to source this script while in the 'emsdk' directory." 1>&2
- echo 1>&2
- unset DIR
- return
-fi
-
-export EMSDK_PATH=%24{DIR}/
-unset DIR
-
-export DOTNET_EMSCRIPTEN_LLVM_ROOT=%24{EMSDK_PATH}bin/
-export DOTNET_EMSCRIPTEN_NODE_JS=%24{EMSDK_PATH}node/bin/node
-export DOTNET_EMSCRIPTEN_BINARYEN_ROOT=%24{EMSDK_PATH}
-
-
- <_EmsdkPaths Condition="'$(HostOS)' == 'windows'">
-@echo off
-
-set CURRENT_SCRIPT=%~dp0
-set EMSDK_PATH=%CURRENT_SCRIPT:~0,-1%\
-
-set EMSDK_PYTHON=%EMSDK_PATH%python\python.exe
-set DOTNET_EMSCRIPTEN_LLVM_ROOT=%EMSDK_PATH%bin\
-set DOTNET_EMSCRIPTEN_NODE_JS=%EMSDK_PATH%node\bin\node
-set DOTNET_EMSCRIPTEN_NODE_PATH=%EMSDK_PATH%node\bin\
-set DOTNET_EMSCRIPTEN_BINARYEN_ROOT=%EMSDK_PATH%
-
-
- <_EmscriptenPaths>
-import os
-
-emsdk_path = os.path.dirname(os.path.dirname(os.path.realpath(os.getenv('EM_CONFIG')).replace('\\', '/')))
-
-LLVM_ROOT = emsdk_path + '/bin'
-NODE_JS = emsdk_path + '/node/bin/node'
-BINARYEN_ROOT = emsdk_path
-
-FROZEN_CACHE = bool(os.getenv('EM_FROZEN_CACHE', 'True'))
-
-COMPILER_ENGINE = NODE_JS
-JS_ENGINES = [NODE_JS]
-
- setlocal EnableDelayedExpansion && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env$(ScriptExt)'))" && !EMSDK_PYTHON!
+ setlocal EnableDelayedExpansion && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'pre_emsdk_env$(ScriptExt)'))" && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env$(ScriptExt)'))" && !EMSDK_PYTHON!
+ $([MSBuild]::EnsureTrailingSlash('$(EMSDK_PATH)').Replace('\', '/'))
+ $([MSBuild]::EnsureTrailingSlash('$(NuGetPackageRoot)').Replace('\', '/'))
+ $([MSBuild]::EnsureTrailingSlash('$(EMSDK_PATH)bin').Replace('/', '\'))
+ $(NuGetPackageRoot)runtime.$(_portableHostOS)-$(BuildArchitecture).microsoft.netcore.runtime.wasm.node.transport/$(NodePackageVersion)/tools/$(_portableHostOS)-$(BuildArchitecture)/bin
+ $(DOTNET_EMSCRIPTEN_NODE_PATH)/node
+ $(EM_FROZEN_CACHE)
+ true
+ $(NuGetPackageRoot)Microsoft.NET.Runtime.Emscripten.$(EmsdkVersion).Python.win-$(BuildArchitecture)/$(EmsdkPackageVersion)/tools/python.exe
+ <_PreEmsdkEnvScriptPath>$(EMSDK_PATH)pre_emsdk_env$(ScriptExt)
+ <_SetOrExport Condition="'$(HostOS)' != 'windows'">export
+ <_SetOrExport Condition="'$(HostOS)' == 'windows'">set
-
+
+
+ <_PreEmsdkEnvScriptLines Include="@echo off" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) EMSDK_PYTHON=$(EMSDK_PYTHON)" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) EM_BINARYEN_ROOT=$(EMSDK_PATH)" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) DOTNET_EMSCRIPTEN_NODE_PATH=$(DOTNET_EMSCRIPTEN_NODE_PATH)" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) EM_NODE_JS=$(DOTNET_EMSCRIPTEN_NODE_JS)" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) EM_LLVM_ROOT=$(DOTNET_EMSCRIPTEN_LLVM_ROOT)" />
+
+
+ <_PreEmsdkEnvScriptLines Include="#!/bin/bash" />
+
+
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) EMSDK_PATH=$(EMSDK_PATH)" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) DOTNET_EMSCRIPTEN_NODE_JS=$(DOTNET_EMSCRIPTEN_NODE_JS)" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) DOTNET_EMSCRIPTEN_LLVM_ROOT=$(DOTNET_EMSCRIPTEN_LLVM_ROOT)" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) DOTNET_EMSCRIPTEN_BINARYEN_ROOT=$(EMSDK_PATH)" />
+ <_PreEmsdkEnvScriptLines Include="$(_SetOrExport) FROZEN_CACHE=$(DOTNET_EMSCRIPTEN_CACHE)" />
+
+
+
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
false
-
+
@@ -351,8 +278,8 @@ JS_ENGINES = [NODE_JS]
See https://github.com/llvm/llvm-project/pull/98373
See https://github.com/dotnet/runtime/issues/104773
-->
-
@@ -726,6 +653,8 @@ JS_ENGINES = [NODE_JS]
<_MonoCFLAGSOption>-DCMAKE_C_FLAGS="@(_MonoCPPFLAGS, ' ') @(_MonoCFLAGS, ' ')"
<_MonoCXXFLAGSOption>-DCMAKE_CXX_FLAGS="@(_MonoCPPFLAGS, ' ') @(_MonoCXXFLAGS, ' ')"
+ <_ScriptExecutor Condition="'$(HostOS)' != 'windows'">.
+ <_ScriptExecutor Condition="'$(HostOS)' == 'windows'">call
<_MonoCMakeArgs Include="$(_MonoCFLAGSOption)"/>
@@ -733,8 +662,8 @@ JS_ENGINES = [NODE_JS]
- $([MSBuild]::EnsureTrailingSlash('$(EMSDK_PATH)').Replace('\', '/'))
<_EmsdkEnvScriptPath>$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env$(ScriptExt)'))
+ <_PreEmsdkEnvScriptPath>$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'pre_emsdk_env$(ScriptExt)'))
<_MonoCMakeConfigureCommand>cmake @(_MonoCMakeArgs, ' ') $(MonoCMakeExtraArgs) "$(MonoProjectRoot.TrimEnd('\/'))"
<_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true' and '$(_MonoSkipInitCompiler)' != 'true' and '$(HostOS)' != 'windows'">sh -c 'build_arch="$(_CompilerTargetArch)" compiler="$(MonoCCompiler)" . "$(RepositoryEngineeringCommonDir)native/init-compiler.sh" && @(_MonoBuildEnv, ' ') $(_MonoCMakeConfigureCommand)'
@@ -742,11 +671,12 @@ JS_ENGINES = [NODE_JS]
<_MonoCMakeConfigureCommand Condition="'$(TargetsWasi)' == 'true'">$(_MonoCMakeConfigureCommand) -DWASI_SDK_PREFIX=$(WASI_SDK_PATH) -DCMAKE_SYSROOT=$(WASI_SDK_PATH)share/wasi-sysroot -DCMAKE_TOOLCHAIN_FILE=$(WASI_SDK_PATH)/share/cmake/wasi-sdk-p2.cmake -DCMAKE_CXX_FLAGS="--sysroot=$(WASI_SDK_PATH)share/wasi-sysroot"
<_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true' and '$(HostOS)' == 'windows'">call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" $(_CompilerTargetArch) && cd /D "$(MonoObjDir)" && @(_MonoBuildEnv, ' ') $(_MonoCMakeConfigureCommand)
- <_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' == 'true' and '$(HostOS)' != 'windows'">bash -c 'source $(_EmsdkEnvScriptPath) 2>&1 && emcmake $(_MonoCMakeConfigureCommand)'
- <_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' == 'true' and '$(HostOS)' == 'windows'">call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" && call "$(_EmsdkEnvScriptPath)" && emcmake $(_MonoCMakeConfigureCommand)
+ <_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' == 'true' and '$(HostOS)' != 'windows'">bash -c 'source $(_PreEmsdkEnvScriptPath) && source $(_EmsdkEnvScriptPath) 2>&1 && emcmake $(_MonoCMakeConfigureCommand)'
+ <_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' == 'true' and '$(HostOS)' == 'windows'">call "$(_PreEmsdkEnvScriptPath)" && call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" && call "$(_EmsdkEnvScriptPath)" && emcmake $(_MonoCMakeConfigureCommand)
<_MonoCMakeConfigureCommand Condition="'$(TargetsWasi)' == 'true' and '$(HostOS)' == 'windows'">call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" && cmake $(_MonoCMakeConfigureCommand)
<_MonoCMakeBuildCommand>cmake --build . --target install --config $(Configuration)
+ <_MonoCMakeBuildCommand Condition="'$(TargetsBrowser)' == 'true'">$(_ScriptExecutor) "$(_PreEmsdkEnvScriptPath)" && $(_MonoCMakeBuildCommand)
<_MonoCMakeBuildCommand Condition="'$(MonoVerboseBuild)' == 'true'">$(_MonoCMakeBuildCommand) --verbose
<_MonoCMakeBuildCommand Condition="'$(_MonoUseNinja)' != 'true'">$(_MonoCMakeBuildCommand) --parallel $([System.Environment]::ProcessorCount)
<_MonoCMakeBuildCommand Condition="'$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true' and '$(HostOS)' != 'windows'">@(_MonoBuildEnv, ' ') $(_MonoCMakeBuildCommand)
@@ -992,6 +922,7 @@ JS_ENGINES = [NODE_JS]
<_MonoAotCMakeConfigureCommand Condition="'$(_MonoSkipInitCompiler)' == 'true' and '$(HostOS)' != 'windows'">$(_MonoAOTCCOption) $(_MonoAOTCXXOption) @(_MonoAotBuildEnv, ' ') $(_MonoAotCMakeConfigureCommand)
<_MonoAotCMakeConfigureCommand Condition="'$(HostOS)' == 'windows'">call "$(RepositoryEngineeringDir)native\init-vs-env.cmd" $(_CompilerTargetArch) && cd /D "$(MonoObjCrossDir)" && @(_MonoAotBuildEnv, ' ') $(_MonoAotCMakeConfigureCommand)
<_MonoAotCMakeBuildCommand>cmake --build . --target install --config $(Configuration)
+ <_MonoAotCMakeBuildCommand Condition="'$(TargetsBrowser)' == 'true'">$(_ScriptExecutor) "$(_PreEmsdkEnvScriptPath)" && $(_MonoAotCMakeBuildCommand)
<_MonoAotCMakeBuildCommand Condition="'$(MonoVerboseBuild)' == 'true'">$(_MonoAotCMakeBuildCommand) --verbose
<_MonoAotCMakeBuildCommand Condition="'$(_MonoUseNinja)' != 'true'">$(_MonoAotCMakeBuildCommand) --parallel $([System.Environment]::ProcessorCount)
<_MonoAotCMakeBuildCommand Condition="'$(HostOS)' != 'windows'">@(_MonoAotBuildEnv, ' ') $(_MonoAotCMakeBuildCommand)
diff --git a/src/native/libs/build-native.proj b/src/native/libs/build-native.proj
index 36bfccbfe07ad..ba2ff4564afe1 100644
--- a/src/native/libs/build-native.proj
+++ b/src/native/libs/build-native.proj
@@ -78,10 +78,15 @@
BeforeTargets="Build"
Condition="$([MSBuild]::IsOsPlatform(Windows))">
- <_BuildNativeArgs Condition="'$(Ninja)' == 'false'">$(_BuildNativeArgs) msbuild
+ <_BuildNativeArgs Condition="'$(Ninja)' == 'false'">$(_BuildNativeArgs) msbuild
+ $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', '..', '..', 'mono', 'browser', 'emsdk'))
+ $(ProvisionEmscriptenDir.Replace('\', '/'))
+ $(EMSDK_PATH)bin
+ $(NuGetPackageRoot)runtime.$(_portableHostOS)-$(BuildArchitecture).microsoft.netcore.runtime.wasm.node.transport/$(NodePackageVersion)/tools/$(_portableHostOS)-$(BuildArchitecture)/bin/node
+ <_BuildNativeEnvironmentVariables>$(_BuildNativeEnvironmentVariables);DOTNET_EMSCRIPTEN_LLVM_ROOT=$(DOTNET_EMSCRIPTEN_LLVM_ROOT);EM_LLVM_ROOT=$(DOTNET_EMSCRIPTEN_LLVM_ROOT);DOTNET_EMSCRIPTEN_NODE_JS=$(DOTNET_EMSCRIPTEN_NODE_JS);DOTNET_EMSCRIPTEN_BINARYEN_ROOT=$(EMSDK_PATH)
-
+
diff --git a/src/native/libs/build-native.sh b/src/native/libs/build-native.sh
index 5169732c2d641..4fe7539da80a8 100755
--- a/src/native/libs/build-native.sh
+++ b/src/native/libs/build-native.sh
@@ -62,6 +62,7 @@ if [[ "$__TargetOS" == browser ]]; then
exit 1
fi
fi
+ source "$EMSDK_PATH"/pre_emsdk_env.sh
source "$EMSDK_PATH"/emsdk_env.sh
export CLR_CC=$(which emcc)
elif [[ "$__TargetOS" == wasi ]]; then
diff --git a/src/tasks/WasmAppBuilder/RunWithEmSdkEnv.cs b/src/tasks/WasmAppBuilder/RunWithEmSdkEnv.cs
index e17e01f870fac..6e90f67b303c1 100644
--- a/src/tasks/WasmAppBuilder/RunWithEmSdkEnv.cs
+++ b/src/tasks/WasmAppBuilder/RunWithEmSdkEnv.cs
@@ -25,19 +25,25 @@ public override bool Execute()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
+ string preEnvScriptPath = Path.Combine(EmSdkPath, "pre_emsdk_env.cmd");
+ if (!CheckEnvScript(preEnvScriptPath))
+ return false;
string envScriptPath = Path.Combine(EmSdkPath, "emsdk_env.cmd");
if (!CheckEnvScript(envScriptPath))
return false;
- Command = $"@cmd /c \"call \"{envScriptPath}\" > nul 2>&1 && {Command}\"";
+ Command = $"@cmd /c \"call \"{preEnvScriptPath}\" > nul 2>&1 && call \"{envScriptPath}\" > nul 2>&1 && {Command}\"";
}
else
{
+ string preEnvScriptPath = Path.Combine(EmSdkPath, "pre_emsdk_env.sh");
+ if (!CheckEnvScript(preEnvScriptPath))
+ return false;
string envScriptPath = Path.Combine(EmSdkPath, "emsdk_env.sh");
if (!CheckEnvScript(envScriptPath))
return false;
- Command = $"bash -c 'source {envScriptPath} > /dev/null 2>&1 && {Command}'";
+ Command = $"bash -c 'source {preEnvScriptPath} > /dev/null 2>&1 && source {envScriptPath} > /dev/null 2>&1 && {Command}'";
}
var workingDir = string.IsNullOrEmpty(WorkingDirectory) ? Directory.GetCurrentDirectory() : WorkingDirectory;