2017-07-17 06:15:48 -03:00
@ rem
@ rem Searches for python.exe and may download a private copy from nuget.
@ rem
@ rem This file is supposed to modify the state of the caller (specifically
@ rem the MSBUILD variable), so we do not use setlocal or echo, and avoid
@ rem changing any other persistent state.
@ rem
@ rem No arguments provided means do full search
@ if '%1 ' EQU '' goto : begin_search
@ rem One argument may be the full path. Use a goto so we don't try to
@ rem parse the next if statement - incorrect quoting in the multi-arg
@ rem case can cause us to break immediately.
@ if '%2 ' EQU '' goto : one_arg
@ rem Entire command line may represent the full path if quoting failed.
@ if exist " %* " ( set PYTHON = " %* " ) & ( set _Py_Python_Source = from environment) & goto : found
@ goto : begin_search
: one_arg
@ if exist " %~1 " ( set PYTHON = " %~1 " ) & ( set _Py_Python_Source = from environment) & goto : found
: begin_search
@ set PYTHON =
2019-11-18 13:32:25 -04:00
@ rem If there is an active virtual env, use that one
@ if NOT " %VIRTUAL_ENV% " == " " ( set PYTHON = " %VIRTUAL_ENV% \Scripts\python.exe " ) & ( set _Py_Python_Source = found in virtual env) & goto : found
2019-01-09 20:19:29 -04:00
@ set _Py_EXTERNALS_DIR = %EXTERNALS_DIR%
2017-07-17 06:15:48 -03:00
@ if " %_Py_EXTERNALS_DIR% " == " " ( set _Py_EXTERNALS_DIR = %~dp0 \..\externals)
@ rem If we have Python in externals, use that one
@ if exist " %_Py_EXTERNALS_DIR% \pythonx86\tools\python.exe " ( set PYTHON = " %_Py_EXTERNALS_DIR% \pythonx86\tools\python.exe " ) & ( set _Py_Python_Source = found in externals directory) & goto : found
2017-07-18 14:31:51 -03:00
@ rem If HOST_PYTHON is recent enough, use that
2021-04-26 16:11:43 -03:00
@ if NOT " %HOST_PYTHON% " == " " @ %HOST_PYTHON% -Ec " import sys; assert sys.version_info[:2] >= (3, 8) " > nul 2 > nul && ( set PYTHON = " %HOST_PYTHON% " ) && ( set _Py_Python_Source = found as HOST_PYTHON) && goto : found
2017-07-18 14:31:51 -03:00
2017-07-17 06:15:48 -03:00
@ rem If py.exe finds a recent enough version, use that one
2021-04-26 16:11:43 -03:00
@ for %% p in ( 3.9 3.8) do @ py -%% p -EV > nul 2 >& 1 && ( set PYTHON = py -%% p) && ( set _Py_Python_Source = found %% p with py.exe) && goto : found
2017-07-17 06:15:48 -03:00
@ if NOT exist " %_Py_EXTERNALS_DIR% " mkdir " %_Py_EXTERNALS_DIR% "
@ set _Py_NUGET = %NUGET%
@ set _Py_NUGET_URL = %NUGET_URL%
2017-07-18 14:31:51 -03:00
@ set _Py_HOST_PYTHON = %HOST_PYTHON%
@ if " %_Py_HOST_PYTHON% " == " " set _Py_HOST_PYTHON = py
@ if " %_Py_NUGET% " == " " ( set _Py_NUGET = %_Py_EXTERNALS_DIR% \nuget.exe)
2017-07-17 06:15:48 -03:00
@ if " %_Py_NUGET_URL% " == " " ( set _Py_NUGET_URL = https://aka.ms/nugetclidl)
@ if NOT exist " %_Py_NUGET% " (
@ echo Downloading nuget...
@ rem NB: Must use single quotes around NUGET here, NOT double!
@ rem Otherwise, a space in the path would break things
2017-07-17 09:55:28 -03:00
@ rem If it fails, retry with any available copy of Python
2017-07-18 14:31:51 -03:00
@ powershell.exe -Command Invoke-WebRequest %_Py_NUGET_URL% -OutFile '%_Py_NUGET% '
@ if errorlevel 1 (
2018-02-17 22:59:03 -04:00
@ %_Py_HOST_PYTHON% -E " %~dp0 \urlretrieve.py " " %_Py_NUGET_URL% " " %_Py_NUGET% "
2017-07-18 14:31:51 -03:00
)
2017-07-17 06:15:48 -03:00
)
@ echo Installing Python via nuget...
@ " %_Py_NUGET% " install pythonx86 -ExcludeVersion -OutputDirectory " %_Py_EXTERNALS_DIR% "
2018-09-17 18:41:53 -03:00
@ rem Quote it here; it's not quoted later because "py -x.y" wouldn't work
2017-07-17 06:15:48 -03:00
@ if not errorlevel 1 ( set PYTHON = " %_Py_EXTERNALS_DIR% \pythonx86\tools\python.exe " ) & ( set _Py_Python_Source = found on nuget.org) & goto : found
2017-07-18 14:31:51 -03:00
@ set _Py_Python_Source =
@ set _Py_EXTERNALS_DIR =
@ set _Py_NUGET =
@ set _Py_NUGET_URL =
@ set _Py_HOST_PYTHON =
2017-07-17 06:15:48 -03:00
@ exit /b 1
: found
@ echo Using %PYTHON% (%_Py_Python_Source% )
@ set _Py_Python_Source =
2017-07-18 14:31:51 -03:00
@ set _Py_EXTERNALS_DIR =
@ set _Py_NUGET =
@ set _Py_NUGET_URL =
@ set _Py_HOST_PYTHON =