From 162bc8159c322a760e8c75026369661521479cc4 Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Sat, 24 Jun 2017 16:09:53 -0400 Subject: [PATCH] build,windows: implement PEP514 python detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backport-PR-URL: https://github.com/nodejs/node/pull/14842 PR-URL: https://github.com/nodejs/node/pull/13900 Fixes: https://github.com/nodejs/node/issues/13882 Reviewed-By: Tobias Nießen --- tools/msvs/find_python.cmd | 51 ++++++++++++++++++++++++++++++++++++++ vcbuild.bat | 26 +++++++++++-------- 2 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 tools/msvs/find_python.cmd diff --git a/tools/msvs/find_python.cmd b/tools/msvs/find_python.cmd new file mode 100644 index 00000000000000..9b67764c7563ff --- /dev/null +++ b/tools/msvs/find_python.cmd @@ -0,0 +1,51 @@ +@IF NOT DEFINED DEBUG_HELPER @ECHO OFF +SETLOCAL +:: If python.exe is in %Path%, just validate +FOR /F "delims=" %%a IN ('where python 2^> NUL') DO ( + SET need_path=0 + SET p=%%~dpa + IF NOT ERRORLEVEL 1 GOTO :validate +) + +:: Query the 3 locations mentioned in PEP 514 for a python2 InstallPath +FOR %%K IN ( "HKCU\Software", "HKLM\SOFTWARE", "HKLM\Software\Wow6432Node") DO ( + SET need_path=1 + CALL :find-main-branch %%K + :: If validate returns 0 just jump to the end + IF NOT ERRORLEVEL 1 GOTO :validate +) +EXIT /B 1 + +:: Helper subroutine to handle quotes in %1 +:find-main-branch +SET main_key="%~1\Python\PythonCore" +REG QUERY %main_key% /s | findstr "2." | findstr InstallPath > NUL 2> NUL +IF NOT ERRORLEVEL 1 CALL :find-key %main_key% +EXIT /B + +:: Query registry sub-tree for InstallPath +:find-key +FOR /F "delims=" %%a IN ('REG QUERY %1 /s ^| findstr "2." ^| findstr InstallPath') DO IF NOT ERRORLEVEL 1 CALL :find-path %%a +EXIT /B + +:: Parse the value of %1 as the path for python.exe +:find-path +FOR /F "tokens=3*" %%a IN ('REG QUERY %1 /ve') DO ( + SET pt=%%a + IF NOT ERRORLEVEL 1 SET p=%pt% + EXIT /B 0 +) +EXIT /B 1 + +:: Check if %p% holds a path to a real python2 executable +:validate +IF NOT EXIST "%p%python.exe" EXIT /B 1 +:: Check if %p% is python2 +%p%python.exe -V 2>&1 | findstr /R "^Python.2.*" > NUL +IF ERRORLEVEL 1 EXIT /B %ERRORLEVEL% +:: We can wrap it up +ENDLOCAL & SET pt=%p%& SET need_path_ext=%need_path% +SET VCBUILD_PYTHON_LOCATION=%pt%python.exe +IF %need_path_ext%==1 SET Path=%Path%;%pt% +SET need_path_ext= +EXIT /B %ERRORLEVEL% \ No newline at end of file diff --git a/vcbuild.bat b/vcbuild.bat index 52b7916693235c..34130c5ccdc060 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -174,8 +174,7 @@ goto run if defined noprojgen goto msbuild @rem Generate the VS project. -echo configure %configure_flags% --dest-cpu=%target_arch% --tag=%TAG% -python configure %configure_flags% --dest-cpu=%target_arch% --tag=%TAG% +call :run-python configure %configure_flags% --dest-cpu=%target_arch% --tag=%TAG% if errorlevel 1 goto create-msvs-files-failed if not exist node.sln goto create-msvs-files-failed echo Project files generated. @@ -340,8 +339,7 @@ if "%config%"=="Debug" set test_args=--mode=debug %test_args% if "%config%"=="Release" set test_args=--mode=release %test_args% echo running 'cctest %cctest_args%' "%config%\cctest" %cctest_args% -echo running 'python tools\test.py %test_args%' -python tools\test.py %test_args% +call :run-python tools\test.py %test_args% goto jslint :jslint @@ -377,6 +375,14 @@ echo vcbuild.bat build-release : builds the release distribution as used by n echo vcbuild.bat enable-vtune : builds nodejs with Intel VTune profiling support to profile JavaScript goto exit +:run-python +call tools\msvs\find_python.cmd +if errorlevel 1 echo Could not find python2 & goto :exit +set cmd1=%VCBUILD_PYTHON_LOCATION% %* +echo %cmd1% +%cmd1% +exit /b %ERRORLEVEL% + :exit goto :EOF @@ -388,8 +394,9 @@ rem *************** set NODE_VERSION= set TAG= set FULLVERSION= - -for /F "usebackq tokens=*" %%i in (`python "%~dp0tools\getnodeversion.py"`) do set NODE_VERSION=%%i +:: Call as subroutine for validation of python +call :run-python tools\getnodeversion.py > nul +for /F "tokens=*" %%i in ('%VCBUILD_PYTHON_LOCATION% tools\getnodeversion.py') do set NODE_VERSION=%%i if not defined NODE_VERSION ( echo Cannot determine current version of Node.js exit /b 1 @@ -398,7 +405,7 @@ if not defined NODE_VERSION ( if not defined DISTTYPE set DISTTYPE=release if "%DISTTYPE%"=="release" ( set FULLVERSION=%NODE_VERSION% - goto exit + exit /b 0 ) if "%DISTTYPE%"=="custom" ( if not defined CUSTOMTAG ( @@ -425,7 +432,4 @@ if not "%DISTTYPE%"=="custom" ( set TAG=%DISTTYPE%%DATESTRING%%COMMIT% ) set FULLVERSION=%NODE_VERSION%-%TAG% - -:exit -if not defined DISTTYPEDIR set DISTTYPEDIR=%DISTTYPE% -goto :EOF +exit /b 0