Improves support for building unofficial versions of the Windows installer.
authorSteve Dower <steve.dower@microsoft.com>
Thu, 1 Oct 2015 22:18:53 +0000 (15:18 -0700)
committerSteve Dower <steve.dower@microsoft.com>
Thu, 1 Oct 2015 22:18:53 +0000 (15:18 -0700)
Tools/msi/buildrelease.bat
Tools/msi/bundle/bundle.targets
Tools/msi/bundle/bundle.wxs
Tools/msi/bundle/packagegroups/launcher.wxs
Tools/msi/bundle/packagegroups/packageinstall.wxs [new file with mode: 0644]
Tools/msi/bundle/packagegroups/pip.wxs [new file with mode: 0644]
Tools/msi/bundle/packagegroups/postinstall.wxs
Tools/msi/msi.props

index d22ba1013fbef552a1440039b90fa9eaaeb68dcd..ea251347150616c95c7738b766f69c226641b1af 100644 (file)
@@ -4,17 +4,28 @@
 rem This script is intended for building official releases of Python.\r
 rem To use it to build alternative releases, you should clone this file\r
 rem and modify the following three URIs.\r
-rem\r
-rem The first two will ensure that your release can be installed\r
-rem alongside an official Python release, while the second specifies\r
-rem the URL that will be used to download installation files. The\r
-rem files available from this URL *will* conflict with your installer.\r
-rem Trust me, you don't want them, even if it seems like a good idea.\r
 \r
-set RELEASE_URI_X86=http://www.python.org/win32\r
-set RELEASE_URI_X64=http://www.python.org/amd64\r
-set DOWNLOAD_URL_BASE=https://www.python.org/ftp/python\r
-set DOWNLOAD_URL=\r
+rem These two will ensure that your release can be installed\r
+rem alongside an official Python release, by modifying the GUIDs used\r
+rem for all components.\r
+rem\r
+rem The following substitutions will be applied to the release URI:\r
+rem     Variable        Description         Example\r
+rem     {arch}          architecture        amd64, win32\r
+set RELEASE_URI=http://www.python.org/{arch}\r
+\r
+rem This is the URL that will be used to download installation files.\r
+rem The files available from the default URL *will* conflict with your\r
+rem installer. Trust me, you don't want them, even if it seems like a\r
+rem good idea.\r
+rem\r
+rem The following substitutions will be applied to the download URL:\r
+rem     Variable        Description         Example\r
+rem     {version}       version number      3.5.0\r
+rem     {arch}          architecture        amd64, win32\r
+rem     {releasename}   release name        a1, b2, rc3 (or blank for final)\r
+rem     {msi}           MSI filename        core.msi\r
+set DOWNLOAD_URL=https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi}\r
 \r
 set D=%~dp0\r
 set PCBUILD=%D%..\..\PCBuild\\r
