Browse Source

Utilities/Release/WiX: Save PATH modification preference persistently

Our Windows installer provides an interactive dialog to choose whether
the PATH should be modified.  It may also be specified on the `msiexec`
command-line as an `ADD_CMAKE_TO_PATH={0,1}` property.  Save the choice
persistently in the Windows Registry and use the same choice by default
in future installations.

Issue: #21465
Brad King 1 year ago
parent
commit
32388821e2

+ 6 - 0
Help/release/dev/rel-win-PATH.rst

@@ -0,0 +1,6 @@
+rel-win-PATH
+------------
+
+* The precompiled Windows ``.msi`` installers provided on
+  `cmake.org <https://cmake.org/download/>`_, when replacing an existing
+  installation, now preserve the ``PATH`` modification preference by default.

+ 1 - 0
Utilities/Release/WiX/WIX.template.in

@@ -46,6 +46,7 @@
 
         <FeatureRef Id="ProductFeature">
             <ComponentRef Id="CMakeRegistry_InstallDir" />
+            <ComponentRef Id="CMakeRegistry_InstallInPATH" />
         </FeatureRef>
 
         <UIRef Id="$(var.CPACK_WIX_UI_REF)" />

+ 19 - 1
Utilities/Release/WiX/options.wxs

@@ -6,13 +6,31 @@
         <!-- Always initialize the checkbox value so it cannot be directly overridden from the command line.  -->
         <SetProperty Action="Set_CMAKE_IN_PATH_Init"       Id="CMAKE_IN_PATH" After="AppSearch"                    Sequence="first" Value="{}" />
 
+        <!-- Read the "CMAKE_IN_PATH" checkbox value from the registry, if it was stored previously.
+             Properties using RegistrySearch cannot be private, so use a private-looking public name. -->
+        <Property Id="_CMAKE_IN_PATH_REG">
+            <RegistrySearch Id="CMAKE_IN_PATH_RegistrySearch_HKLM" Root="HKLM" Key="Software\Kitware\CMake" Name="InstallInPATH" Type="raw" />
+        </Property>
+
+        <!-- Override the default "CMAKE_IN_PATH" checkbox with a value read from the registry, if any.  -->
+        <SetProperty Action="Set_CMAKE_IN_PATH_REG_0"      Id="CMAKE_IN_PATH" After="Set_CMAKE_IN_PATH_Init"       Sequence="first" Value="{}"> _CMAKE_IN_PATH_REG = "#0"                    </SetProperty>
+        <SetProperty Action="Set_CMAKE_IN_PATH_REG_1"      Id="CMAKE_IN_PATH" After="Set_CMAKE_IN_PATH_REG_0"      Sequence="first" Value="1">  _CMAKE_IN_PATH_REG = "#1"                    </SetProperty>
+
         <!-- Override the default "CMAKE_IN_PATH" checkbox with a value specified on the command line, if any.  -->
-        <SetProperty Action="Set_CMAKE_IN_PATH_CMD_0"      Id="CMAKE_IN_PATH" After="Set_CMAKE_IN_PATH_Init"       Sequence="first" Value="{}">  ADD_CMAKE_TO_PATH = "0"                     </SetProperty>
+        <SetProperty Action="Set_CMAKE_IN_PATH_CMD_0"      Id="CMAKE_IN_PATH" After="Set_CMAKE_IN_PATH_REG_1"      Sequence="first" Value="{}">  ADD_CMAKE_TO_PATH = "0"                     </SetProperty>
         <SetProperty Action="Set_CMAKE_IN_PATH_CMD_1"      Id="CMAKE_IN_PATH" After="Set_CMAKE_IN_PATH_CMD_0"      Sequence="first" Value="1">   ADD_CMAKE_TO_PATH = "1"                     </SetProperty>
         <!-- Support legacy values too.  -->
         <SetProperty Action="Set_CMAKE_IN_PATH_CMD_None"   Id="CMAKE_IN_PATH" After="Set_CMAKE_IN_PATH_CMD_1"      Sequence="first" Value="{}">  ADD_CMAKE_TO_PATH = "None"                  </SetProperty>
         <SetProperty Action="Set_CMAKE_IN_PATH_CMD_System" Id="CMAKE_IN_PATH" After="Set_CMAKE_IN_PATH_CMD_None"   Sequence="first" Value="1">   ADD_CMAKE_TO_PATH = "System" AND ALLUSERS   </SetProperty>
         <!-- Per-user installation is not implemented, but reserve the old value for future use.  -->
         <SetProperty Action="Set_CMAKE_IN_PATH_CMD_User"   Id="CMAKE_IN_PATH" After="Set_CMAKE_IN_PATH_CMD_System" Sequence="first" Value="1">   ADD_CMAKE_TO_PATH = "User" AND NOT ALLUSERS </SetProperty>
+
+        <DirectoryRef Id="TARGETDIR">
+            <!-- Save the "CMAKE_IN_PATH" checkbox value persistently in the registry.  -->
+            <Component Id="CMakeRegistry_InstallInPATH">
+                <!-- Use a leading "0" so the value parses as an integer even when the property is unset.  -->
+                <RegistryValue Root="HKLM" Key="Software\Kitware\CMake" Name="InstallInPATH" Type="integer" Value="0[CMAKE_IN_PATH]" />
+            </Component>
+        </DirectoryRef>
     </Fragment>
 </Wix>