Hi

I've taken the CPack WiX generator for a spin and it covers most of our requirements, but I have a few suggestions for improvement:

1. Make it possible to specify a list of extra .wxs files to be included when building the installer.

2. Automatically generated IDs for <File />, <Directory /> and <Component /> tags, DIR_ID_1, FILE_ID_1, COMP_ID_1, are non-deterministic and that makes it impossible to reference those objects by ID from other parts of the WiX code, to execute an installed binary, add service config and firewall exceptions, for example.

So, instead compose the ID by concatenating the relative path from INSTALL_ROOT and the file name, using some valid delimiter, a combination which should always be unique within one installer.

A file and its component should simply share ID.

3. Move the main <Directory Id="TARGETDIR" Name="SourceDir" /> tag including the program files folder entry to the main.wxs file, leaving only INSTALL_ROOT and below in directories.wxs. That makes it easier to override the install location with a custom template. Selecting the correct ProgramFilesFolder/ProgramFiles64Folder should be handled by a new include variable and a new <?if ?> block.

Here are some excerpts to (hopefully) clarify my ideas:


cpack_variables.wxi:

<?define CPACK_WIX_ARCH="x86" ?>


WIX.template.in:

<?if $(var.CPACK_WIX_ARCH) = x86 ?>
  <?define Win64 = "no" ?>
  <?define SystemFolder = "SystemFolder" ?>
  <?define CAQuietExec = "CAQuietExec" ?>
  <?define ProgramFilesFolder = "ProgramFilesFolder" ?>
  <?define ExecSecureObjects = "ExecSecureObjects" ?>
<?else?>
  <?define Win64 = "yes" ?>
  <?define SystemFolder = "System64Folder" ?>
  <?define CAQuietExec = "CAQuietExec64" ?>
  <?define ProgramFilesFolder = "ProgramFiles64Folder" ?>
  <?define ExecSecureObjects = "ExecSecureObjects_64" ?>
<?endif?>


<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="$(var.ProgramFilesFolder)">
    <DirectoryRef Id="INSTALL_ROOT" />
  </Directory>
</Directory>



directories.wxs:

<Directory Id="INSTALL_ROOT" Name="MyProduct">
  <Directory Id="bin" Name="bin"/>
  <Directory Id="include" Name="include"/>
  <Directory Id="lib" Name="lib"/>
  <Directory Id="share" Name="share">
    <Directory Id="share.man" Name="man">
      <Directory Id="share.man.man3" Name="man3"/>
    </Directory>
  </Directory>
</Directory>




files.wxs:

<DirectoryRef Id="bin">
  <Component Id="bin.prog1.exe" Guid="*" Win64="$(var.Win64)">
    <File Id="bin.prog1.exe" Source="bin/prog1.exe" KeyPath="yes"/>
  </Component>
</DirectoryRef>
<DirectoryRef Id="include">
  <Component Id="include.lib1.h" Guid="*" Win64="$(var.Win64)">
    <File Id="include.lib1.h" Source="include/lib1.h" KeyPath="yes"/>
  </Component>
</DirectoryRef>
<DirectoryRef Id="lib">
  <Component Id="lib.lib1.lib" Guid="*" Win64="$(var.Win64)">
    <File Id="lib.lib1.lib" Source="lib/lib1.lib" KeyPath="yes"/>
  </Component>
</DirectoryRef>
<DirectoryRef Id="share.man.man3">
  <Component Id="share.man.man3.prog.3" Guid="*" Win64="$(var.Win64)">
<File Id="share.man.man3.prog.3" Source="share/man/man3/prog.3" KeyPath="yes"/>
  </Component>
</DirectoryRef>


--
Best regards,
Ådne Hovda

--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers

Reply via email to