diff options
author | Steve Dower <steve.dower@microsoft.com> | 2015-03-01 03:53:50 (GMT) |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2015-03-01 03:53:50 (GMT) |
commit | e4969f5df832eb8f626544d38ee11b75b52b4aee (patch) | |
tree | 224c8c8914af9b5821b9ea344a15895632728bd4 /Tools/msi/bundle | |
parent | a473b9da152d4cdd10eccc6d8eafa2b519da121d (diff) | |
download | cpython-e4969f5df832eb8f626544d38ee11b75b52b4aee.zip cpython-e4969f5df832eb8f626544d38ee11b75b52b4aee.tar.gz cpython-e4969f5df832eb8f626544d38ee11b75b52b4aee.tar.bz2 |
Updates CRT installation for Windows installer.
Bundling versions of the CRT prior to 14.0 is no longer supported.
Diffstat (limited to 'Tools/msi/bundle')
-rw-r--r-- | Tools/msi/bundle/Default.wxl | 5 | ||||
-rw-r--r-- | Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp | 88 | ||||
-rw-r--r-- | Tools/msi/bundle/bundle.targets | 3 | ||||
-rw-r--r-- | Tools/msi/bundle/bundle.wxl (renamed from Tools/msi/bundle/postinstall_en-US.wxl_template) | 3 | ||||
-rw-r--r-- | Tools/msi/bundle/packagegroups/crt.wxs | 43 |
5 files changed, 138 insertions, 4 deletions
diff --git a/Tools/msi/bundle/Default.wxl b/Tools/msi/bundle/Default.wxl index 6efd614..b62faf6 100644 --- a/Tools/msi/bundle/Default.wxl +++ b/Tools/msi/bundle/Default.wxl @@ -11,6 +11,11 @@ <String Id="Uninstalling">Removing</String> <String Id="Uninstallation">Uninstall</String> + <String Id="ElevateForCRTInstall">You will be prompted for Administrator privileges to install a C Runtime Library update (KB2999226). + + +Continue?</String> + <String Id="CancelButton">&Cancel</String> <String Id="CloseButton">&Close</String> <String Id="InstallHeader">Install [WixBundleName]</String> diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index 5eda3f7..d090443 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -10,8 +10,6 @@ #include "pch.h" -static const LPCWSTR WIXBUNDLE_VARIABLE_ELEVATED = L"WixBundleElevated"; - static const LPCWSTR PYBA_WINDOW_CLASS = L"PythonBA"; static const LPCWSTR PYBA_VARIABLE_LAUNCH_TARGET_PATH = L"LaunchTarget"; static const LPCWSTR PYBA_VARIABLE_LAUNCH_TARGET_ELEVATED_ID = L"LaunchTargetElevatedId"; @@ -232,7 +230,7 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { void OnCommand(CONTROL_ID id) { LPWSTR defaultDir = nullptr; LPWSTR targetDir = nullptr; - LONGLONG elevated; + LONGLONG elevated, crtInstalled; BOOL checked; WCHAR wzPath[MAX_PATH] = { }; BROWSEINFOW browseInfo = { }; @@ -320,6 +318,10 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { ReleaseStr(targetDir); BalExitOnFailure(hr, "Failed to set install target directory"); + if (!QueryElevateForCrtInstall()) { + break; + } + OnPlan(BOOTSTRAPPER_ACTION_INSTALL); break; @@ -352,6 +354,11 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { ReleaseStr(targetDir); } + checked = ThemeIsControlChecked(_theme, ID_CUSTOM_INSTALL_ALL_USERS_CHECKBOX); + if (!checked && !QueryElevateForCrtInstall()) { + break; + } + OnPlan(_command.action); break; @@ -2311,6 +2318,75 @@ private: } } + BOOL IsCrtInstalled() { + if (_crtInstalledToken > 0) { + return TRUE; + } else if (_crtInstalledToken == 0) { + return FALSE; + } + + // Check whether at least CRT v10.0.9920.0 is available. + // It should only be installed as a Windows Update package, which means + // we don't need to worry about 32-bit/64-bit. + // However, since the WU package does not include vcruntime140.dll, we + // still install that ourselves. + LPCWSTR crtFile = L"api-ms-win-crt-runtime-l1-1-0.dll"; + + DWORD cbVer = GetFileVersionInfoSizeW(crtFile, nullptr); + if (!cbVer) { + _crtInstalledToken = 0; + return FALSE; + } + + void *pData = malloc(cbVer); + if (!pData) { + _crtInstalledToken = 0; + return FALSE; + } + + if (!GetFileVersionInfoW(crtFile, 0, cbVer, pData)) { + free(pData); + _crtInstalledToken = 0; + return FALSE; + } + + VS_FIXEDFILEINFO *ffi; + UINT cb; + BOOL result = FALSE; + + if (VerQueryValueW(pData, L"\\", (LPVOID*)&ffi, &cb) && + ffi->dwFileVersionMS == 0x000A0000 && ffi->dwFileVersionLS >= 0x26C00000) { + result = TRUE; + } + + free(pData); + _crtInstalledToken = result ? 1 : 0; + return result; + } + + BOOL QueryElevateForCrtInstall() { + // Called to prompt the user that even though they think they won't need + // to elevate, they actually will because of the CRT install. + if (IsCrtInstalled()) { + // CRT is already installed - no need to prompt + return TRUE; + } + + LONGLONG elevated; + HRESULT hr = BalGetNumericVariable(L"WixBundleElevated", &elevated); + if (SUCCEEDED(hr) && elevated) { + // Already elevated - no need to prompt + return TRUE; + } + + LOC_STRING *locStr; + hr = LocGetString(_wixLoc, L"#(loc.ElevateForCRTInstall)", &locStr); + if (FAILED(hr)) { + BalLogError(hr, "Failed to get ElevateForCRTInstall string"); + return FALSE; + } + return ::MessageBoxW(_hWnd, locStr->wzText, _theme->sczCaption, MB_YESNO) != IDNO; + } HRESULT EvaluateConditions() { HRESULT hr = S_OK; @@ -2498,6 +2574,8 @@ public: } } + pEngine->SetVariableNumeric(L"CRTInstalled", IsCrtInstalled() ? 1 : 0); + _wixLoc = nullptr; memset(&_bundle, 0, sizeof(_bundle)); memset(&_conditions, 0, sizeof(_conditions)); @@ -2525,6 +2603,8 @@ public: _suppressRepair = FALSE; _modifying = FALSE; + _crtInstalledToken = -1; + _overridableVariables = nullptr; _taskbarList = nullptr; _taskbarButtonCreatedMessage = UINT_MAX; @@ -2606,6 +2686,8 @@ private: BOOL _suppressRepair; BOOL _modifying; + int _crtInstalledToken; + STRINGDICT_HANDLE _overridableVariables; ITaskbarList3* _taskbarList; diff --git a/Tools/msi/bundle/bundle.targets b/Tools/msi/bundle/bundle.targets index 7697af7..cc7e445 100644 --- a/Tools/msi/bundle/bundle.targets +++ b/Tools/msi/bundle/bundle.targets @@ -10,6 +10,8 @@ <OutputName Condition="!$(BuildForRelease)">$(OutputName)-$(MajorVersionNumber).$(MinorVersionNumber).$(MicroVersionNumber).$(RevisionNumber)</OutputName> <OutputName Condition="$(Platform) == 'x64'">$(OutputName)-amd64</OutputName> <OutputName Condition="'$(OutputSuffix)' != ''">$(OutputName)-$(OutputSuffix)</OutputName> + <OutputName Condition="'$(Configuration)' == 'Debug'">$(OutputName)-d</OutputName> + <TargetName>$(OutputName)</TargetName> <OutputPath>$(OutputPath)en-us\</OutputPath> <OutDir>$(OutputPath)</OutDir> @@ -43,6 +45,7 @@ <Content Include="SideBar.png" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="bundle.wxl" /> <WxlTemplate Include="*_en-US.wxl_template" /> </ItemGroup> <ItemGroup> diff --git a/Tools/msi/bundle/postinstall_en-US.wxl_template b/Tools/msi/bundle/bundle.wxl index 5f54aef..684e0da 100644 --- a/Tools/msi/bundle/postinstall_en-US.wxl_template +++ b/Tools/msi/bundle/bundle.wxl @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization"> - <String Id="CompileAllDescription">Precompiling standard library</String> + <String Id="CRTDescription">C Runtime Update (KB2999226)</String> + <String Id="CompileAllDescription">Precompiling standard library</String> </WixLocalization> diff --git a/Tools/msi/bundle/packagegroups/crt.wxs b/Tools/msi/bundle/packagegroups/crt.wxs index e19b4f9..b079700 100644 --- a/Tools/msi/bundle/packagegroups/crt.wxs +++ b/Tools/msi/bundle/packagegroups/crt.wxs @@ -2,6 +2,11 @@ <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Fragment> <PackageGroup Id="crt"> + <PackageGroupRef Id="crt_14.0_v6.0" /> + <PackageGroupRef Id="crt_14.0_v6.1" /> + <PackageGroupRef Id="crt_14.0_v6.2" /> + <PackageGroupRef Id="crt_14.0_v6.3" /> + <MsiPackage Id="crt_AllUsers" SourceFile="crt.msi" Compressed="$(var.CompressMSI)" @@ -22,4 +27,42 @@ </MsiPackage> </PackageGroup> </Fragment> + + <?foreach ver in v6.0;v6.1;v6.2;v6.3 ?> + <?if "$(var.ver)" = "v6.0" ?> + <?define msuver=6.0 ?> + <?elseif "$(var.ver)" = "v6.1" ?> + <?define msuver=6.1 ?> + <?elseif "$(var.ver)" = "v6.2" ?> + <?define msuver=8-RT ?> + <?elseif "$(var.ver)" = "v6.3" ?> + <?define msuver=8.1 ?> + <?else ?> + <?error unknown version $(var.ver) ?> + <?endif ?> + + <Fragment> + <PackageGroup Id="crt_14.0_$(var.ver)"> + <MsuPackage Id="crt_14.0_$(var.ver)_x86" + KB="2999226" + SourceFile="!(bindpath.redist)\Windows$(var.msuver)-KB2999226-x86.msu" + DisplayName="!(loc.CRTDescription)" + Description="!(loc.CRTDescription)" + Compressed="$(var.CompressMSI)" + DownloadUrl="$(var.DownloadUrl)" + InstallCondition="not CRTInstalled and VersionNT = $(var.ver) and not VersionNT64 and (Include_core or Include_exe or Include_launcher or Include_pip)" /> + + <MsuPackage Id="crt_14.0_$(var.ver)_x64" + KB="2999226" + SourceFile="!(bindpath.redist)\Windows$(var.msuver)-KB2999226-x64.msu" + DisplayName="!(loc.CRTDescription)" + Description="!(loc.CRTDescription)" + Compressed="$(var.CompressMSI)" + DownloadUrl="$(var.DownloadUrl)" + InstallCondition="not CRTInstalled and VersionNT64 = $(var.ver) and (Include_core or Include_exe or Include_launcher or Include_pip)" /> + </PackageGroup> + </Fragment> + + <?undef msuver ?> + <?endforeach ?> </Wix>
\ No newline at end of file |