:: Entry point for running python scripts on windows systems.
::
:: Automatically generated by `create_entry_points.py`; DO NOT EDIT.
::
:: To make modifications to this file, edit `tools\maint\run_python_compiler.bat` and
:: then run `tools\maint\create_entry_points.py`

:: N.b. In Windows .bat scripts, the ':' character cannot appear inside any if () blocks,
:: or there will be a parsing error.

:: All env. vars specified in this file are to be local only to this script.
@setlocal
:: -E will not ignore _PYTHON_SYSCONFIGDATA_NAME an internal
:: of cpython used in cross compilation via setup.py.
@set _PYTHON_SYSCONFIGDATA_NAME=
@set _EM_PY=%EMSDK_PYTHON%
@if "%_EM_PY%"=="" (
  set _EM_PY=python
)

:: Work around Windows bug https://github.com/microsoft/terminal/issues/15212 : If this
:: script is invoked via enclosing the invocation in quotes via PATH lookup, then %~f0 and
:: %~dp0 expansions will not work.
:: So first try if %~dp0 might work, and if not, manually look up this script from PATH.
@if exist "%~f0" (
  set "MYDIR=%~dp0"
  goto FOUND_MYDIR
)
@for %%I in (%~n0.bat) do (
  @if exist %%~$PATH:I (
    set MYDIR=%%~dp$PATH:I
  ) else (
    echo Fatal Error! Due to a Windows bug, we are unable to locate the path to %~n0.bat.
    echo To help this issue, try removing unnecessary quotes in the invocation of emcc,
    echo or add Emscripten directory to PATH.
    echo See github.com/microsoft/terminal/issues/15212 and
    echo github.com/emscripten-core/emscripten/issues/19207 for more details.
  )
)
:FOUND_MYDIR

:: N.b. when passing the -E flag to Python (ignore PYTHON* environment
:: variables (such as PYTHONPATH)), Python will revert to cp1252 encoding
:: on Windows by default, if stdout/stderr is redirected.
:: https://github.com/buildbot/buildbot/issues/9047
:: To avoid this from causing issues, explicitly specify the -X utf8 encoding
:: on tool invocations.

:: If _EMCC_CCACHE is not set, do a regular invocation of the python compiler driver.
:: Otherwise remove the ccache env. var, and then reinvoke this script with ccache enabled.
@if "%_EMCC_CCACHE%"=="" (
  set CMD="%_EM_PY%" -E -X utf8 "%MYDIR%%~n0.py"
) else (
  set _EMCC_CCACHE=
  set CMD=ccache "%MYDIR%%~n0.bat"
)

:: Python Windows bug https://bugs.python.org/issue34780: If this script was invoked via a
:: shared stdin handle from the parent process, and that parent process stdin handle is in
:: a certain state, running python.exe might hang here. To work around this, if
:: EM_WORKAROUND_PYTHON_BUG_34780 is defined, invoke python with '< NUL' stdin to avoid
:: sharing the parent's stdin handle to it, avoiding the hang.

:: On Windows 7, the compiler batch scripts are observed to exit with a non-zero errorlevel,
:: even when the python executable above did succeed and quit with errorlevel 0 above.
:: On Windows 8 and newer, this issue has not been observed. It is possible that this
:: issue is related to the above python bug, but this has not been conclusively confirmed,
:: so using a separate env. var EM_WORKAROUND_WIN7_BAD_ERRORLEVEL_BUG to enable the known
:: workaround this issue, which is to explicitly quit the calling process with the previous
:: errorlevel from the above command.

:: Also must use goto to jump to the command dispatch, since we cannot invoke emcc from
:: inside a if() block, because if a cmdline param would contain a char '(' or ')', that
:: would throw off the parsing of the cmdline arg.
@if "%EM_WORKAROUND_PYTHON_BUG_34780%"=="" (
  @if "%EM_WORKAROUND_WIN7_BAD_ERRORLEVEL_BUG%"=="" (
    goto NORMAL
  ) else (
    goto NORMAL_EXIT
  )
) else (
  @if "%EM_WORKAROUND_WIN7_BAD_ERRORLEVEL_BUG%"=="" (
    goto MUTE_STDIN
  ) else (
    goto MUTE_STDIN_EXIT
  )
)

:NORMAL_EXIT
@%CMD% %*
@exit %ERRORLEVEL%

:MUTE_STDIN
@%CMD% %* < NUL
@exit /b %ERRORLEVEL%

:MUTE_STDIN_EXIT
@%CMD% %* < NUL
@exit %ERRORLEVEL%

:NORMAL
@%CMD% %*
