Skip to content

Commit 2237bdc

Browse files
committed
Adds option to install launcher for all users even when installing Python just-for-me. This helps mitigate issues when the incompatible Python 3.4 launcher is installed.
Enables installer builds with the the text marker. Allows simple installs to include a custom description.
1 parent 8cc80f1 commit 2237bdc

File tree

13 files changed

+125
-53
lines changed

13 files changed

+125
-53
lines changed

Doc/using/win_installer.png

2.33 KB
Loading

Doc/using/windows.rst

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ of available options is shown below.
130130
+---------------------------+--------------------------------------+--------------------------+
131131
| Include_launcher | Install :ref:`launcher`. | 1 |
132132
+---------------------------+--------------------------------------+--------------------------+
133+
| InstallLauncherAllUsers | Installs :ref:`launcher` for all | 1 |
134+
| | users. | |
135+
+---------------------------+--------------------------------------+--------------------------+
133136
| Include_lib | Install standard library and | 1 |
134137
| | extension modules | |
135138
+---------------------------+--------------------------------------+--------------------------+
@@ -145,16 +148,21 @@ of available options is shown below.
145148
+---------------------------+--------------------------------------+--------------------------+
146149
| SimpleInstall | Disable most install UI | 0 |
147150
+---------------------------+--------------------------------------+--------------------------+
151+
| SimpleInstallDescription | A custom message to display when the | (empty) |
152+
| | simplified install UI is used. | |
153+
+---------------------------+--------------------------------------+--------------------------+
148154

149155
For example, to silently install a default, system-wide Python installation,
150156
you could use the following command (from an elevated command prompt)::
151157

152158
python-3.5.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0
153159

154160
To allow users to easily install a personal copy of Python without the test
155-
suite, you could provide a shortcut with the following command::
161+
suite, you could provide a shortcut with the following command. This will
162+
display a simplified initial page and disallow customization::
156163

157-
python-3.5.0.exe /passive InstallAllUsers=0 Include_launcher=0 Include_test=0 SimpleInstall=1
164+
python-3.5.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0
165+
SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite."
158166

159167
(Note that omitting the launcher also omits file associations, and is only
160168
recommended for per-user installs when there is also a system-wide installation

Tools/msi/build.bat

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ set PCBUILD=%D%..\..\PCBuild\
66
set BUILDX86=
77
set BUILDX64=
88
set BUILDDOC=
9+
set BUILDPX=
910

1011
:CheckOpts
1112
if "%~1" EQU "-h" goto Help
1213
if "%~1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts
1314
if "%~1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts
1415
if "%~1" EQU "--doc" (set BUILDDOC=1) && shift && goto CheckOpts
16+
if "%~1" EQU "--test-marker" (set BUILDPX=1) && shift && goto CheckOpts
1517

1618
if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1)
1719

@@ -35,22 +37,28 @@ if defined BUILDDOC (
3537
if errorlevel 1 goto :eof
3638
)
3739

40+
set BUILD_CMD="%D%bundle\snapshot.wixproj"
41+
if defined BUILDPX (
42+
set BUILD_CMD=%BUILD_CMD% /p:UseTestMarker=true
43+
)
44+
3845
if defined BUILDX86 (
3946
"%PCBUILD%win32\python.exe" "%D%get_wix.py"
40-
msbuild "%D%bundle\snapshot.wixproj"
47+
msbuild %BUILD_CMD%
4148
if errorlevel 1 goto :eof
4249
)
4350
if defined BUILDX64 (
4451
"%PCBUILD%amd64\python.exe" "%D%get_wix.py"
45-
msbuild "%D%bundle\snapshot.wixproj" /p:Platform=x64
52+
msbuild /p:Platform=x64 %BUILD_CMD%
4653
if errorlevel 1 goto :eof
4754
)
4855

4956
exit /B 0
5057

5158
:Help
52-
echo build.bat [-x86] [-x64] [--doc] [-h]
59+
echo build.bat [-x86] [-x64] [--doc] [-h] [--test-marker]
5360
echo.
5461
echo -x86 Build x86 installers
5562
echo -x64 Build x64 installers
5663
echo --doc Build CHM documentation
64+
echo --test-marker Build installers with 'x' markers

