Cleaning build directory in setup.py
Question:
How could I make my setup.py
pre-delete and post-delete the build directory?
Answers:
Does this answer it? IIRC, you’ll need to use the --all
flag to get rid of stuff outside of build/lib
:
python setup.py clean --all
For pre-deletion, just delete it with distutils.dir_util.remove_tree
before calling setup.
For post-delete, I assume you only want to post-delete after selected commands. Subclass the respective command, override its run method (to invoke remove_tree after calling the base run), and pass the new command into the cmdclass dictionary of setup.
Here’s an answer that combines the programmatic approach of Martin’s answer with the functionality of Matt’s answer (a clean
that takes care of all possible build areas):
from distutils.core import setup
from distutils.command.clean import clean
from distutils.command.install import install
class MyInstall(install):
# Calls the default run command, then deletes the build area
# (equivalent to "setup clean --all").
def run(self):
install.run(self)
c = clean(self.distribution)
c.all = True
c.finalize_options()
c.run()
if __name__ == '__main__':
setup(
name="myname",
...
cmdclass={'install': MyInstall}
)
This clears the build directory before to install
python setup.py clean --all install
But according to your requirements: This will do it before, and after
python setup.py clean --all install clean --all
How could I make my setup.py
pre-delete and post-delete the build directory?
Does this answer it? IIRC, you’ll need to use the --all
flag to get rid of stuff outside of build/lib
:
python setup.py clean --all
For pre-deletion, just delete it with distutils.dir_util.remove_tree
before calling setup.
For post-delete, I assume you only want to post-delete after selected commands. Subclass the respective command, override its run method (to invoke remove_tree after calling the base run), and pass the new command into the cmdclass dictionary of setup.
Here’s an answer that combines the programmatic approach of Martin’s answer with the functionality of Matt’s answer (a clean
that takes care of all possible build areas):
from distutils.core import setup
from distutils.command.clean import clean
from distutils.command.install import install
class MyInstall(install):
# Calls the default run command, then deletes the build area
# (equivalent to "setup clean --all").
def run(self):
install.run(self)
c = clean(self.distribution)
c.all = True
c.finalize_options()
c.run()
if __name__ == '__main__':
setup(
name="myname",
...
cmdclass={'install': MyInstall}
)
This clears the build directory before to install
python setup.py clean --all install
But according to your requirements: This will do it before, and after
python setup.py clean --all install clean --all