diff options
-rw-r--r-- | Doc/using/win_installer.png | bin | 46563 -> 48953 bytes | |||
-rw-r--r-- | Doc/using/windows.rst | 12 | ||||
-rw-r--r-- | Tools/msi/build.bat | 14 | ||||
-rw-r--r-- | Tools/msi/bundle/Default.thm | 10 | ||||
-rw-r--r-- | Tools/msi/bundle/Default.wxl | 8 | ||||
-rw-r--r-- | Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp | 102 | ||||
-rw-r--r-- | Tools/msi/bundle/bundle.targets | 2 | ||||
-rw-r--r-- | Tools/msi/bundle/bundle.wxs | 10 | ||||
-rw-r--r-- | Tools/msi/bundle/packagegroups/launcher.wxs | 4 | ||||
-rw-r--r-- | Tools/msi/common.wxs | 2 | ||||
-rw-r--r-- | Tools/msi/launcher/launcher_files.wxs | 8 | ||||
-rw-r--r-- | Tools/msi/launcher/launcher_reg.wxs | 2 | ||||
-rw-r--r-- | Tools/msi/msi.props | 4 |
13 files changed, 125 insertions, 53 deletions
diff --git a/Doc/using/win_installer.png b/Doc/using/win_installer.png Binary files differindex 8e25892..e5d5e07 100644 --- a/Doc/using/win_installer.png +++ b/Doc/using/win_installer.png diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 8e3c110..213912f 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -130,6 +130,9 @@ of available options is shown below. +---------------------------+--------------------------------------+--------------------------+ | Include_launcher | Install :ref:`launcher`. | 1 | +---------------------------+--------------------------------------+--------------------------+ +| InstallLauncherAllUsers | Installs :ref:`launcher` for all | 1 | +| | users. | | ++---------------------------+--------------------------------------+--------------------------+ | Include_lib | Install standard library and | 1 | | | extension modules | | +---------------------------+--------------------------------------+--------------------------+ @@ -145,6 +148,9 @@ of available options is shown below. +---------------------------+--------------------------------------+--------------------------+ | SimpleInstall | Disable most install UI | 0 | +---------------------------+--------------------------------------+--------------------------+ +| SimpleInstallDescription | A custom message to display when the | (empty) | +| | simplified install UI is used. | | ++---------------------------+--------------------------------------+--------------------------+ For example, to silently install a default, system-wide Python installation, you could use the following command (from an elevated command prompt):: @@ -152,9 +158,11 @@ you could use the following command (from an elevated command prompt):: python-3.5.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 To allow users to easily install a personal copy of Python without the test -suite, you could provide a shortcut with the following command:: +suite, you could provide a shortcut with the following command. This will +display a simplified initial page and disallow customization:: - python-3.5.0.exe /passive InstallAllUsers=0 Include_launcher=0 Include_test=0 SimpleInstall=1 + python-3.5.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0 + SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite." (Note that omitting the launcher also omits file associations, and is only recommended for per-user installs when there is also a system-wide installation diff --git a/Tools/msi/build.bat b/Tools/msi/build.bat index c135b63..5ae512f 100644 --- a/Tools/msi/build.bat +++ b/Tools/msi/build.bat @@ -6,12 +6,14 @@ set PCBUILD=%D%..\..\PCBuild\ set BUILDX86=
set BUILDX64=
set BUILDDOC=
+set BUILDPX=
:CheckOpts
if "%~1" EQU "-h" goto Help
if "%~1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts
if "%~1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts
if "%~1" EQU "--doc" (set BUILDDOC=1) && shift && goto CheckOpts
+if "%~1" EQU "--test-marker" (set BUILDPX=1) && shift && goto CheckOpts
if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1)
@@ -35,22 +37,28 @@ if defined BUILDDOC ( if errorlevel 1 goto :eof
)
+set BUILD_CMD="%D%bundle\snapshot.wixproj"
+if defined BUILDPX (
+ set BUILD_CMD=%BUILD_CMD% /p:UseTestMarker=true
+)
+
if defined BUILDX86 (
"%PCBUILD%win32\python.exe" "%D%get_wix.py"
- msbuild "%D%bundle\snapshot.wixproj"
+ msbuild %BUILD_CMD%
if errorlevel 1 goto :eof
)
if defined BUILDX64 (
"%PCBUILD%amd64\python.exe" "%D%get_wix.py"
- msbuild "%D%bundle\snapshot.wixproj" /p:Platform=x64
+ msbuild /p:Platform=x64 %BUILD_CMD%
if errorlevel 1 goto :eof
)
exit /B 0
:Help
-echo build.bat [-x86] [-x64] [--doc] [-h]
+echo build.bat [-x86] [-x64] [--doc] [-h] [--test-marker]
echo.
echo -x86 Build x86 installers
echo -x64 Build x64 installers
echo --doc Build CHM documentation
+echo --test-marker Build installers with 'x' markers
diff --git a/Tools/msi/bundle/Default.thm b/Tools/msi/bundle/Default.thm index 0c79dd5..4ba8176 100644 --- a/Tools/msi/bundle/Default.thm +++ b/Tools/msi/bundle/Default.thm @@ -21,10 +21,11 @@ <Text X="185" Y="50" Width="-11" Height="50" FontId="3" TabStop="yes">#(loc.InstallMessage)</Text> - <Button Name="InstallButton" X="175" Y="101" Width="-11" Height="129" TabStop="yes" FontId="3" HexStyle="0xE">#(loc.InstallButton)</Button> - <Button Name="InstallCustomButton" X="175" Y="241" Width="-11" Height="59" TabStop="yes" FontId="3" HexStyle="0xE">#(loc.InstallCustomButton)</Button> + <Button Name="InstallButton" X="175" Y="101" Width="-11" Height="109" TabStop="yes" FontId="3" HexStyle="0xE">#(loc.InstallButton)</Button> + <Button Name="InstallCustomButton" X="175" Y="221" Width="-11" Height="59" TabStop="yes" FontId="3" HexStyle="0xE">#(loc.InstallCustomButton)</Button> <Checkbox Name="PrependPath" X="185" Y="-13" Width="-100" Height="20" TabStop="yes" FontId="3">#(loc.ShortPrependPathLabel)</Checkbox> + <Checkbox Name="InstallLauncherAllUsers" X="185" Y="-33" Width="-100" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.ShortInstallLauncherAllUsersLabel)</Checkbox> <Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.CancelButton)</Button> </Page> @@ -43,7 +44,7 @@ <Text X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.InstallHeader)</Text> <Image X="0" Y="0" Width="162" Height="352" ImageFile="SideBar.png"/> - <Button Name="InstallSimpleButton" X="175" Y="101" Width="-11" Height="59" TabStop="yes" FontId="3" HideWhenDisabled="yes" HexStyle="0xF">#(loc.InstallSimpleButton)</Button> + <Button Name="InstallSimpleButton" X="175" Y="101" Width="-11" Height="129" TabStop="yes" FontId="3" HideWhenDisabled="yes" HexStyle="0xF">#(loc.InstallSimpleButton)</Button> <Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.CancelButton)</Button> </Page> @@ -63,7 +64,8 @@ <Checkbox Name="Include_test" X="185" Y="186" Width="-11" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.Include_testLabel)</Checkbox> <Text X="205" Y="206" Width="-11" Height="20" TabStop="no" FontId="5">#(loc.Include_testHelpLabel)</Text> - <Checkbox Name="Include_launcher" X="185" Y="231" Width="-11" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.Include_launcherLabel)</Checkbox> + <Checkbox Name="Include_launcher" X="185" Y="231" Width="100" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.Include_launcherLabel)</Checkbox> + <Checkbox Name="CustomInstallLauncherAllUsers" X="285" Y="231" Width="-11" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallLauncherAllUsersLabel)</Checkbox> <Text X="205" Y="251" Width="-11" Height="20" TabStop="no" FontId="5">#(loc.Include_launcherHelpLabel)</Text> <Button Name="Custom1BackButton" X="185" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.CustomBackButton)</Button> diff --git a/Tools/msi/bundle/Default.wxl b/Tools/msi/bundle/Default.wxl index 19ba7eb..c12fb65 100644 --- a/Tools/msi/bundle/Default.wxl +++ b/Tools/msi/bundle/Default.wxl @@ -50,7 +50,9 @@ Creates shortcuts and file associations</String> <String Id="InstallCustomButton">C&ustomize installation</String> <String Id="InstallCustomButtonNote">Choose location and features</String> <String Id="InstallSimpleButton">&Install</String> - <String Id="InstallSimpleButtonNote">Uses setting preselected by your administrator</String> + <String Id="InstallSimpleButtonNote">Use settings preselected by your administrator + +[SimpleInstallDescription]</String> <String Id="InstallUpgradeButton">&Upgrade Now</String> <String Id="InstallUpgradeButtonNote">[TargetDir] @@ -81,7 +83,9 @@ Select Customize to review current options.</String> <String Id="ShortcutsLabel">Create shortcuts for installed applications</String> <String Id="PrependPathLabel">Add Python to &environment variables</String> <String Id="ShortPrependPathLabel">Add &Python [ShortVersion] to PATH</String> - <String Id="InstallAllUsersLabel">Install as &Administrator</String> + <String Id="InstallAllUsersLabel">Install for &all users</String> + <String Id="InstallLauncherAllUsersLabel">for &all users (requires elevation)</String> + <String Id="ShortInstallLauncherAllUsersLabel">Install &launcher for all users (recommended)</String> <String Id="PrecompileLabel">&Precompile standard library</String> <String Id="Include_symbolsLabel">Install debugging &symbols</String> <String Id="Include_debugLabel">Install debu&g binaries (requires VS 2015 or later)</String> diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index 2166304..2d8f04d 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -87,11 +87,13 @@ enum CONTROL_ID { ID_INSTALL_UPGRADE_BUTTON, ID_INSTALL_UPGRADE_CUSTOM_BUTTON, ID_INSTALL_CANCEL_BUTTON, - + ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, + // Customize Page ID_TARGETDIR_EDITBOX, ID_CUSTOM_ASSOCIATE_FILES_CHECKBOX, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX, + ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, ID_CUSTOM_COMPILE_ALL_CHECKBOX, ID_CUSTOM_BROWSE_BUTTON, ID_CUSTOM_BROWSE_BUTTON_LABEL, @@ -150,10 +152,12 @@ static THEME_ASSIGN_CONTROL_ID CONTROL_ID_NAMES[] = { { ID_INSTALL_UPGRADE_BUTTON, L"InstallUpgradeButton" }, { ID_INSTALL_UPGRADE_CUSTOM_BUTTON, L"InstallUpgradeCustomButton" }, { ID_INSTALL_CANCEL_BUTTON, L"InstallCancelButton" }, + { ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, L"InstallLauncherAllUsers" }, { ID_TARGETDIR_EDITBOX, L"TargetDir" }, { ID_CUSTOM_ASSOCIATE_FILES_CHECKBOX, L"AssociateFiles" }, { ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX, L"InstallAllUsers" }, + { ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, L"CustomInstallLauncherAllUsers" }, { ID_CUSTOM_COMPILE_ALL_CHECKBOX, L"CompileAll" }, { ID_CUSTOM_BROWSE_BUTTON, L"CustomBrowseButton" }, { ID_CUSTOM_BROWSE_BUTTON_LABEL, L"CustomBrowseButtonLabel" }, @@ -261,10 +265,11 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { LPWSTR defaultDir = nullptr; LPWSTR targetDir = nullptr; LONGLONG elevated, crtInstalled, installAllUsers; - BOOL checked; + BOOL checked, launcherChecked; WCHAR wzPath[MAX_PATH] = { }; BROWSEINFOW browseInfo = { }; PIDLIST_ABSOLUTE pidl = nullptr; + DWORD pageId; HRESULT hr = S_OK; switch(id) { @@ -278,7 +283,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { case ID_INSTALL_BUTTON: SavePageSettings(); - if (!QueryElevateForCrtInstall()) { + if (!WillElevate() && !QueryElevateForCrtInstall()) { break; } @@ -344,18 +349,32 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { ReleaseStr(targetDir); } - checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX); - if (!checked && !QueryElevateForCrtInstall()) { + if (!WillElevate() && !QueryElevateForCrtInstall()) { break; } OnPlan(_command.action); break; + case ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX: + checked = ThemeIsControlChecked(_theme, ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX); + _engine->SetVariableNumeric(L"InstallLauncherAllUsers", checked); + + ThemeControlElevates(_theme, ID_INSTALL_BUTTON, WillElevate()); + break; + + case ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX: + checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX); + _engine->SetVariableNumeric(L"InstallLauncherAllUsers", checked); + + ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, WillElevate()); + break; + case ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX: - hr = BalGetNumericVariable(L"WixBundleElevated", &elevated); checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX); - ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, checked && (FAILED(hr) || !elevated)); + _engine->SetVariableNumeric(L"InstallAllUsers", checked); + + ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, WillElevate()); ThemeControlEnable(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, !checked); if (checked) { _engine->SetVariableNumeric(L"CompileAll", 1); @@ -416,6 +435,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { case ID_MODIFY_BUTTON: // Some variables cannot be modified _engine->SetVariableString(L"InstallAllUsersState", L"disable"); + _engine->SetVariableString(L"InstallLauncherAllUsersState", L"disable"); _engine->SetVariableString(L"TargetDirState", L"disable"); _engine->SetVariableString(L"CustomBrowseButtonState", L"disable"); _modifying = TRUE; @@ -437,35 +457,36 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { void InstallPage_Show() { // Ensure the All Users install button has a UAC shield - LONGLONG elevated, installAll; - - if (FAILED(BalGetNumericVariable(L"WixBundleElevated", &elevated))) { - elevated = 0; - } + BOOL elevated = WillElevate(); + ThemeControlElevates(_theme, ID_INSTALL_BUTTON, elevated); + ThemeControlElevates(_theme, ID_INSTALL_SIMPLE_BUTTON, elevated); + ThemeControlElevates(_theme, ID_INSTALL_UPGRADE_BUTTON, elevated); + } + void Custom1Page_Show() { + LONGLONG installLauncherAllUsers; - if (SUCCEEDED(BalGetNumericVariable(L"InstallAllUsers", &installAll)) && installAll && !elevated) { - ThemeControlElevates(_theme, ID_INSTALL_BUTTON, TRUE); - ThemeControlElevates(_theme, ID_INSTALL_SIMPLE_BUTTON, TRUE); - ThemeControlElevates(_theme, ID_INSTALL_UPGRADE_BUTTON, TRUE); + if (FAILED(BalGetNumericVariable(L"InstallLauncherAllUsers", &installLauncherAllUsers))) { + installLauncherAllUsers = 0; } - } - void Custom1Page_Show() { + ThemeSendControlMessage(_theme, ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, BM_SETCHECK, + installLauncherAllUsers ? BST_CHECKED : BST_UNCHECKED, 0); } void Custom2Page_Show() { HRESULT hr; - LONGLONG installAll, elevated, includeLauncher; + LONGLONG installAll, includeLauncher; - if (FAILED(BalGetNumericVariable(L"WixBundleElevated", &elevated))) { - elevated = 0; + if (FAILED(BalGetNumericVariable(L"InstallAllUsers", &installAll))) { + installAll = 0; } - if (SUCCEEDED(BalGetNumericVariable(L"InstallAllUsers", &installAll))) { - ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, installAll && !elevated); + + if (WillElevate()) { + ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, TRUE); ThemeShowControl(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, SW_HIDE); } else { - installAll = 0; + ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, FALSE); ThemeShowControl(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, SW_SHOW); } @@ -1839,8 +1860,8 @@ private: COLORREF fg = fnt->crForeground, bg = fnt->crBackground; *brush = fnt->hBackground; RemapColor(&fg, &bg, brush); - SetTextColor(hDC, fg); - SetBkColor(hDC, bg); + ::SetTextColor(hDC, fg); + ::SetBkColor(hDC, bg); return TRUE; } @@ -2080,6 +2101,7 @@ private: for (DWORD i = 0; i < pPage->cControlIndices; ++i) { THEME_CONTROL* pControl = _theme->rgControls + pPage->rgdwControlIndices[i]; + BOOL enableControl = TRUE; // If this is a named control, try to set its default state. if (pControl->sczName && *pControl->sczName) { @@ -2091,7 +2113,7 @@ private: // If the control value isn't set then disable it. if (!SUCCEEDED(hr)) { - ThemeControlEnable(_theme, pControl->wId, FALSE); + enableControl = FALSE; } else { ThemeSendControlMessage( _theme, @@ -2110,13 +2132,25 @@ private: LPWSTR controlState = nullptr; hr = BalGetStringVariable(controlName, &controlState); if (SUCCEEDED(hr) && controlState && *controlState) { + if (controlState[0] == '[') { + LPWSTR formatted = nullptr; + if (SUCCEEDED(BalFormatString(controlState, &formatted))) { + StrFree(controlState); + controlState = formatted; + } + } + if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, controlState, -1, L"disable", -1)) { BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Disable control %ls", pControl->sczName); - ThemeControlEnable(_theme, pControl->wId, FALSE); + enableControl = FALSE; } else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, controlState, -1, L"hide", -1)) { BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Hide control %ls", pControl->sczName); // TODO: This doesn't work ThemeShowControl(_theme, pControl->wId, SW_HIDE); + } else { + // An explicit state can override the lack of a + // backing variable. + enableControl = TRUE; } } StrFree(controlState); @@ -2124,6 +2158,8 @@ private: StrFree(controlName); } + ThemeControlEnable(_theme, pControl->wId, enableControl); + // Format the text in each of the new page's controls if (pControl->sczText && *pControl->sczText) { // If the wix developer is showing a hidden variable @@ -2405,6 +2441,16 @@ private: } } + BOOL WillElevate() { + static BAL_CONDITION WILL_ELEVATE_CONDITION = { + L"not WixBundleElevated and (InstallAllUsers or (InstallLauncherAllUsers and Include_launcher))", + L"" + }; + BOOL result; + + return SUCCEEDED(BalConditionEvaluate(&WILL_ELEVATE_CONDITION, _engine, &result, nullptr)) && result; + } + BOOL IsCrtInstalled() { if (_crtInstalledToken > 0) { return TRUE; diff --git a/Tools/msi/bundle/bundle.targets b/Tools/msi/bundle/bundle.targets index 1ff0001..b77646b 100644 --- a/Tools/msi/bundle/bundle.targets +++ b/Tools/msi/bundle/bundle.targets @@ -88,7 +88,7 @@ <Target Name="BuildLauncher" BeforeTargets="BeforeBuild" Condition="'$(RebuildAll)' != 'false'"> <!-- Build the launcher MSI using Exec rather than MSBuild --> - <Exec Command='msbuild ..\launcher\launcher.wixproj /p:Platform=x86 /p:OutputPath="$(BuildPath.TrimEnd(`\`))" /p:OutputSuffix=$(Platform) /p:BuildForRelease=$(BuildForRelease)' + <Exec Command='msbuild ..\launcher\launcher.wixproj /p:Platform=x86 /p:OutputPath="$(BuildPath.TrimEnd(`\`))" /p:OutputSuffix=$(Platform) /p:BuildForRelease=$(BuildForRelease) /p:UseTestMarker=$(UseTestMarker)' ContinueOnError="false" /> </Target> diff --git a/Tools/msi/bundle/bundle.wxs b/Tools/msi/bundle/bundle.wxs index 678dac4..761384e 100644 --- a/Tools/msi/bundle/bundle.wxs +++ b/Tools/msi/bundle/bundle.wxs @@ -24,15 +24,16 @@ <Variable Name="ShortVersionNoDot" Value="$(var.MajorVersionNumber)$(var.MinorVersionNumber)" /> <Variable Name="InstallAllUsers" Value="0" bal:Overridable="yes" /> + <Variable Name="InstallLauncherAllUsers" Value="1" bal:Overridable="yes" /> <Variable Name="TargetDir" Value="" bal:Overridable="yes" /> <?if $(var.Platform)~="x64" ?> - <Variable Name="DefaultAllUsersTargetDir" Value="[ProgramFiles64Folder]Python [ShortVersion]" bal:Overridable="yes" /> + <Variable Name="DefaultAllUsersTargetDir" Value="[ProgramFiles64Folder]$(var.TestPrefix)Python [ShortVersion]" bal:Overridable="yes" /> <Variable Name="TargetPlatform" Value="x64" /> <?else ?> - <Variable Name="DefaultAllUsersTargetDir" Value="[ProgramFilesFolder]Python [ShortVersion]" bal:Overridable="yes" /> + <Variable Name="DefaultAllUsersTargetDir" Value="[ProgramFilesFolder]$(var.TestPrefix)Python [ShortVersion]" bal:Overridable="yes" /> <Variable Name="TargetPlatform" Value="x86" /> <?endif ?> - <Variable Name="DefaultJustForMeTargetDir" Value="[LocalAppDataFolder]Programs\Python\Python[ShortVersionNoDot]$(var.Suffix32)" bal:Overridable="yes" /> + <Variable Name="DefaultJustForMeTargetDir" Value="[LocalAppDataFolder]Programs\$(var.TestPrefix)Python\Python[ShortVersionNoDot]$(var.Suffix32)" bal:Overridable="yes" /> <Variable Name="OptionalFeaturesRegistryKey" Value="Software\$(var.TestPrefix)Python\PythonCore\[ShortVersion]$(var.Suffix32)\InstalledFeatures" /> <Variable Name="TargetDirRegistryKey" Value="Software\$(var.TestPrefix)Python\PythonCore\[ShortVersion]$(var.Suffix32)\InstallPath" /> @@ -45,6 +46,8 @@ <Variable Name="DefaultCustomTargetDir" Value="" bal:Overridable="yes" /> <Variable Name="InstallAllUsersState" Value="enabled" /> + <Variable Name="InstallLauncherAllUsersState" Value="enabled" bal:Overridable="yes" /> + <Variable Name="CustomInstallLauncherAllUsersState" Value="[InstallLauncherAllUsersState]" /> <Variable Name="TargetDirState" Value="enabled" /> <Variable Name="CustomBrowseButtonState" Value="enabled" /> @@ -67,6 +70,7 @@ <Variable Name="CompileAll" Value="0" bal:Overridable="yes" /> <Variable Name="SimpleInstall" Value="0" bal:Overridable="yes" /> + <Variable Name="SimpleInstallDescription" Value="" bal:Overridable="yes" /> <Chain ParallelCache="yes"> <PackageGroupRef Id="crt" /> diff --git a/Tools/msi/bundle/packagegroups/launcher.wxs b/Tools/msi/bundle/packagegroups/launcher.wxs index d09175f..77c6ac5 100644 --- a/Tools/msi/bundle/packagegroups/launcher.wxs +++ b/Tools/msi/bundle/packagegroups/launcher.wxs @@ -9,7 +9,7 @@ DownloadUrl="$(var.DownloadUrl)" ForcePerMachine="yes" EnableFeatureSelection="yes" - InstallCondition="InstallAllUsers and Include_launcher" /> + InstallCondition="(InstallAllUsers or InstallLauncherAllUsers) and Include_launcher" /> <MsiPackage Id="launcher_JustForMe" SourceFile="launcher.msi" @@ -17,7 +17,7 @@ DownloadUrl="$(var.DownloadUrl)" ForcePerMachine="no" EnableFeatureSelection="yes" - InstallCondition="not InstallAllUsers and Include_launcher" /> + InstallCondition="not (InstallAllUsers or InstallLauncherAllUsers) and Include_launcher" /> </PackageGroup> </Fragment> </Wix>
\ No newline at end of file diff --git a/Tools/msi/common.wxs b/Tools/msi/common.wxs index cc39540..9f96bd3 100644 --- a/Tools/msi/common.wxs +++ b/Tools/msi/common.wxs @@ -103,7 +103,7 @@ <Fragment> <DirectoryRef Id="TARGETDIR"> <Directory Id="ProgramMenuFolder"> - <Directory Id="MenuDir" Name="!(loc.ProductName)" /> + <Directory Id="MenuDir" Name="$(var.TestPrefix)!(loc.ProductName)" /> </Directory> </DirectoryRef> </Fragment> diff --git a/Tools/msi/launcher/launcher_files.wxs b/Tools/msi/launcher/launcher_files.wxs index 589dee5..7148258 100644 --- a/Tools/msi/launcher/launcher_files.wxs +++ b/Tools/msi/launcher/launcher_files.wxs @@ -3,22 +3,22 @@ <Fragment> <ComponentGroup Id="launcher_exe"> <Component Id="py.exe" Directory="LauncherInstallDirectory" Guid="{B5107402-6958-461B-8B0A-4037D3327160}"> - <File Id="py.exe" Name="py.exe" Source="py.exe" KeyPath="yes" /> + <File Id="py.exe" Name="py$(var.TestPrefix).exe" Source="py.exe" KeyPath="yes" /> <RegistryValue Root="HKMU" Key="Software\Python\PyLauncher" Value="[#py.exe]" Type="string" /> </Component> <Component Id="pyw.exe" Directory="LauncherInstallDirectory" Guid="{8E52B8CD-48BB-4D74-84CD-6238BCD11F20}"> - <File Id="pyw.exe" Name="pyw.exe" Source="pyw.exe" KeyPath="yes" /> + <File Id="pyw.exe" Name="pyw$(var.TestPrefix).exe" Source="pyw.exe" KeyPath="yes" /> </Component> <Component Id="launcher_path_cu" Directory="LauncherInstallDirectory" Guid="{95AEB930-367C-475C-A17E-A89BFCD4C670}"> <Condition>NOT ALLUSERS=1</Condition> - <RegistryValue KeyPath="yes" Root="HKMU" Key="Software\Python\PyLauncher" Name="InstallDir" Value="[LauncherInstallDirectory]" Type="string" /> + <RegistryValue KeyPath="yes" Root="HKMU" Key="Software\$(var.TestPrefix)Python\PyLauncher" Name="InstallDir" Value="[LauncherInstallDirectory]" Type="string" /> <Environment Id="PATH_CU" Action="set" Name="PATH" Part="first" Value="[LauncherInstallDirectory]" /> </Component> <Component Id="launcher_path_lm" Directory="LauncherInstallDirectory" Guid="{4A41C365-4E27-4D38-A6D1-4A01B4A6500C}"> <Condition>ALLUSERS=1</Condition> - <RegistryValue KeyPath="yes" Root="HKMU" Key="Software\Python\PyLauncher" Name="InstallDir" Value="[LauncherInstallDirectory]" Type="string" /> + <RegistryValue KeyPath="yes" Root="HKMU" Key="Software\$(var.TestPrefix)Python\PyLauncher" Name="InstallDir" Value="[LauncherInstallDirectory]" Type="string" /> </Component> </ComponentGroup> </Fragment> diff --git a/Tools/msi/launcher/launcher_reg.wxs b/Tools/msi/launcher/launcher_reg.wxs index eef71c8..d00f442 100644 --- a/Tools/msi/launcher/launcher_reg.wxs +++ b/Tools/msi/launcher/launcher_reg.wxs @@ -3,7 +3,7 @@ <Fragment> <ComponentGroup Id="launcher_reg"> <Component Id="file_association" Directory="LauncherInstallDirectory" Guid="{5AF84D9A-D820-456B-B230-6E0105A50276}"> - <RegistryValue KeyPath="yes" Root="HKMU" Key="Software\Python\PyLauncher" Name="AssociateFiles" Value="1" Type="integer" /> + <RegistryValue KeyPath="yes" Root="HKMU" Key="Software\$(var.TestPrefix)Python\PyLauncher" Name="AssociateFiles" Value="1" Type="integer" /> <ProgId Id="$(var.TestPrefix)Python.File" Description="!(loc.PythonFileDescription)" Advertise="no" Icon="py.exe" IconIndex="1"> <Extension Id="$(var.FileExtension)" ContentType="text/plain"> diff --git a/Tools/msi/msi.props b/Tools/msi/msi.props index 2d13aef..29be129 100644 --- a/Tools/msi/msi.props +++ b/Tools/msi/msi.props @@ -81,10 +81,10 @@ <DefineConstants Condition="'$(CRTRedist)' != ''"> $(DefineConstants);CRTRedist=$(CRTRedist); </DefineConstants> - <DefineConstants Condition="$(Configuration) != 'Debug'"> + <DefineConstants Condition="$(UseTestMarker) != 'true'"> $(DefineConstants);TestPrefix=;FileExtension=py; </DefineConstants> - <DefineConstants Condition="$(Configuration) == 'Debug'"> + <DefineConstants Condition="$(UseTestMarker) == 'true'"> $(DefineConstants);TestPrefix=x;FileExtension=px; </DefineConstants> <DefineConstants Condition="$(Platform) != 'x64'"> |