@@ -90,14 +101,12 @@ if "%1" EQU "x86" (
     set BUILD_PLAT=Win32\r
     set OUTDIR_PLAT=win32\r
     set OBJDIR_PLAT=x86\r
-    set RELEASE_URI=%RELEASE_URI_X86%\r
 ) ELSE (\r
     call "%PCBUILD%env.bat" x86_amd64\r
     set BUILD=%PCBUILD%amd64\\r
     set BUILD_PLAT=x64\r
     set OUTDIR_PLAT=amd64\r
     set OBJDIR_PLAT=x64\r
-    set RELEASE_URI=%RELEASE_URI_X64%\r
 )\r
 \r
 if exist "%BUILD%en-us" (\r
@@ -157,10 +166,16 @@ echo    -x64                Build x64 installers
 echo    --build (-b)        Incrementally build Python rather than rebuilding\r
 echo    --skip-build (-B)   Do not build Python (just do the installers)\r
 echo    --skip-doc (-D)     Do not build documentation\r
-echo    --download          Specify the full download URL for MSIs (should include {2})\r
+echo    --download          Specify the full download URL for MSIs\r
 echo    --test              Specify the test directory to run the installer tests\r
 echo    -h                  Display this help information\r
 echo.\r
 echo If no architecture is specified, all architectures will be built.\r
 echo If --test is not specified, the installer tests are not run.\r
-echo.
\ No newline at end of file
+echo.\r
+echo The following substitutions will be applied to the download URL:\r
+echo     Variable        Description         Example\r
+echo     {version}       version number      3.5.0\r
+echo     {arch}          architecture        amd64, win32\r
+echo     {releasename}   release name        a1, b2, rc3 (or blank for final)\r
+echo     {msi}           MSI filename        core.msi\r
index b77646bec46ed1d7adf8f2235208b3ee63b3fbee..9b7d09015fdd3ac25f0aa033fc32fcbefbdb46a2 100644 (file)
@@ -16,8 +16,9 @@
         <OutputPath>$(OutputPath)en-us\</OutputPath>
         <OutDir>$(OutputPath)</OutDir>
         
-        <DownloadUrl Condition="'$(DownloadUrl)' == '' and '$(DownloadUrlBase)' != ''">$(DownloadUrlBase.TrimEnd(`/`))/$(MajorVersionNumber).$(MinorVersionNumber).$(MicroVersionNumber)/$(ArchName)$(ReleaseLevelName)/</DownloadUrl>
-        <DefineConstants Condition="'$(DownloadUrl)' != ''">$(DefineConstants);DownloadUrl=$(DownloadUrl){2}</DefineConstants>
+        <!-- See Tools/msi/buildrelease.bat for help on configuring the download URL -->
+        <DownloadUrl Condition="'$(DownloadUrl)' == '' and '$(DownloadUrlBase)' != ''">$(DownloadUrlBase.TrimEnd(`/`))/{version}/{arch}{releasename}/{msi}</DownloadUrl>
+        <DefineConstants Condition="'$(DownloadUrl)' != ''">$(DefineConstants);DownloadUrl=$(DownloadUrl.Replace(`{version}`, `$(MajorVersionNumber).$(MinorVersionNumber).$(MicroVersionNumber)`).Replace(`{arch}`, `$(ArchName)`).Replace(`{releasename}`, `$(ReleaseName)`).Replace(`{msi}`, `{2}`))</DefineConstants>
         <DefineConstants Condition="'$(DownloadUrl)' == ''">$(DefineConstants);DownloadUrl={2}</DefineConstants>
     </PropertyGroup>
     
@@ -88,7 +89,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) /p:UseTestMarker=$(UseTestMarker)'
+        <Exec Command='msbuild ..\launcher\launcher.wixproj /p:Platform=x86 /p:ReleaseUri="$(ReleaseUri)" /p:OutputPath="$(BuildPath.TrimEnd(`\`))" /p:OutputSuffix=$(Platform) /p:BuildForRelease=$(BuildForRelease) /p:UseTestMarker=$(UseTestMarker)'
               ContinueOnError="false" />
     </Target>
     
index cc62c6210634a6ac94c7967a0dfd1daba3d1688a..5e343a25d71bb5656fe483207701827c642766ee 100644 (file)
@@ -85,6 +85,8 @@
       <PackageGroupRef Id="tools" />
       <PackageGroupRef Id="tcltk" />
       <PackageGroupRef Id="launcher" />
+      <PackageGroupRef Id="pip" />
+      <PackageGroupRef Id="packageinstall" />
       <PackageGroupRef Id="postinstall" />
     </Chain>
   </Bundle>
index 77c6ac5dde82dce72391bdd190e52b30795f211e..4b03fd29b625aeb5642e95fcd364f8645b5c2ccf 100644 (file)
@@ -9,6 +9,8 @@
                         DownloadUrl="$(var.DownloadUrl)"
                         ForcePerMachine="yes"
                         EnableFeatureSelection="yes"