Tools/msi/bundle/Default.thm

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@
2121

2222
<Text X="185" Y="50" Width="-11" Height="50" FontId="3" TabStop="yes">#(loc.InstallMessage)</Text>
2323

24-
<Button Name="InstallButton" X="175" Y="101" Width="-11" Height="129" TabStop="yes" FontId="3" HexStyle="0xE">#(loc.InstallButton)</Button>
25-
<Button Name="InstallCustomButton" X="175" Y="241" Width="-11" Height="59" TabStop="yes" FontId="3" HexStyle="0xE">#(loc.InstallCustomButton)</Button>
24+
<Button Name="InstallButton" X="175" Y="101" Width="-11" Height="109" TabStop="yes" FontId="3" HexStyle="0xE">#(loc.InstallButton)</Button>
25+
<Button Name="InstallCustomButton" X="175" Y="221" Width="-11" Height="59" TabStop="yes" FontId="3" HexStyle="0xE">#(loc.InstallCustomButton)</Button>
2626

2727
<Checkbox Name="PrependPath" X="185" Y="-13" Width="-100" Height="20" TabStop="yes" FontId="3">#(loc.ShortPrependPathLabel)</Checkbox>
28+
<Checkbox Name="InstallLauncherAllUsers" X="185" Y="-33" Width="-100" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.ShortInstallLauncherAllUsersLabel)</Checkbox>
2829

2930
<Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.CancelButton)</Button>
3031
</Page>
@@ -43,7 +44,7 @@
4344
<Text X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.InstallHeader)</Text>
4445
<Image X="0" Y="0" Width="162" Height="352" ImageFile="SideBar.png"/>
4546

46-
<Button Name="InstallSimpleButton" X="175" Y="101" Width="-11" Height="59" TabStop="yes" FontId="3" HideWhenDisabled="yes" HexStyle="0xF">#(loc.InstallSimpleButton)</Button>
47+
<Button Name="InstallSimpleButton" X="175" Y="101" Width="-11" Height="129" TabStop="yes" FontId="3" HideWhenDisabled="yes" HexStyle="0xF">#(loc.InstallSimpleButton)</Button>
4748

4849
<Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.CancelButton)</Button>
4950
</Page>
@@ -63,7 +64,8 @@
6364
<Checkbox Name="Include_test" X="185" Y="186" Width="-11" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.Include_testLabel)</Checkbox>
6465
<Text X="205" Y="206" Width="-11" Height="20" TabStop="no" FontId="5">#(loc.Include_testHelpLabel)</Text>
6566

66-
<Checkbox Name="Include_launcher" X="185" Y="231" Width="-11" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.Include_launcherLabel)</Checkbox>
67+
<Checkbox Name="Include_launcher" X="185" Y="231" Width="100" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.Include_launcherLabel)</Checkbox>
68+
<Checkbox Name="CustomInstallLauncherAllUsers" X="285" Y="231" Width="-11" Height="20" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallLauncherAllUsersLabel)</Checkbox>
6769
<Text X="205" Y="251" Width="-11" Height="20" TabStop="no" FontId="5">#(loc.Include_launcherHelpLabel)</Text>
6870

6971
<Button Name="Custom1BackButton" X="185" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.CustomBackButton)</Button>

Tools/msi/bundle/Default.wxl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ Creates shortcuts and file associations</String>
5050
<String Id="InstallCustomButton">C&amp;ustomize installation</String>
5151
<String Id="InstallCustomButtonNote">Choose location and features</String>
5252
<String Id="InstallSimpleButton">&amp;Install</String>
53-
<String Id="InstallSimpleButtonNote">Uses setting preselected by your administrator</String>
53+
<String Id="InstallSimpleButtonNote">Use settings preselected by your administrator
54+
55+
[SimpleInstallDescription]</String>
5456
<String Id="InstallUpgradeButton">&amp;Upgrade Now</String>
5557
<String Id="InstallUpgradeButtonNote">[TargetDir]
5658

