Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions eng/.emscripten
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import os

LLVM_ROOT = os.path.expanduser(os.getenv('DOTNET_EMSCRIPTEN_LLVM_ROOT', ''))
NODE_JS = os.path.expanduser(os.getenv('DOTNET_EMSCRIPTEN_NODE_JS', ''))
BINARYEN_ROOT = os.path.expanduser(os.getenv('DOTNET_EMSCRIPTEN_BINARYEN_ROOT', ''))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we're setting these here, I don't think we can just remove them: https://github.com/dotnet/runtime/blob/28c4dce2c6a9a3619faa612095ed2125d03fbecd/src/mono/browser/build/BrowserWasmApp.targets#L202-L204

i.e. we need to make sure the toolchain still works when using the nuget packages on end-user machines.
I'm not sure everything uses the emsdk_env scripts for example.

Copy link
Member Author

@ilonatommy ilonatommy Jul 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the current state we are overwriting the contents of this file anyway, during provisioning, before it gets used.

i.e. we need to make sure the toolchain still works when using the nuget packages on end-user machines.

I produced nugets in this repo, copied them to runtime repo and tested how the build process goes and it worked fine. If that succeeded, where else it could go wrong? What other tests do you propose?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The runtime build is kinda special. I'd recommend trying a normal blazor wasm build.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, tested blazor:

  • run
  • publish
  • AOT publish
    No errors detected.

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('FROZEN_CACHE', 'True'))

COMPILER_ENGINE = NODE_JS
Expand Down
61 changes: 36 additions & 25 deletions eng/emsdk_env.cmd
Original file line number Diff line number Diff line change
@@ -1,64 +1,75 @@
@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%

@echo off
echo *** .NET EMSDK path setup ***

REM emscripten (emconfigure, em++, etc)
if "%EMSDK_PATH%"=="" (
echo %EMSDK_PATH% is empty
exit /b 1
echo %EMSDK_PATH% is empty
exit /b 1
)
set "TOADD_PATH_EMSCRIPTEN=%EMSDK_PATH%emscripten"
echo PATH += %TOADD_PATH_EMSCRIPTEN%
set "PATH=%TOADD_PATH_EMSCRIPTEN%;%PATH%"

REM python
if "%EMSDK_PYTHON%"=="" (
echo %EMSDK_PYTHON% is empty
exit /b 1
echo %EMSDK_PYTHON% is empty
exit /b 1
)
set "TOADD_PATH_PYTHON=%EMSDK_PYTHON%"
echo PATH += %TOADD_PATH_PYTHON%
set "PATH=%TOADD_PATH_PYTHON%;%PATH%"

REM llvm (clang, etc)
if "%DOTNET_EMSCRIPTEN_LLVM_ROOT%"=="" (
echo %DOTNET_EMSCRIPTEN_LLVM_ROOT% is empty
exit /b 1
echo %DOTNET_EMSCRIPTEN_LLVM_ROOT% is empty
exit /b 1
)
set "TOADD_PATH_LLVM=%DOTNET_EMSCRIPTEN_LLVM_ROOT%"
if not "%TOADD_PATH_EMSCRIPTEN%"=="%TOADD_PATH_LLVM%" (
echo PATH += %TOADD_PATH_LLVM%
set "PATH=%TOADD_PATH_LLVM%;%PATH%"
echo PATH += %TOADD_PATH_LLVM%
set "PATH=%TOADD_PATH_LLVM%;%PATH%"
)

REM nodejs (node)
if "%DOTNET_EMSCRIPTEN_NODE_JS%"=="" (
echo %DOTNET_EMSCRIPTEN_NODE_JS% is empty
exit /b 1
echo %DOTNET_EMSCRIPTEN_NODE_JS% is empty
exit /b 1
)
if "%DOTNET_EMSCRIPTEN_NODE_PATH%"=="" (
echo %DOTNET_EMSCRIPTEN_NODE_PATH% is empty
exit /b 1
echo %DOTNET_EMSCRIPTEN_NODE_PATH% is empty
exit /b 1
)
set "TOADD_PATH_NODEJS=%DOTNET_EMSCRIPTEN_NODE_JS%"
if not "%TOADD_PATH_EMSCRIPTEN%"=="%TOADD_PATH_NODEJS%" (
if not "%TOADD_PATH_LLVM%"=="%TOADD_PATH_NODEJS%" (
echo NODE PATH += %TOADD_PATH_NODEJS%
set "PATH=%TOADD_PATH_NODEJS%;%PATH%"
set "PATH=%DOTNET_EMSCRIPTEN_NODE_PATH%;%PATH%"
)
if not "%TOADD_PATH_LLVM%"=="%TOADD_PATH_NODEJS%" (
echo NODE PATH += %TOADD_PATH_NODEJS%
set "PATH=%TOADD_PATH_NODEJS%;%PATH%"
set "PATH=%DOTNET_EMSCRIPTEN_NODE_PATH%;%PATH%"
)
)