+                        Permanent="yes"
+                        Visible="yes"
                         InstallCondition="(InstallAllUsers or InstallLauncherAllUsers) and Include_launcher" />
 
             <MsiPackage Id="launcher_JustForMe"
@@ -17,6 +19,8 @@
                         DownloadUrl="$(var.DownloadUrl)"
                         ForcePerMachine="no"
                         EnableFeatureSelection="yes"
+                        Permanent="yes"
+                        Visible="yes"
                         InstallCondition="not (InstallAllUsers or InstallLauncherAllUsers) and Include_launcher" />
         </PackageGroup>
     </Fragment>
diff --git a/Tools/msi/bundle/packagegroups/packageinstall.wxs b/Tools/msi/bundle/packagegroups/packageinstall.wxs
new file mode 100644 (file)
index 0000000..249d761
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+    <Fragment>
+        <PackageGroup Id="packageinstall">
+            <!--
+            This is an example of installing a package using pip as part of main install.
+            
+            For a network-only install, remove the Payload element and change the install
+            command to specify the package and (optionally) version specifier.
+            
+            <ExePackage Id="requests"
+                        SourceFile="py.exe"
+                        Compressed="yes"
+                        DisplayName="!(loc.CompileAllDescription)"
+                        InstallCommand='-$(var.ShortVersion)$(var.Suffix32) -m pip install requests-2.7.0-py2.py3-none-any.whl'
+                        UninstallCommand='-$(var.ShortVersion)$(var.Suffix32) -m pip uninstall -y requests'
+                        Vital="no"
+                        InstallCondition="Include_pip and not LauncherOnly">
+                <Payload SourceFile="requests-2.7.0-py2.py3-none-any.whl"
+                         Compressed="$(var.CompressMSI)"
+                         DownloadUrl="$(var.DownloadUrl)" />
+            </ExePackage>
+            -->
+        </PackageGroup>
+    </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/Tools/msi/bundle/packagegroups/pip.wxs b/Tools/msi/bundle/packagegroups/pip.wxs
new file mode 100644 (file)
index 0000000..201a6c4
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+    <Fragment>
+        <PackageGroup Id="pip">
+            <MsiPackage Id="pip_AllUsers"
+                        SourceFile="pip.msi"
+                        Compressed="$(var.CompressMSI)"
+                        DownloadUrl="$(var.DownloadUrl)"
+                        ForcePerMachine="yes"
+                        InstallCondition="InstallAllUsers and Include_pip and not LauncherOnly">
+                <MsiProperty Name="TARGETDIR" Value="[TargetDir]" />
+                <MsiProperty Name="OPTIONALFEATURESREGISTRYKEY" Value="[OptionalFeaturesRegistryKey]" />
+            </MsiPackage>
+            <MsiPackage Id="pip_JustForMe"
+                        SourceFile="pip.msi"
+                        Compressed="$(var.CompressMSI)"
+                        DownloadUrl="$(var.DownloadUrl)"
+                        ForcePerMachine="no"
+                        InstallCondition="not InstallAllUsers and Include_pip and not LauncherOnly">
+                <MsiProperty Name="TARGETDIR" Value="[TargetDir]" />
+                <MsiProperty Name="OPTIONALFEATURESREGISTRYKEY" Value="[OptionalFeaturesRegistryKey]" />
+            </MsiPackage>
+        </PackageGroup>
+    </Fragment>
+</Wix>
\ No newline at end of file
index b40c2a5a305ef40ba65fabd32065243c14e13281..90627b9a522351ccddd008cabdc1b4957a19a2fb 100644 (file)
@@ -2,25 +2,6 @@
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
     <Fragment>
         <PackageGroup Id="postinstall">
