Search code examples
pythondistutilsfhs

How to handle configuration files with distutils to respect unixen's FHS?


Suppose we have a program called foo.

If use absolute path:

setup(...,
      data_files=[...,
              ('/etc', ['foo.cfg'])]
)

Then foo$ python setup.py --prefix=/usr/local and we will have /etc/foo.cfg. But we should have /usr/local/etc/foo.cfg instead according to FHS.

What if we use a relative path?

setup(...,
      data_files=[...,
              ('etc', ['foo.cfg'])]
)

Then if we use the default install path, i.e. install to /usr, we will have /usr/etc/foo.cfg. Bad luck again.

So how to do it right?

P.S. To avoid make the problem more complicated, we assume that this program foo cannot run under non unix environment.


Solution

  • Sub-classing distutils.command.install.install is not strictly necessary. Instead, data_files could be passed to setup, as per distutils documentation on 'Installing Additional Files'.

    e.g.

    setup(
        ...
        data_files = [
            (conf_path, ['foo.cfg'])
        ]
    )
    

    where conf_path is calculated as per your own requirements. i.e. construct it by testing sys.prefix (instead of self.prefix), like @weakish did above.