@@ -81,7 +83,9 @@ Select Customize to review current options.</String>
8183
<String Id="ShortcutsLabel">Create shortcuts for installed applications</String>
8284
<String Id="PrependPathLabel">Add Python to &amp;environment variables</String>
8385
<String Id="ShortPrependPathLabel">Add &amp;Python [ShortVersion] to PATH</String>
84-
<String Id="InstallAllUsersLabel">Install as &amp;Administrator</String>
86+
<String Id="InstallAllUsersLabel">Install for &amp;all users</String>
87+
<String Id="InstallLauncherAllUsersLabel">for &amp;all users (requires elevation)</String>
88+
<String Id="ShortInstallLauncherAllUsersLabel">Install &amp;launcher for all users (recommended)</String>
8589
<String Id="PrecompileLabel">&amp;Precompile standard library</String>
8690
<String Id="Include_symbolsLabel">Install debugging &amp;symbols</String>
8791
<String Id="Include_debugLabel">Install debu&amp;g binaries (requires VS 2015 or later)</String>

Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp

Lines changed: 74 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,13 @@ enum CONTROL_ID {
8787
ID_INSTALL_UPGRADE_BUTTON,
8888
ID_INSTALL_UPGRADE_CUSTOM_BUTTON,
8989
ID_INSTALL_CANCEL_BUTTON,
90-
90+
ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX,
91+
9192
// Customize Page
9293
ID_TARGETDIR_EDITBOX,
9394
ID_CUSTOM_ASSOCIATE_FILES_CHECKBOX,
9495
ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX,
96+
ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX,
9597
ID_CUSTOM_COMPILE_ALL_CHECKBOX,
9698
ID_CUSTOM_BROWSE_BUTTON,
9799
ID_CUSTOM_BROWSE_BUTTON_LABEL,
@@ -150,10 +152,12 @@ static THEME_ASSIGN_CONTROL_ID CONTROL_ID_NAMES[] = {
150152
{ ID_INSTALL_UPGRADE_BUTTON, L"InstallUpgradeButton" },
151153
{ ID_INSTALL_UPGRADE_CUSTOM_BUTTON, L"InstallUpgradeCustomButton" },
152154
{ ID_INSTALL_CANCEL_BUTTON, L"InstallCancelButton" },
155+
{ ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, L"InstallLauncherAllUsers" },
153156

154157
{ ID_TARGETDIR_EDITBOX, L"TargetDir" },
155158
{ ID_CUSTOM_ASSOCIATE_FILES_CHECKBOX, L"AssociateFiles" },
156159
{ ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX, L"InstallAllUsers" },
160+
{ ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, L"CustomInstallLauncherAllUsers" },
157161
{ ID_CUSTOM_COMPILE_ALL_CHECKBOX, L"CompileAll" },
158162
{ ID_CUSTOM_BROWSE_BUTTON, L"CustomBrowseButton" },
159163
{ ID_CUSTOM_BROWSE_BUTTON_LABEL, L"CustomBrowseButtonLabel" },
@@ -261,10 +265,11 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
261265
LPWSTR defaultDir = nullptr;
262266
LPWSTR targetDir = nullptr;
263267
LONGLONG elevated, crtInstalled, installAllUsers;
264-
BOOL checked;
268+
BOOL checked, launcherChecked;
265269
WCHAR wzPath[MAX_PATH] = { };
266270
BROWSEINFOW browseInfo = { };
267271
PIDLIST_ABSOLUTE pidl = nullptr;
272+
DWORD pageId;
268273
HRESULT hr = S_OK;
269274

270275
switch(id) {
@@ -278,7 +283,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
278283
case ID_INSTALL_BUTTON:
279284
SavePageSettings();
280285

281-
if (!QueryElevateForCrtInstall()) {
286+
if (!WillElevate() && !QueryElevateForCrtInstall()) {
282287
break;
283288
}
284289

@@ -344,18 +349,32 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
344349
ReleaseStr(targetDir);
345350
}
346351

347-
checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX);
348-
if (!checked && !QueryElevateForCrtInstall()) {
352+
if (!WillElevate() && !QueryElevateForCrtInstall()) {
349353
break;
350354
}
351355

352356
OnPlan(_command.action);
353357
break;
354358

359+
case ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX:
360+
checked = ThemeIsControlChecked(_theme, ID_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX);
361+
_engine->SetVariableNumeric(L"InstallLauncherAllUsers", checked);
362+
363+
ThemeControlElevates(_theme, ID_INSTALL_BUTTON, WillElevate());
364+
break;
365+
366+
case ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX:
367+
checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX);
368+
_engine->SetVariableNumeric(L"InstallLauncherAllUsers", checked);
369+
370+
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, WillElevate());
371+
break;
372+
355373
case ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX:
356-
hr = BalGetNumericVariable(L"WixBundleElevated", &elevated);
357374
checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX);
358-
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, checked && (FAILED(hr) || !elevated));
375+
_engine->SetVariableNumeric(L"InstallAllUsers", checked);
376+
377+
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, WillElevate());
359378
ThemeControlEnable(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, !checked);
360379
if (checked) {
361380
_engine->SetVariableNumeric(L"CompileAll", 1);
@@ -416,6 +435,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
416435
case ID_MODIFY_BUTTON:
417436
// Some variables cannot be modified
418437
_engine->SetVariableString(L"InstallAllUsersState", L"disable");
438+
_engine->SetVariableString(L"InstallLauncherAllUsersState", L"disable");
419439
_engine->SetVariableString(L"TargetDirState", L"disable");
420440
_engine->SetVariableString(L"CustomBrowseButtonState", L"disable");
421441
_modifying = TRUE;
@@ -437,35 +457,36 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
437457

438458
void InstallPage_Show() {
439459
// Ensure the All Users install button has a UAC shield
440-
LONGLONG elevated, installAll;
441-
442-
if (FAILED(BalGetNumericVariable(L"WixBundleElevated", &elevated))) {
443-
elevated = 0;
444-
}
460+
BOOL elevated = WillElevate();
461+
ThemeControlElevates(_theme, ID_INSTALL_BUTTON, elevated);
462+
ThemeControlElevates(_theme, ID_INSTALL_SIMPLE_BUTTON, elevated);
463+
ThemeControlElevates(_theme, ID_INSTALL_UPGRADE_BUTTON, elevated);
464+
}
445465

466+
void Custom1Page_Show() {
467+
LONGLONG installLauncherAllUsers;
446468

447-
if (SUCCEEDED(BalGetNumericVariable(L"InstallAllUsers", &installAll)) && installAll && !elevated) {
448-
ThemeControlElevates(_theme, ID_INSTALL_BUTTON, TRUE);
449-
ThemeControlElevates(_theme, ID_INSTALL_SIMPLE_BUTTON, TRUE);
450-
ThemeControlElevates(_theme, ID_INSTALL_UPGRADE_BUTTON, TRUE);
469+
if (FAILED(BalGetNumericVariable(L"InstallLauncherAllUsers", &installLauncherAllUsers))) {
470+
installLauncherAllUsers = 0;
451471
}
452-
}
453472

454-
void Custom1Page_Show() {
473+
ThemeSendControlMessage(_theme, ID_CUSTOM_INSTALL_LAUNCHER_ALL_USERS_CHECKBOX, BM_SETCHECK,
474+
installLauncherAllUsers ? BST_CHECKED : BST_UNCHECKED, 0);
455475
}
456476

457477
void Custom2Page_Show() {
458478
HRESULT hr;
459-
LONGLONG installAll, elevated, includeLauncher;
479+
LONGLONG installAll, includeLauncher;
460480

461-
if (FAILED(BalGetNumericVariable(L"WixBundleElevated", &elevated))) {
462-
elevated = 0;
481+
if (FAILED(BalGetNumericVariable(L"InstallAllUsers", &installAll))) {
482+
installAll = 0;
463483
}
464-
if (SUCCEEDED(BalGetNumericVariable(L"InstallAllUsers", &installAll))) {
465-
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, installAll && !elevated);
484+
485+
if (WillElevate()) {
486+
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, TRUE);
466487
ThemeShowControl(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, SW_HIDE);
467488
} else {
468-
installAll = 0;
489+
ThemeControlElevates(_theme, ID_CUSTOM_INSTALL_BUTTON, FALSE);
469490
ThemeShowControl(_theme, ID_CUSTOM_BROWSE_BUTTON_LABEL, SW_SHOW);
470491
}
471492

@@ -1839,8 +1860,8 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
18391860
COLORREF fg = fnt->crForeground, bg = fnt->crBackground;
18401861
*brush = fnt->hBackground;
18411862
RemapColor(&fg, &bg, brush);
1842-
SetTextColor(hDC, fg);
1843-
SetBkColor(hDC, bg);
1863+
::SetTextColor(hDC, fg);
1864+
::SetBkColor(hDC, bg);
18441865

18451866
return TRUE;
18461867
}
@@ -2080,6 +2101,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
20802101

20812102
for (DWORD i = 0; i < pPage->cControlIndices; ++i) {
20822103
THEME_CONTROL* pControl = _theme->rgControls + pPage->rgdwControlIndices[i];
2104+
BOOL enableControl = TRUE;
20832105

20842106
// If this is a named control, try to set its default state.
20852107
if (pControl->sczName && *pControl->sczName) {
@@ -2091,7 +2113,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
20912113

20922114
// If the control value isn't set then disable it.
20932115
if (!SUCCEEDED(hr)) {
2094-
ThemeControlEnable(_theme, pControl->wId, FALSE);
2116+
enableControl = FALSE;
20952117
} else {
20962118
ThemeSendControlMessage(
20972119
_theme,
@@ -2110,20 +2132,34 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
21102132
LPWSTR controlState = nullptr;
21112133
hr = BalGetStringVariable(controlName, &controlState);
21122134
if (SUCCEEDED(hr) && controlState && *controlState) {
2135+
if (controlState[0] == '[') {
2136+
LPWSTR formatted = nullptr;
2137+
if (SUCCEEDED(BalFormatString(controlState, &formatted))) {
2138+
StrFree(controlState);
2139+
controlState = formatted;
2140+
}
2141+
}
2142+
21132143
if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, controlState, -1, L"disable", -1)) {
21142144
BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Disable control %ls", pControl->sczName);
2115-
ThemeControlEnable(_theme, pControl->wId, FALSE);
2145+
enableControl = FALSE;
21162146
} else if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, controlState, -1, L"hide", -1)) {
21172147
BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Hide control %ls", pControl->sczName);
21182148
// TODO: This doesn't work
21192149
ThemeShowControl(_theme, pControl->wId, SW_HIDE);
2150+
} else {
2151+
// An explicit state can override the lack of a
2152+
// backing variable.
2153+
enableControl = TRUE;
21202154
}
21212155
}
21222156
StrFree(controlState);
21232157
}
21242158
StrFree(controlName);
21252159
}
21262160

