On 6/17/21 1:53 AM, Joachim Wuttke wrote:
How to write a platform-independent CMake install command
to install a Swig-generated Python module?

The following brings us very close to a solution:
```
execute_process(
     COMMAND "${Python3_EXECUTABLE}"
     -c "from distutils import sysconfig as sc;
         print(sc.get_python_lib(prefix='', plat_specific=True))"
     OUTPUT_VARIABLE PYTHON_SITE
     OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Python module libcerf will be installed to ${PYTHON_SITE}")

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/<our_module>.py
         DESTINATION ${PYTHON_SITE})
```

So far, we only tested under Debain, where the problem arises:

- distutils.sysconfig.get_python_lib(...) returns lib/python3/dist-packages
- CMake provides CMAKE_INSTALL_PREFIX=/usr/local/
- So installation goes to /usr/local/lib/python3/dist-packages
- sys.path, however, does not contain /usr/local/lib/python3/dist-packages.

sys.path contains /usr/local/lib/python3.9/dist-packages, and also
/usr/lib/python3/dist-packages, so this is slightly incoherent.
Anyway, we won't want to change sys.path. So we need to change
the above CMake/Python code to return a local installation directory
that is part of sys.path.

Thanks for any hints - Joachim

dist-packages is Debian-family-specific anyway, other Linux distros don't use it - and some have some interesting conventions - if you're using Swig to build a binary extension module, it needs to go in a lib-dynload directory on Fedora.

You should look at the Python sysconfig module in preference to using the one from distutils.

You probably need to say more about what the target is - are you attempting to install as part of the process building a distro package, or are you expecting to install directly?
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to