Поиск каталога сайтов сайтов python с помощью CMake

Я использую CMake для создания моего приложения. Как найти каталог каталога сайтов python? Мне нужен путь, чтобы скомпилировать расширение для python.

CMake должен найти путь на всех трех основных ОС, поскольку планирую развернуть мое приложение на Linux, Mac и Windows.

Я попытался использовать

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

однако это не работает.

Я также могу получить путь, запустив

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

в оболочке, но как я могу вызвать это из CMake?

РЕШЕНИЕ:

Спасибо, Алекс. Таким образом, команда, которая дает мне каталог сайта-пакета:

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)

Для удаления завершающей новой строки требуется команда OUTPUT_STRIP_TRAILING_WHITESPACE.

Ответы

Ответ 1

Вы можете выполнять внешние процессы в cmake с помощью execute_process (и при необходимости получать результат в переменную, как это было бы здесь).

Ответ 2

Немного обновленная версия, которую я использовал для lcm:

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)

Это устанавливает PYTHON_SITE в соответствующий префикс-относительный путь, подходящий для использования следующим образом:

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

(Пожалуйста, не устанавливайте абсолютный путь! Выполняем обход CMAKE_INSTALL_PREFIX.)

Ответ 3

Я предлагаю использовать get_python_lib(True), если вы создаете это расширение как динамическую библиотеку. Этот первый параметр должен быть правдой, если вам требуется конкретное местоположение на платформе (в 64-битных Linux-машинах это может быть /usr/lib64 вместо /usr/lib)