From 862906b86d4a363c9d52afc00a5c6527bb07d5b8 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 24 Dec 2018 21:38:46 +0100 Subject: [PATCH] makepackage: install for multiple Python versions on Windows See #441 --- makepanda/installer.nsi | 696 ++++++++++++++++++++++----------------- makepanda/makepackage.py | 34 +- 2 files changed, 416 insertions(+), 314 deletions(-) diff --git a/makepanda/installer.nsi b/makepanda/installer.nsi index 8bc608cf6f..9abb029cac 100644 --- a/makepanda/installer.nsi +++ b/makepanda/installer.nsi @@ -14,7 +14,7 @@ ; ; BUILT - location of panda install tree. ; SOURCE - location of the panda source-tree if available, OR location of panda install tree. -; PYVER - version of Python that Panda was built with (ie, "2.7") +; INCLUDE_PYVER - version of Python that Panda was built with (eg. "2.7", "3.5-32") ; REGVIEW - either 32 or 64, depending on the build architecture. ; @@ -46,7 +46,9 @@ SetCompressor ${COMPRESSOR} !insertmacro MUI_PAGE_LICENSE "${SOURCE}/doc/LICENSE" !insertmacro MUI_PAGE_DIRECTORY +!ifdef INCLUDE_PYVER !define MUI_PAGE_CUSTOMFUNCTION_LEAVE ConfirmPythonSelection +!endif !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_INSTFILES @@ -64,8 +66,9 @@ ShowUninstDetails hide LicenseData "${SOURCE}/doc/LICENSE" -InstType "Full (Recommended)" -InstType "Minimal" +InstType "Auto (Recommended)" +InstType "Full" +InstType "Light" LangString DESC_SecCore ${LANG_ENGLISH} "The Panda3D core libraries, configuration files and models/textures that are needed to use Panda3D." LangString DESC_SecOpenGL ${LANG_ENGLISH} "The OpenGL graphics back-end is the most well-supported renderer." @@ -78,8 +81,9 @@ LangString DESC_SecODE ${LANG_ENGLISH} "Support for the Open Dynamics Engine to LangString DESC_SecPhysX ${LANG_ENGLISH} "Support for NVIDIA PhysX to implement physics." LangString DESC_SecRocket ${LANG_ENGLISH} "Support for the libRocket GUI library. This is an optional library that offers an HTML/CSS-like approach to creating user interfaces." LangString DESC_SecTools ${LANG_ENGLISH} "Useful tools and model converters to help with Panda3D development. Recommended." -LangString DESC_SecPyBindings ${LANG_ENGLISH} "Contains the Python modules that allow use of Panda3D using Python. These will only work with a ${REGVIEW}-bit version of Python ${PYVER}." -LangString DESC_SecPython ${LANG_ENGLISH} "Contains a ${REGVIEW}-bit copy of Python ${PYVER} preconfigured to make use of Panda3D." +LangString DESC_SecGroupPython ${LANG_ENGLISH} "Contains modules that provide Python support for Panda3D." +LangString DESC_SecPyShared ${LANG_ENGLISH} "Contains the common Python code used by the Panda3D Python bindings." +LangString DESC_SecPython ${LANG_ENGLISH} "Contains a ${REGVIEW}-bit copy of Python ${INCLUDE_PYVER} preconfigured to make use of Panda3D." LangString DESC_SecHeadersLibs ${LANG_ENGLISH} "Headers and libraries needed for C++ development with Panda3D." LangString DESC_SecSamples ${LANG_ENGLISH} "The sample programs demonstrate how to make Python applications with Panda3D." LangString DESC_SecMaxPlugins ${LANG_ENGLISH} "Plug-ins for Autodesk 3ds Max (${REGVIEW}-bit) that can be used to export models to Panda3D." @@ -112,224 +116,38 @@ var MANPAGE !insertmacro !defineifexist HAVE_ODE "${BUILT}\bin\libpandaode.dll" !insertmacro !defineifexist HAVE_PHYSX "${BUILT}\bin\libpandaphysx.dll" !insertmacro !defineifexist HAVE_ROCKET "${BUILT}\bin\libp3rocket.dll" -!insertmacro !defineifexist HAVE_PYTHON "${BUILT}\python" !insertmacro !defineifexist HAVE_SAMPLES "${SOURCE}\samples" !insertmacro !defineifexist HAVE_MAX_PLUGINS "${BUILT}\plugins\*.dlo" !insertmacro !defineifexist HAVE_MAYA_PLUGINS "${BUILT}\plugins\*.mll" -Function runFunction - ExecShell "open" "$SMPROGRAMS\${TITLE}\Panda3D Manual.lnk" -FunctionEnd +!macro RemovePythonPath PYVER + ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\PythonPath\Panda3D" "" + StrCmp $0 "$INSTDIR" 0 +2 + DeleteRegKey HKCU "Software\Python\PythonCore\${PYVER}\PythonPath\Panda3D" +!macroend -Function .onInit - ${If} ${REGVIEW} = 64 - ${AndIfNot} ${RunningX64} - MessageBox MB_OK|MB_ICONEXCLAMATION "You are attempting to install the 64-bit version of Panda3D on a 32-bit version of Windows. Please download and install the 32-bit version of Panda3D instead." - Abort - ${EndIf} -FunctionEnd +!macro PyBindingSection PYVER EXT_SUFFIX + LangString DESC_SecPyBindings${PYVER} ${LANG_ENGLISH} "Contains the Python modules that allow use of Panda3D using a ${REGVIEW}-bit version of Python ${PYVER}." -SectionGroup "Panda3D Libraries" - Section "Core Libraries" SecCore - SectionIn 1 2 RO - - SetShellVarContext current - SetOverwrite try + !insertmacro !defineifexist _present "${BUILT}\panda3d\core${EXT_SUFFIX}" + !ifdef _present + Section "${PYVER} bindings" SecPyBindings${PYVER} + !if "${PYVER}" == "${INCLUDE_PYVER}" + SectionIn 1 2 3 + !else + !if "${PYVER}" == "2.7" + SectionIn 1 2 + !else + ; See .onInit function where this is dynamically enabled. + SectionIn 2 + !endif + !endif SetDetailsPrint both - DetailPrint "Installing Panda3D libraries..." + DetailPrint "Installing Panda3D bindings for Python ${PYVER}..." SetDetailsPrint listonly - SetOutPath "$INSTDIR" - File /nonfatal "${BUILT}\LICENSE" - File /nonfatal "${BUILT}\ReleaseNotes" - File /nonfatal "${BUILT}\pandaIcon.ico" - - SetOutPath $INSTDIR\etc - File /r "${BUILT}\etc\*" - - SetOutPath $INSTDIR\bin - File /r /x api-ms-win-*.dll /x ucrtbase.dll /x libpandagl.dll /x libpandadx9.dll /x cgD3D*.dll /x python*.dll /x libpandaode.dll /x libp3fmod_audio.dll /x fmodex*.dll /x libp3ffmpeg.dll /x av*.dll /x postproc*.dll /x swscale*.dll /x swresample*.dll /x NxCharacter*.dll /x cudart*.dll /x PhysX*.dll /x libpandaphysx.dll /x libp3rocket.dll /x boost_python*.dll /x Rocket*.dll /x _rocket*.pyd /x libpandabullet.dll /x OpenAL32.dll /x *_oal.dll /x libp3openal_audio.dll "${BUILT}\bin\*.dll" - File /nonfatal /r "${BUILT}\bin\Microsoft.*.manifest" - - ; Before Windows 10, we need these stubs for the UCRT as well. - ReadRegDWORD $0 HKLM "Software\Microsoft\Windows NT\CurrentVersion" "CurrentMajorVersionNumber" - ${If} $0 < 10 - ClearErrors - File /nonfatal /r "${BUILT}\bin\api-ms-win-*.dll" - File /nonfatal "${BUILT}\bin\ucrtbase.dll" - ${Endif} - - SetDetailsPrint both - DetailPrint "Installing models..." - SetDetailsPrint listonly - - SetOutPath $INSTDIR\models - File /r /x CVS "${BUILT}\models\*" - - SetDetailsPrint both - DetailPrint "Installing optional components..." - SetDetailsPrint listonly - - RMDir /r "$SMPROGRAMS\${TITLE}" - CreateDirectory "$SMPROGRAMS\${TITLE}" - SectionEnd - - !ifdef HAVE_GL - Section "OpenGL" SecOpenGL - SectionIn 1 2 RO - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libpandagl.dll" - SectionEnd - !endif - - !ifdef HAVE_DX9 - Section "Direct3D 9" SecDirect3D9 - SectionIn 1 - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libpandadx9.dll" - File /nonfatal /r "${BUILT}\bin\cgD3D9.dll" - SectionEnd - !endif - - !ifdef HAVE_OPENAL - Section "OpenAL Audio" SecOpenAL - SectionIn 1 2 - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libp3openal_audio.dll" - File /nonfatal /r "${BUILT}\bin\OpenAL32.dll" - File /nonfatal /r "${BUILT}\bin\*_oal.dll" - SectionEnd - !endif - - !ifdef HAVE_FMOD - Section "FMOD Audio" SecFMOD - SectionIn 1 - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libp3fmod_audio.dll" - File /r "${BUILT}\bin\fmodex*.dll" - SectionEnd - !endif - - !ifdef HAVE_FFMPEG - Section "FFMpeg" SecFFMpeg - SectionIn 1 - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libp3ffmpeg.dll" - File /nonfatal /r "${BUILT}\bin\av*.dll" - File /nonfatal /r "${BUILT}\bin\swscale*.dll" - File /nonfatal /r "${BUILT}\bin\swresample*.dll" - File /nonfatal /r "${BUILT}\bin\postproc*.dll" - SectionEnd - !endif - - !ifdef HAVE_BULLET - Section "Bullet Physics" SecBullet - SectionIn 1 - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libpandabullet.dll" - SectionEnd - !endif - - !ifdef HAVE_ODE - Section "ODE Physics" SecODE - SectionIn 1 - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libpandaode.dll" - SectionEnd - !endif - - !ifdef HAVE_PHYSX - Section "NVIDIA PhysX" SecPhysX - SectionIn 1 - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libpandaphysx.dll" - File /nonfatal /r "${BUILT}\bin\PhysX*.dll" - File /nonfatal /r "${BUILT}\bin\NxCharacter*.dll" - File /nonfatal /r "${BUILT}\bin\cudart*.dll" - SectionEnd - !endif - - !ifdef HAVE_ROCKET - Section "libRocket GUI" SecRocket - SectionIn 1 - - SetOutPath "$INSTDIR\bin" - File "${BUILT}\bin\libp3rocket.dll" - File /nonfatal /r "${BUILT}\bin\Rocket*.dll" - File /nonfatal /r "${BUILT}\bin\_rocket*.pyd" - File /nonfatal /r "${BUILT}\bin\boost_python*.dll" - SectionEnd - !endif -SectionGroupEnd - -Section "Tools and utilities" SecTools - SectionIn 1 2 - - SetDetailsPrint both - DetailPrint "Installing utilities..." - SetDetailsPrint listonly - - SetOutPath "$INSTDIR\bin" - File /r "${BUILT}\bin\*.exe" - File /nonfatal /r "${BUILT}\bin\*.p3d" - SetOutPath "$INSTDIR\NSIS" - File /r /x CVS "${NSISDIR}\*" - - WriteRegStr HKCU "Software\Classes\Panda3D.Model" "" "Panda3D model/animation" - WriteRegStr HKCU "Software\Classes\Panda3D.Model\DefaultIcon" "" "$INSTDIR\bin\pview.exe" - WriteRegStr HKCU "Software\Classes\Panda3D.Model\shell" "" "open" - WriteRegStr HKCU "Software\Classes\Panda3D.Model\shell\open\command" "" '"$INSTDIR\bin\pview.exe" -l "%1"' - WriteRegStr HKCU "Software\Classes\Panda3D.Model\shell\compress" "" "Compress to .pz" - WriteRegStr HKCU "Software\Classes\Panda3D.Model\shell\compress\command" "" '"$INSTDIR\bin\pzip.exe" "%1"' - - WriteRegStr HKCU "Software\Classes\Panda3D.Compressed" "" "Compressed file" - WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\DefaultIcon" "" "$INSTDIR\bin\pzip.exe" - WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\shell" "" "open" - WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\shell\open\command" "" '"$INSTDIR\bin\pview.exe" -l "%1"' - WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\shell\decompress" "" "Decompress" - WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\shell\decompress\command" "" '"$INSTDIR\bin\punzip.exe" "%1"' - - WriteRegStr HKCU "Software\Classes\Panda3D.Multifile" "" "Panda3D Multifile" - WriteRegStr HKCU "Software\Classes\Panda3D.Multifile\DefaultIcon" "" "$INSTDIR\bin\multify.exe" - WriteRegStr HKCU "Software\Classes\Panda3D.Multifile\shell" "" "open" - WriteRegStr HKCU "Software\Classes\Panda3D.Multifile\shell\extract" "" "Extract here" - WriteRegStr HKCU "Software\Classes\Panda3D.Multifile\shell\extract\command" "" '"$INSTDIR\bin\multify.exe" -xf "%1"' -SectionEnd - -SectionGroup "Python support" - Section "Python bindings" SecPyBindings - SectionIn 1 2 - - SetDetailsPrint both - DetailPrint "Installing Panda3D Python modules..." - SetDetailsPrint listonly - - SetOutPath "$INSTDIR\bin" - File /nonfatal /r "${BUILT}\bin\*.pyd" - - SetOutPath $INSTDIR\direct\directscripts - File /r /x CVS /x Opt?-Win32 "${BUILT}\direct\directscripts\*" - SetOutPath $INSTDIR\direct\filter - File /r /x CVS /x Opt?-Win32 "${BUILT}\direct\filter\*.sha" - SetOutPath $INSTDIR\direct - File /r /x CVS /x Opt?-Win32 "${BUILT}\direct\*.py" - - Delete "$INSTDIR\panda3d.py" - Delete "$INSTDIR\panda3d.pyc" - Delete "$INSTDIR\panda3d.pyo" - SetOutPath $INSTDIR\pandac - File /r "${BUILT}\pandac\*.py" SetOutPath $INSTDIR\panda3d - File /r "${BUILT}\panda3d\*.py" File /nonfatal /r "${BUILT}\panda3d\core${EXT_SUFFIX}" File /nonfatal /r "${BUILT}\panda3d\ai${EXT_SUFFIX}" @@ -384,87 +202,344 @@ SectionGroup "Python support" SetRegView ${REGVIEW} !endif - ; Check for a non-Panda3D system-wide Python installation. - ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp $0 "$INSTDIR\python" UserExternalPthCheck 0 - StrCmp $0 "" UserExternalPthCheck 0 - IfFileExists "$0\ppython.exe" UserExternalPthCheck 0 - IfFileExists "$0\python.exe" AskExternalPth UserExternalPthCheck - - ; Check for a non-Panda3D user installation of Python. - UserExternalPthCheck: - ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp $0 "$INSTDIR\python" SkipExternalPth 0 - StrCmp $0 "" SkipExternalPth 0 - IfFileExists "$0\ppython.exe" SkipExternalPth 0 - IfFileExists "$0\python.exe" AskExternalPth SkipExternalPth - - ; We're pretty sure this Python build is of the right architecture. - AskExternalPth: - MessageBox MB_YESNO|MB_ICONQUESTION \ - "Your system already has a copy of Python ${PYVER} installed in:$\r$\n$0$\r$\nWould you like to configure it to be able to use the Panda3D libraries?$\r$\nIf you choose no, you will only be able to use Panda3D's own copy of Python." \ - IDYES WriteExternalPth IDNO SkipExternalPth - - WriteExternalPth: - ;FileOpen $1 "$0\Lib\site-packages\panda.pth" w - ;FileWrite $1 "$INSTDIR$\r$\n" - ;FileWrite $1 "$INSTDIR\bin$\r$\n" - ;FileClose $1 - - ; Actually, it looks like we can just do this instead: + ; Install a Panda3D path into the global PythonPath for this version + ; of Python. WriteRegStr HKCU "Software\Python\PythonCore\${PYVER}\PythonPath\Panda3D" "" "$INSTDIR" + SectionEnd + !undef _present + !endif +!macroend - SkipExternalPth: +Function runFunction + ExecShell "open" "$SMPROGRAMS\${TITLE}\Panda3D Manual.lnk" +FunctionEnd + +SectionGroup "Panda3D Libraries" + Section "Core Libraries" SecCore + SectionIn 1 2 3 RO + + SetShellVarContext current + SetOverwrite try + + SetDetailsPrint both + DetailPrint "Installing Panda3D libraries..." + SetDetailsPrint listonly + + SetOutPath "$INSTDIR" + File /nonfatal "${BUILT}\LICENSE" + File /nonfatal "${BUILT}\ReleaseNotes" + File /nonfatal "${BUILT}\pandaIcon.ico" + + SetOutPath $INSTDIR\etc + File /r "${BUILT}\etc\*" + + SetOutPath $INSTDIR\bin + File /r /x api-ms-win-*.dll /x ucrtbase.dll /x libpandagl.dll /x libpandadx9.dll /x cgD3D*.dll /x python*.dll /x libpandaode.dll /x libp3fmod_audio.dll /x fmodex*.dll /x libp3ffmpeg.dll /x av*.dll /x postproc*.dll /x swscale*.dll /x swresample*.dll /x NxCharacter*.dll /x cudart*.dll /x PhysX*.dll /x libpandaphysx.dll /x libp3rocket.dll /x boost_python*.dll /x Rocket*.dll /x _rocket*.pyd /x libpandabullet.dll /x OpenAL32.dll /x *_oal.dll /x libp3openal_audio.dll "${BUILT}\bin\*.dll" + File /nonfatal /r "${BUILT}\bin\Microsoft.*.manifest" + + ; Before Windows 10, we need these stubs for the UCRT as well. + ReadRegDWORD $0 HKLM "Software\Microsoft\Windows NT\CurrentVersion" "CurrentMajorVersionNumber" + ${If} $0 < 10 + ClearErrors + File /nonfatal /r "${BUILT}\bin\api-ms-win-*.dll" + File /nonfatal "${BUILT}\bin\ucrtbase.dll" + ${Endif} + + SetDetailsPrint both + DetailPrint "Installing models..." + SetDetailsPrint listonly + + SetOutPath $INSTDIR\models + File /r /x CVS "${BUILT}\models\*" + + SetDetailsPrint both + DetailPrint "Installing optional components..." + SetDetailsPrint listonly + + RMDir /r "$SMPROGRAMS\${TITLE}" + CreateDirectory "$SMPROGRAMS\${TITLE}" SectionEnd - !ifdef HAVE_PYTHON - Section "Python ${PYVER}" SecPython - SectionIn 1 2 - - !ifdef REGVIEW - SetRegView ${REGVIEW} - !endif - - SetDetailsPrint both - DetailPrint "Installing Python ${PYVER} (${REGVIEW}-bit)..." - SetDetailsPrint listonly + !ifdef HAVE_GL + Section "OpenGL" SecOpenGL + SectionIn 1 2 3 RO SetOutPath "$INSTDIR\bin" - File /nonfatal "${BUILT}\bin\python*.dll" + File "${BUILT}\bin\libpandagl.dll" + SectionEnd + !endif - SetOutPath "$INSTDIR\python" - File /r /x *.pdb "${BUILT}\python\*" + !ifdef HAVE_DX9 + Section "Direct3D 9" SecDirect3D9 + SectionIn 1 2 - SetDetailsPrint both - DetailPrint "Adding registry keys for Python..." - SetDetailsPrint listonly + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libpandadx9.dll" + File /nonfatal /r "${BUILT}\bin\cgD3D9.dll" + SectionEnd + !endif - ; Check if a copy of Python is installed for this user. - ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp "$0" "$INSTDIR\python" RegPath 0 - StrCmp "$0" "" SkipFileCheck 0 - IfFileExists "$0\python.exe" AskRegPath 0 - SkipFileCheck: + !ifdef HAVE_OPENAL + Section "OpenAL Audio" SecOpenAL + SectionIn 1 2 3 - ; Check if a system-wide copy of Python is installed. - ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp "$0" "$INSTDIR\python" RegPath 0 - StrCmp "$0" "" RegPath 0 - IfFileExists "$0\python.exe" AskRegPath RegPath + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libp3openal_audio.dll" + File /nonfatal /r "${BUILT}\bin\OpenAL32.dll" + File /nonfatal /r "${BUILT}\bin\*_oal.dll" + SectionEnd + !endif - AskRegPath: - MessageBox MB_YESNO|MB_ICONQUESTION \ - "You already have a copy of Python ${PYVER} installed in:$\r$\n$0$\r$\n$\r$\nPanda3D installs its own copy of Python ${PYVER}, which will install alongside your existing copy. Would you like to make Panda's copy the default Python for your user account?" \ - IDNO SkipRegPath + !ifdef HAVE_FMOD + Section "FMOD Audio" SecFMOD + SectionIn 1 2 - RegPath: - WriteRegStr HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" "" "$INSTDIR\python" - SkipRegPath: + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libp3fmod_audio.dll" + File /r "${BUILT}\bin\fmodex*.dll" + SectionEnd + !endif + !ifdef HAVE_FFMPEG + Section "FFMpeg" SecFFMpeg + SectionIn 1 2 + + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libp3ffmpeg.dll" + File /nonfatal /r "${BUILT}\bin\av*.dll" + File /nonfatal /r "${BUILT}\bin\swscale*.dll" + File /nonfatal /r "${BUILT}\bin\swresample*.dll" + File /nonfatal /r "${BUILT}\bin\postproc*.dll" + SectionEnd + !endif + + !ifdef HAVE_BULLET + Section "Bullet Physics" SecBullet + SectionIn 1 2 + + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libpandabullet.dll" + SectionEnd + !endif + + !ifdef HAVE_ODE + Section "ODE Physics" SecODE + SectionIn 1 2 + + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libpandaode.dll" + SectionEnd + !endif + + !ifdef HAVE_PHYSX + Section "NVIDIA PhysX" SecPhysX + ; Only enable in "Full" + SectionIn 2 + + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libpandaphysx.dll" + File /nonfatal /r "${BUILT}\bin\PhysX*.dll" + File /nonfatal /r "${BUILT}\bin\NxCharacter*.dll" + File /nonfatal /r "${BUILT}\bin\cudart*.dll" + SectionEnd + !endif + + !ifdef HAVE_ROCKET + Section "libRocket GUI" SecRocket + SectionIn 1 2 + + SetOutPath "$INSTDIR\bin" + File "${BUILT}\bin\libp3rocket.dll" + File /nonfatal /r "${BUILT}\bin\Rocket*.dll" + File /nonfatal /r "${BUILT}\bin\_rocket*.pyd" + File /nonfatal /r "${BUILT}\bin\boost_python*.dll" SectionEnd !endif SectionGroupEnd +Section "Tools and utilities" SecTools + SectionIn 1 2 3 + + SetDetailsPrint both + DetailPrint "Installing utilities..." + SetDetailsPrint listonly + + SetOutPath "$INSTDIR\bin" + File /r "${BUILT}\bin\*.exe" + File /nonfatal /r "${BUILT}\bin\*.p3d" + SetOutPath "$INSTDIR\NSIS" + File /r /x CVS "${NSISDIR}\*" + + WriteRegStr HKCU "Software\Classes\Panda3D.Model" "" "Panda3D model/animation" + WriteRegStr HKCU "Software\Classes\Panda3D.Model\DefaultIcon" "" "$INSTDIR\bin\pview.exe" + WriteRegStr HKCU "Software\Classes\Panda3D.Model\shell" "" "open" + WriteRegStr HKCU "Software\Classes\Panda3D.Model\shell\open\command" "" '"$INSTDIR\bin\pview.exe" -l "%1"' + WriteRegStr HKCU "Software\Classes\Panda3D.Model\shell\compress" "" "Compress to .pz" + WriteRegStr HKCU "Software\Classes\Panda3D.Model\shell\compress\command" "" '"$INSTDIR\bin\pzip.exe" "%1"' + + WriteRegStr HKCU "Software\Classes\Panda3D.Compressed" "" "Compressed file" + WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\DefaultIcon" "" "$INSTDIR\bin\pzip.exe" + WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\shell" "" "open" + WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\shell\open\command" "" '"$INSTDIR\bin\pview.exe" -l "%1"' + WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\shell\decompress" "" "Decompress" + WriteRegStr HKCU "Software\Classes\Panda3D.Compressed\shell\decompress\command" "" '"$INSTDIR\bin\punzip.exe" "%1"' + + WriteRegStr HKCU "Software\Classes\Panda3D.Multifile" "" "Panda3D Multifile" + WriteRegStr HKCU "Software\Classes\Panda3D.Multifile\DefaultIcon" "" "$INSTDIR\bin\multify.exe" + WriteRegStr HKCU "Software\Classes\Panda3D.Multifile\shell" "" "open" + WriteRegStr HKCU "Software\Classes\Panda3D.Multifile\shell\extract" "" "Extract here" + WriteRegStr HKCU "Software\Classes\Panda3D.Multifile\shell\extract\command" "" '"$INSTDIR\bin\multify.exe" -xf "%1"' +SectionEnd + +SectionGroup "Python modules" SecGroupPython + Section "Shared code" SecPyShared + SectionIn 1 2 3 + + SetDetailsPrint both + DetailPrint "Installing Panda3D shared Python modules..." + SetDetailsPrint listonly + + SetOutPath $INSTDIR\direct\directscripts + File /r /x CVS /x Opt?-Win32 "${BUILT}\direct\directscripts\*" + SetOutPath $INSTDIR\direct\filter + File /r /x CVS /x Opt?-Win32 "${BUILT}\direct\filter\*.sha" + SetOutPath $INSTDIR\direct + File /r /x CVS /x Opt?-Win32 "${BUILT}\direct\*.py" + + Delete "$INSTDIR\panda3d.py" + Delete "$INSTDIR\panda3d.pyc" + Delete "$INSTDIR\panda3d.pyo" + SetOutPath $INSTDIR\pandac + File /r "${BUILT}\pandac\*.py" + SetOutPath $INSTDIR\panda3d + File /r "${BUILT}\panda3d\*.py" + SectionEnd + + !insertmacro PyBindingSection 2.7 .pyd + !if "${REGVIEW}" == "32" + !insertmacro PyBindingSection 3.5-32 .cp35-win32.pyd + !insertmacro PyBindingSection 3.6-32 .cp36-win32.pyd + !insertmacro PyBindingSection 3.7-32 .cp37-win32.pyd + !insertmacro PyBindingSection 3.8-32 .cp38-win32.pyd + !insertmacro PyBindingSection 3.9-32 .cp39-win32.pyd + !else + !insertmacro PyBindingSection 3.5 .cp35-win_amd64.pyd + !insertmacro PyBindingSection 3.6 .cp36-win_amd64.pyd + !insertmacro PyBindingSection 3.7 .cp37-win_amd64.pyd + !insertmacro PyBindingSection 3.8 .cp38-win_amd64.pyd + !insertmacro PyBindingSection 3.9 .cp39-win_amd64.pyd + !endif +SectionGroupEnd + +!ifdef INCLUDE_PYVER +Section "Python ${INCLUDE_PYVER}" SecPython + SectionIn 1 2 3 + + !ifdef REGVIEW + SetRegView ${REGVIEW} + !endif + + SetDetailsPrint both + DetailPrint "Installing Python ${INCLUDE_PYVER} interpreter (${REGVIEW}-bit)..." + SetDetailsPrint listonly + + SetOutPath "$INSTDIR\bin" + File /nonfatal "${BUILT}\bin\python*.dll" + + SetOutPath "$INSTDIR\python" + File /r /x *.pdb "${BUILT}\python\*" + + SetDetailsPrint both + DetailPrint "Adding registry keys for Python..." + SetDetailsPrint listonly + + ; Check if a copy of Python is installed for this user. + ReadRegStr $0 HKCU "Software\Python\PythonCore\${INCLUDE_PYVER}\InstallPath" "" + StrCmp "$0" "$INSTDIR\python" RegPath 0 + StrCmp "$0" "" SkipFileCheck 0 + IfFileExists "$0\python.exe" AskRegPath 0 + SkipFileCheck: + + ; Check if a system-wide copy of Python is installed. + ReadRegStr $0 HKLM "Software\Python\PythonCore\${INCLUDE_PYVER}\InstallPath" "" + StrCmp "$0" "$INSTDIR\python" RegPath 0 + StrCmp "$0" "" RegPath 0 + IfFileExists "$0\python.exe" AskRegPath RegPath + + AskRegPath: + MessageBox MB_YESNO|MB_ICONQUESTION \ + "You already have a copy of Python ${INCLUDE_PYVER} installed in:$\r$\n$0$\r$\n$\r$\nPanda3D installs its own copy of Python ${INCLUDE_PYVER}, which will install alongside your existing copy. Would you like to make Panda's copy the default Python for your user account?" \ + IDNO SkipRegPath + + RegPath: + WriteRegStr HKCU "Software\Python\PythonCore\${INCLUDE_PYVER}\InstallPath" "" "$INSTDIR\python" + WriteRegStr HKCU "Software\Python\PythonCore\${INCLUDE_PYVER}\InstallPath" "ExecutablePath" "$INSTDIR\python\python.exe" + SkipRegPath: + +SectionEnd +!endif + +!macro MaybeEnablePyBindingSection PYVER + !if "${INCLUDE_PYVER}" != "${PYVER}" + !ifdef SecPyBindings${PYVER} + ; Check if a copy of Python is installed for this user. + Push $0 + ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" "" + StrCmp "$0" "" +2 0 + IfFileExists "$0\python.exe" Py${PYVER}Exists 0 + + ; Check if a system-wide copy of Python is installed. + ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" + StrCmp "$0" "" Py${PYVER}ExistsNot 0 + IfFileExists "$0\python.exe" Py${PYVER}Exists Py${PYVER}ExistsNot + + Py${PYVER}Exists: + SectionSetFlags ${SecPyBindings${PYVER}} ${SF_SELECTED} + SectionSetInstTypes ${SecPyBindings${PYVER}} 3 + + Py${PYVER}ExistsNot: + Pop $0 + !endif + !endif +!macroend + +Function .onInit + ${If} ${REGVIEW} = 64 + ${AndIfNot} ${RunningX64} + MessageBox MB_OK|MB_ICONEXCLAMATION "You are attempting to install the 64-bit version of Panda3D on a 32-bit version of Windows. Please download and install the 32-bit version of Panda3D instead." + Abort + ${EndIf} + + !ifdef REGVIEW + SetRegView ${REGVIEW} + !endif + + ; We never check for 2.7; it is always enabled in Auto mode + !if "${REGVIEW}" == "32" + !insertmacro MaybeEnablePyBindingSection 3.5-32 + !insertmacro MaybeEnablePyBindingSection 3.6-32 + !insertmacro MaybeEnablePyBindingSection 3.7-32 + !insertmacro MaybeEnablePyBindingSection 3.8-32 + !insertmacro MaybeEnablePyBindingSection 3.9-32 + !else + !insertmacro MaybeEnablePyBindingSection 3.5 + !insertmacro MaybeEnablePyBindingSection 3.6 + !insertmacro MaybeEnablePyBindingSection 3.7 + !insertmacro MaybeEnablePyBindingSection 3.8 + !insertmacro MaybeEnablePyBindingSection 3.9 + !endif +FunctionEnd + +Function .onSelChange + ; If someone selects any Python version, the "shared modules" must be on. + ${If} ${SectionIsPartiallySelected} ${SecGroupPython} + SectionGetFlags ${SecPyShared} $R0 + IntOp $R0 $R0 | ${SF_SELECTED} + SectionSetFlags ${SecPyShared} $R0 + ${EndIf} +FunctionEnd + +!ifdef INCLUDE_PYVER Function ConfirmPythonSelection ; Check the current state of the "Python" section selection. SectionGetFlags ${SecPython} $R0 @@ -474,16 +549,14 @@ Function ConfirmPythonSelection StrCmp $R1 ${SF_SELECTED} SkipCheck 0 ; Maybe the user just doesn't want Python support at all? - SectionGetFlags ${SecPyBindings} $R1 - IntOp $R1 $R1 & ${SF_SELECTED} - StrCmp $R1 ${SF_SELECTED} 0 SkipCheck + !insertmacro SectionFlagIsSet ${SecGroupPython} ${SF_PSELECTED} 0 SkipCheck !ifdef REGVIEW SetRegView ${REGVIEW} !endif ; Check for a user installation of Python. - ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" "" + ReadRegStr $0 HKCU "Software\Python\PythonCore\${INCLUDE_PYVER}\InstallPath" "" StrCmp $0 "$INSTDIR\python" CheckSystemWidePython 0 StrCmp $0 "" CheckSystemWidePython 0 IfFileExists "$0\ppython.exe" CheckSystemWidePython 0 @@ -491,7 +564,7 @@ Function ConfirmPythonSelection ; Check for a system-wide Python installation. CheckSystemWidePython: - ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" + ReadRegStr $0 HKLM "Software\Python\PythonCore\${INCLUDE_PYVER}\InstallPath" "" StrCmp $0 "$INSTDIR\python" AskConfirmation 0 StrCmp $0 "" AskConfirmation 0 IfFileExists "$0\ppython.exe" AskConfirmation 0 @@ -501,7 +574,7 @@ Function ConfirmPythonSelection ; of a different Panda3D build.) Ask the user if he's sure about this. AskConfirmation: MessageBox MB_YESNO|MB_ICONQUESTION \ - "You do not appear to have a ${REGVIEW}-bit version of Python ${PYVER} installed. Are you sure you don't want Panda to install a compatible copy of Python?$\r$\n$\r$\nIf you choose Yes, you will not be able to do Python development with Panda3D until you install a ${REGVIEW}-bit version of Python ${PYVER} and manually configure it to be able to use Panda3D." \ + "You do not appear to have a ${REGVIEW}-bit version of Python ${INCLUDE_PYVER} installed. Are you sure you don't want Panda to install a compatible copy of Python?$\r$\n$\r$\nIf you choose Yes, you will not be able to do Python development with Panda3D until you install a ${REGVIEW}-bit version of Python and install the bindings for this version." \ IDYES SkipCheck ; User clicked no, so re-enable the select box and abort. @@ -511,9 +584,10 @@ Function ConfirmPythonSelection SkipCheck: FunctionEnd +!endif Section "C++ support" SecHeadersLibs - SectionIn 1 + SectionIn 1 2 SetDetailsPrint both DetailPrint "Installing header files..." @@ -532,7 +606,7 @@ SectionEnd !ifdef HAVE_SAMPLES Section "Sample programs" SecSamples - SectionIn 1 + SectionIn 1 2 ; Necessary for proper start menu shortcut installation SetShellVarContext current @@ -599,7 +673,7 @@ SectionEnd !ifdef HAVE_MAX_PLUGINS Section "3ds Max plug-ins" SecMaxPlugins - SectionIn 1 3 + SectionIn 1 2 SetDetailsPrint both DetailPrint "Installing Autodesk 3ds Max plug-ins..." @@ -614,7 +688,7 @@ SectionEnd !ifdef HAVE_MAYA_PLUGINS Section "Maya plug-ins" SecMayaPlugins - SectionIn 1 3 + SectionIn 1 2 SetDetailsPrint both DetailPrint "Installing Autodesk Maya plug-ins..." @@ -737,17 +811,30 @@ Section Uninstall DeleteRegKey HKCU "Software\Classes\Panda3D.Multifile\DefaultIcon" DeleteRegKey HKCU "Software\Classes\Panda3D.Multifile\shell" - ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp $0 "$INSTDIR\python" 0 +2 - DeleteRegKey HKLM "Software\Python\PythonCore\${PYVER}" + !ifdef INCLUDE_PYVER + ReadRegStr $0 HKLM "Software\Python\PythonCore\${INCLUDE_PYVER}\InstallPath" "" + StrCmp $0 "$INSTDIR\python" 0 +2 + DeleteRegKey HKLM "Software\Python\PythonCore\${INCLUDE_PYVER}" - ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp $0 "$INSTDIR\python" 0 +2 - DeleteRegKey HKCU "Software\Python\PythonCore\${PYVER}" + ReadRegStr $0 HKCU "Software\Python\PythonCore\${INCLUDE_PYVER}\InstallPath" "" + StrCmp $0 "$INSTDIR\python" 0 +2 + DeleteRegKey HKCU "Software\Python\PythonCore\${INCLUDE_PYVER}" + !endif - ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\PythonPath\Panda3D" "" - StrCmp $0 "$INSTDIR" 0 +2 - DeleteRegKey HKCU "Software\Python\PythonCore\${PYVER}\PythonPath\Panda3D" + !insertmacro RemovePythonPath 2.7 + !if "${REGVIEW}" == "32" + !insertmacro RemovePythonPath 3.5-32 + !insertmacro RemovePythonPath 3.6-32 + !insertmacro RemovePythonPath 3.7-32 + !insertmacro RemovePythonPath 3.8-32 + !insertmacro RemovePythonPath 3.9-32 + !else + !insertmacro RemovePythonPath 3.5 + !insertmacro RemovePythonPath 3.6 + !insertmacro RemovePythonPath 3.7 + !insertmacro RemovePythonPath 3.8 + !insertmacro RemovePythonPath 3.9 + !endif SetDetailsPrint both DetailPrint "Deleting files..." @@ -812,8 +899,23 @@ SectionEnd !insertmacro MUI_DESCRIPTION_TEXT ${SecRocket} $(DESC_SecRocket) !endif !insertmacro MUI_DESCRIPTION_TEXT ${SecTools} $(DESC_SecTools) - !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings} $(DESC_SecPyBindings) - !ifdef HAVE_PYTHON + !insertmacro MUI_DESCRIPTION_TEXT ${SecGroupPython} $(DESC_SecGroupPython) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyShared} $(DESC_SecPyShared) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings2.7} $(DESC_SecPyBindings2.7) + !if "${REGVIEW}" == "32" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.5-32} $(DESC_SecPyBindings3.5-32) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.6-32} $(DESC_SecPyBindings3.6-32) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.7-32} $(DESC_SecPyBindings3.7-32) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.8-32} $(DESC_SecPyBindings3.8-32) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.9-32} $(DESC_SecPyBindings3.9-32) + !else + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.5} $(DESC_SecPyBindings3.5) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.6} $(DESC_SecPyBindings3.6) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.7} $(DESC_SecPyBindings3.7) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.8} $(DESC_SecPyBindings3.8) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.9} $(DESC_SecPyBindings3.9) + !endif + !ifdef INCLUDE_PYVER !insertmacro MUI_DESCRIPTION_TEXT ${SecPython} $(DESC_SecPython) !endif !insertmacro MUI_DESCRIPTION_TEXT ${SecHeadersLibs} $(DESC_SecHeadersLibs) diff --git a/makepanda/makepackage.py b/makepanda/makepackage.py index ce7282626e..e23bedffd7 100755 --- a/makepanda/makepackage.py +++ b/makepanda/makepackage.py @@ -168,17 +168,10 @@ def MakeInstallerNSIS(version, file, title, installdir, runtime=False, compresso elif os.path.isdir(file): shutil.rmtree(file) - if "PYTHONVERSION" in SDK: - pyver = SDK["PYTHONVERSION"][6:9] - else: - pyver = "%d.%d" % (sys.version_info[:2]) - if GetTargetArch() == 'x64': regview = '64' else: regview = '32' - if int(pyver[0]) == 3 and int(pyver[2]) >= 5: - pyver += '-32' if runtime: # Invoke the make_installer script. @@ -211,11 +204,22 @@ def MakeInstallerNSIS(version, file, title, installdir, runtime=False, compresso 'OUTFILE' : '..\\' + file, 'BUILT' : '..\\' + outputdir, 'SOURCE' : '..', - 'PYVER' : pyver, 'REGVIEW' : regview, - 'EXT_SUFFIX': GetExtensionSuffix(), } + # Are we shipping a version of Python? + if os.path.isfile(os.path.join(outputdir, "python", "python.exe")): + py_dlls = glob.glob(os.path.join(outputdir, "python", "python[0-9][0-9].dll")) \ + + glob.glob(os.path.join(outputdir, "python", "python[0-9][0-9]_d.dll")) + assert py_dlls + py_dll = os.path.basename(py_dlls[0]) + pyver = py_dll[6] + "." + py_dll[7] + + if GetTargetArch() != 'x64': + pyver += '-32' + + nsis_defs['INCLUDE_PYVER'] = pyver + if GetHost() == 'windows': cmd = os.path.join(GetThirdpartyBase(), 'win-nsis', 'makensis') + ' /V2' for item in nsis_defs.items(): @@ -651,7 +655,7 @@ def MakeInstallerOSX(version, runtime=False, python_versions=[], **kwargs): dist.write(' \n') if python_versions: dist.write(' \n') - for version_info in python_versions: + for version_info in sorted(python_versions, key=lambda info:info["version"], reverse=True): dist.write(' \n' % (version_info["version"])) dist.write(' \n') dist.write(' \n') @@ -978,13 +982,9 @@ def MakeInstaller(version, **kwargs): fn += version - if "PYTHONVERSION" in SDK: - pyver = SDK["PYTHONVERSION"][6:9] - else: - pyver = "%d.%d" % (sys.version_info[:2]) - - if not runtime and pyver != "2.7": - fn += '-py' + pyver + python_versions = kwargs.get('python_versions', []) + if not runtime and len(python_versions) == 1 and python_versions[0]["version"] != "2.7": + fn += '-py' + python_versions[0]["version"] if GetOptimize() <= 2: fn += "-dbg"