REM binaryen (wasm-opt, etc)
if "%DOTNET_EMSCRIPTEN_BINARYEN_ROOT%"=="" (
echo %DOTNET_EMSCRIPTEN_BINARYEN_ROOT% is empty
exit /b 1
echo %DOTNET_EMSCRIPTEN_BINARYEN_ROOT% is empty
exit /b 1
)
set "TOADD_PATH_BINARYEN=%DOTNET_EMSCRIPTEN_BINARYEN_ROOT%bin"
if not "%TOADD_PATH_EMSCRIPTEN%"=="%TOADD_PATH_BINARYEN%" (
if not "%TOADD_PATH_LLVM%"=="%TOADD_PATH_BINARYEN%" (
if not "%TOADD_PATH_NODEJS%"=="%TOADD_PATH_BINARYEN%" (
echo PATH += %TOADD_PATH_BINARYEN%
set "PATH=%TOADD_PATH_BINARYEN%;%PATH%"
if not "%TOADD_PATH_LLVM%"=="%TOADD_PATH_BINARYEN%" (
if not "%TOADD_PATH_NODEJS%"=="%TOADD_PATH_BINARYEN%" (
echo PATH += %TOADD_PATH_BINARYEN%
set "PATH=%TOADD_PATH_BINARYEN%;%PATH%"
)
)
)
)
)
102 changes: 78 additions & 24 deletions eng/emsdk_env.sh
Original file line number Diff line number Diff line change
@@ -1,44 +1,98 @@
#!/bin/bash
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 "${BASH_SOURCE-}" ]; then
CURRENT_SCRIPT="$BASH_SOURCE"
elif [ -n "${ZSH_VERSION-}" ]; then
CURRENT_SCRIPT="${(%):-%x}"
elif [ -n "${KSH_VERSION-}" ]; then
CURRENT_SCRIPT=${.sh.file}
fi

if [ -n "${CURRENT_SCRIPT-}" ]; then
DIR=$(dirname "$CURRENT_SCRIPT")
if [ -h "$CURRENT_SCRIPT" ]; 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=$(dirname "$(ls -l "$CURRENT_SCRIPT" | sed -n "s/.*-> //p")")
if [ -z "$SYMDIR" ]; then
SYMDIR="."
fi
FULLDIR="$DIR/$SYMDIR"
DIR=$(cd "$FULLDIR" > /dev/null 2>&1; /bin/pwd)
unset SYMDIR
unset FULLDIR
fi
fi
unset CURRENT_SCRIPT

# Verify the emsdk directory
if [ ! -f "$DIR/emscripten/emcmake.py" ]; 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

# Set environment variables
export EMSDK_PATH=${DIR}/
unset DIR

export DOTNET_EMSCRIPTEN_LLVM_ROOT=${EMSDK_PATH}bin/
export DOTNET_EMSCRIPTEN_NODE_JS=${EMSDK_PATH}node/bin/node
export DOTNET_EMSCRIPTEN_BINARYEN_ROOT=${EMSDK_PATH}

echo "*** .NET EMSDK path setup ***"

fail_if_empty() {
local var_name="$1"
local var_value="${!var_name}"
if [ -z "${var_value}" ]; then
echo "/${var_name} is empty"
exit 1
fi
}

add_to_path() {
local dir_path="$1"
echo "PATH += $dir_path"
export PATH="$dir_path:$PATH"
}

# emscripten (emconfigure, em++, etc)
if [ -z "${EMSDK_PATH}" ]; then
echo "\$EMSDK_PATH is empty"
exit 1
fi
fail_if_empty "EMSDK_PATH"
TOADD_PATH_EMSCRIPTEN="$(realpath ${EMSDK_PATH}/emscripten)"
echo "PATH += ${TOADD_PATH_EMSCRIPTEN}"
export PATH=${TOADD_PATH_EMSCRIPTEN}:$PATH
add_to_path "$TOADD_PATH_EMSCRIPTEN"

# llvm (clang, etc)
if [ -z "${DOTNET_EMSCRIPTEN_LLVM_ROOT}" ]; then
echo "\$DOTNET_EMSCRIPTEN_LLVM_ROOT is empty"
exit 1
fi
fail_if_empty "DOTNET_EMSCRIPTEN_LLVM_ROOT"
TOADD_PATH_LLVM="$(realpath ${DOTNET_EMSCRIPTEN_LLVM_ROOT})"
if [ "${TOADD_PATH_EMSCRIPTEN}" != "${TOADD_PATH_LLVM}" ]; then
echo "PATH += ${TOADD_PATH_LLVM}"
export PATH=${TOADD_PATH_LLVM}:$PATH
add_to_path "$TOADD_PATH_LLVM"
fi

# nodejs (node)
if [ -z "${DOTNET_EMSCRIPTEN_NODE_JS}" ]; then
echo "\$DOTNET_EMSCRIPTEN_NODE_JS is empty"
exit 1
fi
fail_if_empty "DOTNET_EMSCRIPTEN_NODE_JS"
TOADD_PATH_NODEJS="$(dirname ${DOTNET_EMSCRIPTEN_NODE_JS})"
if [ "${TOADD_PATH_EMSCRIPTEN}" != "${TOADD_PATH_NODEJS}" ] && [ "${TOADD_PATH_LLVM}" != "${TOADD_PATH_NODEJS}" ]; then
echo "PATH += ${TOADD_PATH_NODEJS}"
export PATH=${TOADD_PATH_NODEJS}:$PATH
add_to_path "$TOADD_PATH_NODEJS"
fi

# binaryen (wasm-opt, etc)
if [ -z "${DOTNET_EMSCRIPTEN_BINARYEN_ROOT}" ]; then
echo "\$DOTNET_EMSCRIPTEN_BINARYEN_ROOT is empty"
exit 1
fi
fail_if_empty "DOTNET_EMSCRIPTEN_BINARYEN_ROOT"
TOADD_PATH_BINARYEN="$(realpath ${DOTNET_EMSCRIPTEN_BINARYEN_ROOT}/bin)"
if [ "${TOADD_PATH_EMSCRIPTEN}" != "${TOADD_PATH_BINARYEN}" ] && [ "${TOADD_PATH_LLVM}" != "${TOADD_PATH_BINARYEN}" ] && [ "${TOADD_PATH_NODEJS}" != "${TOADD_PATH_BINARYEN}" ]; then
echo "PATH += ${TOADD_PATH_BINARYEN}"
export PATH=${TOADD_PATH_BINARYEN}:$PATH
add_to_path "$TOADD_PATH_BINARYEN"
fi