I am using distutils to create an rpm from my project. I have this directory tree:
project/
my_module/
data/file.dat
my
The problem is that build_py
(which copies python sources to the build directory) comes before build_ext
, which runs SWIG.
You can easily subclass the build command and swap around the order, so build_ext
produces module1.py
before build_py
tries to copy it.
from distutils.command.build import build
class CustomBuild(build):
sub_commands = [
('build_ext', build.has_ext_modules),
('build_py', build.has_pure_modules),
('build_clib', build.has_c_libraries),
('build_scripts', build.has_scripts),
]
module1 = Extension('_module1', etc...)
setup(
cmdclass={'build': CustomBuild},
py_modules=['module1'],
ext_modules=[module1]
)
However, there is one problem with this: If you are using setuptools, rather than just plain distutils, running python setup.py install
won't run the custom build command. This is because the setuptools install command doesn't actually run the build command first, it runs egg_info, then install_lib, which runs build_py then build_ext directly.
So possibly a better solution is to subclass both the build and install command, and ensure build_ext gets run at the start of both.
from distutils.command.build import build
from setuptools.command.install import install
class CustomBuild(build):
def run(self):
self.run_command('build_ext')
build.run(self)
class CustomInstall(install):
def run(self):
self.run_command('build_ext')
self.do_egg_install()
setup(
cmdclass={'build': CustomBuild, 'install': CustomInstall},
py_modules=['module1'],
ext_modules=[module1]
)
It doesn't look like you need to worry about build_ext getting run twice.