Search code examples
pythondistutils

Custom distribution option in setup.py


How to pass custom key-value pairs in setup() parameters? I need them for a custom build_scripts step.

from distutils.core import setup

from somescripts import build_scripts

setup(name='somescripts',
      version=__version__,
      cmdclass= {
                 'build_scripts': build_scripts,
                 },
      custom_pairs={
          'compile_modules': True,
          'use_scons': True,
          'modules': [f for f in glob('scripts/[!_]*.spy')],
      },
)

This gives "UserWarning: Unknown distribution option" in setup.py install (which turns into error with --strict)

c:\python27\Lib\distutils\dist.py:267: UserWarning: Unknown distribution
 option: 'custom_pairs'
warnings.warn(msg)

UPDATE:

  • distutils doesn't call build_scripts at all if scripts kwarg is empty

Solution

  • Found the way myself.

    from distutils.command.build_scripts import build_scripts as base
    from distutils.core import setup
    
    # patch distutils so that it won't skip "build_scripts"
    # step if `scripts` list is empty
    from distutils.dist import Distribution
    def custom_has_scripts(self):
        return True
    Distribution.has_scripts = custom_has_scripts
    
    class build_scripts(base):
        def initialize_options(self):
            self.compile_modules = None
            self.use_scons = None
            self.modules = None
        def run(self):
            for module in self.modules:
                # generate scripts
                pass
    
    setup(name='somescripts',
          version=__version__,
          cmdclass= {
                     'build_scripts': build_scripts,
                     },
          options={
              'build_scripts':{
                  'compile_modules': True,
                  'use_scons': True,
                  'modules': [f for f in glob('scripts/[!_]*.spy')],
              },
          },
    )