I have successfully built a Python package that uses CMake combined with pybind11 to create a shared object (.so
- assuming only Linux usage at the moment) file. The implementation works but I am unable to remove this shared object file using pip uninstall .
My setup
command in setup.py
file looks like this taken from the pybind/cmake_example repository:
setup(
name='package',
version='0.0.1',
author='-',
author_email='-',
description='A test project using pybind11 and CMake',
long_description='',
ext_modules=[CMakeExtension('packagebindings')],
cmdclass=dict(build_ext=CMakeBuild),
zip_safe=False,
packages=setuptools.find_packages()
)
My CMakeLists.txt
file has an install
instruction that looks like this:
install(TARGETS packagebindings COMPONENT python LIBRARY DESTINATION ${Python_SITELIB})
To summarise, here are the files that are created when running pip install .
:
path/to/site-packages/package/*
- removed bypip uninstall package
path/to/site-packages/package-0.0.1.dist-info/*
- removed bypip uninstall package
path/to/site-packages/packagebindings.cpython-37m-x86_64-linux-gnu.so
- still present afterpip uninstall package
I would like to know how make it so that running pip uninstall .
removes the .so
file.
If a further MRE is required, I can link to a repository.
Your CMake install target seems to place the .so directly into the python installation directory (
DESTINATION ${Python_SITE_LIB}
). I'm guessing this stops the .so from being registered by Python proper, so it is not removed when uninstalling. I would suggest to make CMake place the .so in a distribution directory, and then add the following option tosetup()
:This will let the .so be tracked by the Python package manager. The first string is a directory relative to the installation prefix. The second string is the .so file in your distribution, relative to the setup.py script.