Найдите интерпретатор и компоненты разработки специально созданного Python с помощью CMake

#python #cmake

Вопрос:

Я создал несколько более ранних версий Python (например, 3.6) в соответствии со стандартными предписаниями и установил их, скажем, в пользовательском каталоге /path/to/py3.6.15 .

Я пытаюсь найти компоненты Interpreter и Development компоненты через CMake find_package (см. Документы) под Linux.

В качестве примера предположим следующую структуру каталогов специально созданного Python

 py3.6.15
├─ bin
├─ include
│  └─ python3.6m
├─ lib
│  └─ python3.6
└─ share
 

где bin папка содержит исполняемые файлы Python, include/python3.6m файлы заголовков, lib общие библиотеки, lib/python3.6 стандартную библиотеку Python и share документацию.

Команда CMake является

 find_package(Python3 3.6 EXACT COMPONENTS Interpreter Development PATHS "/path/to/py3.6.15" NO_DEFAULT_PATH)
 

Однако CMake не удается найти платформу Python; подробное сообщение об ошибке (с --debug-find переключателем)

 Paths specified by the find_package HINTS option.

  none

Paths specified by the find_package PATHS option.

  /path/to/py3.6.15

find_package considered the following locations for the Config module:

  /path/to/py3.6.15/Python3Config.cmake
  /path/to/py3.6.15/python3-config.cmake
  /path/to/py3.6.15/lib/python3.6/Python3Config.cmake
  /path/to/py3.6.15/lib/python3.6/python3-config.cmake

The file was not found.
 

Установка подсказки Python3_ROOT_DIR (как указано в документации) не помогает. Добавление Python3Config.cmake модуля в py3.6.15 папку, в которой указаны артефакты, также не помогает (см. Соответствующие документы); т. Е. Отображается то же сообщение об ошибке. Пример моего Python3Config.cmake :

 set(Python3_EXECUTABLE    ${CMAKE_CURRENT_LIST_DIR}/bin/python3)
set(Python3_INCLUDE_DIRS  ${CMAKE_CURRENT_LIST_DIR}/include/python3.6m)
set(Python3_LIBRARY_DIRS  ${CMAKE_CURRENT_LIST_DIR}/lib)
set(Python3_LIBRARIES     ${CMAKE_CURRENT_LIST_DIR}/lib/libpython3.6m.so)
 

ПРИМЕЧАНИЕ: Я использую CMake v3.20.2 в Debian 11. Пользовательская папка Python ( /path/to/py3.6.15 ) не добавляется в путь по очевидным причинам.

Я хотел бы знать, есть ли какое-то правильное решение этой проблемы без жесткого кодирования путей пользовательских двоичных файлов/библиотек Python в сценариях CMake.

Комментарии:

1. В PATH опции укажите абсолютный путь к каталогу, содержащему Python3Config.cmake файл. Вы можете использовать выражение ${CMAKE_CURRENT_SOURCE_DIR} для ссылки на текущий исходный каталог (где CMakeLists.txt находится).

2. @Tsyvarev : Я исправил свой вопрос, чтобы избежать недопонимания. Я всегда указываю абсолютный путь к платформе Python.

3. Итак, соответствует ли фактический путь к вам Python3Config.cmake одному из путей, перечисленных в --debug-find выходных данных? Обратите внимание, что для удовлетворения запроса на версию ( 3.6 в вашем случае) вам также необходимо предоставить скрипт Python3ConfigVersion.cmake рядом с Python3Config.cmake ним. Об ожидаемом поведении этого сценария см. Документацию .

4. Фактический путь к Python3Config.cmake нему совпадает с одним из путей, перечисленных в --debug-find выводе. Второй момент важен; я тоже должен это проверить.