Your search query "linkto%253A%2522Distutils%252FCookbook%252FWininstFilename%2522" didn't return any results. Please change some terms and refer to HelpOnSearching for more information.
(!) Consider performing a full-text search with your search terms.

Clear message

Problem

Windows binary installers often have dependencies on other binary libraries which one would like to include in the filename for the installer such as PyOpenGL-2.0.1-Numpy23.exe

Solution

Subclass bdist_wininst to introduce a customisation point for acquiring the filename.

import sys, os, string, struct
from distutils.command.bdist_wininst import bdist_wininst

class BdistWinInstaller(bdist_wininst):
    """Version of bdist_wininst with customization point for filename

    This class should operate identically to the built-in
    class, it exists solely to provide the customization point.
    """
    def get_installer_filename(self, directory, fullname, target_version= None):
        """Calculate the final installer filename"""
        if target_version:
            return os.path.join(
                directory,
                "%s.win32-py%s.exe" % (
                    fullname,
                    target_version
                )
            )
        else:
            return os.path.join(
                directory,
                "%s.win32.exe" % fullname
            )
    def create_exe (self, arcname, fullname, bitmap=None):
        """Do the actual creation of the executable file

        The base command, unfortunately, does not break down
        this command into sub-commands, so this method is
        almost entirely a duplication of the base-class method,
        with the only noticeable difference being the
        call to get_installer_filename(...) instead of
        calculating the filename inline.
        """
        import struct

        self.mkpath(self.dist_dir)

        cfgdata = self.get_inidata()
        installer_name = self.get_installer_filename(
            self.dist_dir,
            fullname,
            self.target_version,
        )
        self.announce("creating %s" % installer_name)

        if bitmap:
            bitmapdata = open(bitmap, "rb").read()
            bitmaplen = len(bitmapdata)
        else:
            bitmaplen = 0

        file = open(installer_name, "wb")
        file.write(self.get_exe_bytes())
        if bitmap:
            file.write(bitmapdata)

        file.write(cfgdata)
        header = struct.pack("<iii",
                             0x1234567A,       # tag
                             len(cfgdata),     # length
                             bitmaplen,        # number of bytes in bitmap
                             )
        file.write(header)
        file.write(open(arcname, "rb").read())

Discussion

This might be better introduced as part of the core rather than as a seperate recipe, as the customisation point doesn't alter the base operation, just provides a hook for the customisation.


CategoryDistutilsCookbook

Unable to edit the page? See the FrontPage for instructions.