-            <MsiPackage Id="pip_AllUsers"
-                        SourceFile="pip.msi"
-                        Compressed="$(var.CompressMSI)"
-                        DownloadUrl="$(var.DownloadUrl)"
-                        ForcePerMachine="yes"
-                        InstallCondition="InstallAllUsers and Include_pip and not LauncherOnly">
-                <MsiProperty Name="TARGETDIR" Value="[TargetDir]" />
-                <MsiProperty Name="OPTIONALFEATURESREGISTRYKEY" Value="[OptionalFeaturesRegistryKey]" />
-            </MsiPackage>
-            <MsiPackage Id="pip_JustForMe"
-                        SourceFile="pip.msi"
-                        Compressed="$(var.CompressMSI)"
-                        DownloadUrl="$(var.DownloadUrl)"
-                        ForcePerMachine="no"
-                        InstallCondition="not InstallAllUsers and Include_pip and not LauncherOnly">
-                <MsiProperty Name="TARGETDIR" Value="[TargetDir]" />
-                <MsiProperty Name="OPTIONALFEATURESREGISTRYKEY" Value="[OptionalFeaturesRegistryKey]" />
-            </MsiPackage>
-            
             <MsiPackage Id="path_AllUsers"
                         SourceFile="path.msi"
                         Compressed="$(var.CompressMSI)"
index cc52c7ae5cade05fc7a9fabcc18309194c7c8b18..5b605e95e9220086cea1dc137b863c7cea32d290 100644 (file)
         <Configuration Condition="'$(Configuration)' == ''">Release</Configuration>
         <Platform Condition="'$(Platform)' == ''">x86</Platform>
         <InstallScope Condition="'$(InstallScope)' != 'perMachine'">perUser</InstallScope>
+    </PropertyGroup>
+
+    <Import Project="wix.props" />
+    <Import Project="..\..\PCBuild\tcltk.props" />
+
+    <PropertyGroup>
         <!--
         This URI is used to generate the various GUIDs used by the installer.
         Installers built with the same URI will upgrade each other or block
         that intend to bundle Python should rebuild these modules with their
         own URI to avoid conflicting with the official releases.
         
-        The official releases are built with http://www.python.org/.
+        The official releases use "http://www.python.org/$(ArchName)"
         
         This is not the same as the DownloadUrl property used in the bundle
         projects.
         -->
-        <ReleaseUri Condition="'$(ReleaseUri)' == ''">$(ComputerName)</ReleaseUri>
+        <ReleaseUri Condition="'$(ReleaseUri)' == ''">$(ComputerName)/$(ArchName)/</ReleaseUri>
         <ReleaseUri Condition="!$(ReleaseUri.EndsWith(`/`))">$(ReleaseUri)/</ReleaseUri>
     </PropertyGroup>
 
-    <Import Project="wix.props" />
-    <Import Project="..\..\PCBuild\tcltk.props" />
     
     <ItemGroup>
         <Compile Include="$(MSBuildThisFileDirectory)common.wxs" />
     <Target Name="_GenerateGuids" AfterTargets="PrepareForBuild">
         <PropertyGroup>
             <_Uuids>@(_Uuid->'("%(Identity)", "$(MajorVersionNumber).$(MinorVersionNumber)/%(Uri)")',',')</_Uuids>
-            <_GenerateCommand>import uuid; print('\n'.join('{}={}'.format(i, uuid.uuid5(uuid.UUID('c8d9733e-a70c-43ff-ab0c-e26456f11083'), '$(ReleaseUri)' + j)) for i,j in [$(_Uuids.Replace(`"`,`'`))]))</_GenerateCommand>
+            <_GenerateCommand>import uuid; print('\n'.join('{}={}'.format(i, uuid.uuid5(uuid.UUID('c8d9733e-a70c-43ff-ab0c-e26456f11083'), '$(ReleaseUri.Replace(`{arch}`, `$(ArchName)`))' + j)) for i,j in [$(_Uuids.Replace(`"`,`'`))]))</_GenerateCommand>
         </PropertyGroup>
         
         <Exec Command='"$(PythonExe)" -c "$(_GenerateCommand)" &gt; "$(IntermediateOutputPath)$(OutputName)guids.txt"'