Encontrar el directorio de paquetes de sitios de Python con CMake

Yo uso CMake para construir mi aplicación. ¿Cómo puedo encontrar dónde se encuentra el directorio de paquetes de sitios de python? Necesito la ruta para comstackr una extensión a Python.

CMake tiene que poder encontrar la ruta en los tres principales sistemas operativos, ya que planeo implementar mi aplicación en Linux, Mac y Windows.

Traté de usar

include(FindPythonLibs) find_path( PYTHON_SITE_PACKAGES site-packages ${PYTHON_INCLUDE_PATH}/.. ) 

Sin embargo eso no funciona.

También puedo obtener el camino ejecutando

 python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" 

en la shell, pero ¿cómo podría invocar eso desde CMake?

SOLUCIÓN:

Gracias, Alex. Así que el comando que me da el directorio de paquete de sitio es:

 execute_process ( COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE) 

El comando OUTPUT_STRIP_TRAILING_WHITESPACE es necesario para eliminar la nueva línea final.

Puede ejecutar procesos externos en cmake con execute_process (y obtener la salida en una variable si es necesario, como estaría aquí).

Versión ligeramente actualizada que usé para mcm :

 execute_process( COMMAND "${PYTHON_EXECUTABLE}" -c "if True: from distutils import sysconfig as sc print(sc.get_python_lib(prefix='', plat_specific=True))" OUTPUT_VARIABLE PYTHON_SITE OUTPUT_STRIP_TRAILING_WHITESPACE) 

Esto establece a PYTHON_SITE en la ruta relativa al prefijo correspondiente, adecuado para su uso como:

 install( FILES ${mypackage_python_files} DESTINATION ${PYTHON_SITE}/mypackage) 

(Por favor, no instale en una ruta absoluta. Al hacerlo, se pasa por alto CMAKE_INSTALL_PREFIX ).

Sugiero usar get_python_lib(True) si está haciendo esta extensión como una biblioteca dinámica. Este primer parámetro debería ser verdadero si necesita la ubicación específica de la plataforma (en máquinas Linux de 64 bits, podría ser /usr/lib64 lugar de /usr/lib )

Desde CMake 3.12 puede usar el módulo FindPython que llena las variables Python_SITELIB y Python_SITEARCH para bibliotecas independientes y específicas de architecture, respectivamente.

Ejemplo:

 find_package(Python ${PYTHON_VERSION} REQUIRED COMPONENTS Development) Python_add_library(foo MODULE src/foo.cc src/python_interface.cc ) install(TARGETS foo DESTINATION ${Python_SITEARCH}/foo)