2161+
ThemeControlEnable(_theme, pControl->wId, enableControl);
2162+
21272163
// Format the text in each of the new page's controls
21282164
if (pControl->sczText && *pControl->sczText) {
21292165
// If the wix developer is showing a hidden variable
@@ -2405,6 +2441,16 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication {
24052441
}
24062442
}
24072443

2444+
BOOL WillElevate() {
2445+
static BAL_CONDITION WILL_ELEVATE_CONDITION = {
2446+
L"not WixBundleElevated and (InstallAllUsers or (InstallLauncherAllUsers and Include_launcher))",
2447+
L""
2448+
};
2449+
BOOL result;
2450+
2451+
return SUCCEEDED(BalConditionEvaluate(&WILL_ELEVATE_CONDITION, _engine, &result, nullptr)) && result;
2452+
}
2453+
24082454
BOOL IsCrtInstalled() {
24092455
if (_crtInstalledToken > 0) {
24102456
return TRUE;

Tools/msi/bundle/bundle.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888

8989
<Target Name="BuildLauncher" BeforeTargets="BeforeBuild" Condition="'$(RebuildAll)' != 'false'">
9090
<!-- Build the launcher MSI using Exec rather than MSBuild -->
91-
<Exec Command='msbuild ..\launcher\launcher.wixproj /p:Platform=x86 /p:OutputPath="$(BuildPath.TrimEnd(`\`))" /p:OutputSuffix=$(Platform) /p:BuildForRelease=$(BuildForRelease)'
91+
<Exec Command='msbuild ..\launcher\launcher.wixproj /p:Platform=x86 /p:OutputPath="$(BuildPath.TrimEnd(`\`))" /p:OutputSuffix=$(Platform) /p:BuildForRelease=$(BuildForRelease) /p:UseTestMarker=$(UseTestMarker)'
9292
ContinueOnError="false" />
9393
</Target>
9494

0 commit comments

Comments
 (0)