Позвольте CMake использовать Python по умолчанию для вашего $PATH.Python

Программы на Python
Anonymous
Позвольте CMake использовать Python по умолчанию для вашего $PATH.

Сообщение Anonymous »

tl;dr: Как настроить локатор Python cmake, чтобы он использовал первый python3 в $PATH?

Я участвую в программном проекте, который должен быть построен с использованием разных версий cmake из разных источников (пакеты из различных стабильных или современных дистрибутивов Linux, Spack, самокомпилированные и т. д.).
Обязательным условием я считаю расположение Python как решаемую проблему: бинарник помещается в $PATH (этот шаг вообще не под моим контролем). Это прекрасно работает для интерактивного использования или написания сценариев.
Однако не для cmake. Некоторые версии будут настаивать на выборе версии Python, которая (как кажется) присутствовала во время их собственной сборки.
Мне нужен наименее разумный способ найти Python в cmake: взять эквивалент python3 и использовать его в качестве исполняемого файла Python.
Но я не нашел официального способа убедить find_package(Python3) принять это. На некоторых платформах set(Python_FIND_STRATEGY LOCATION) некоторое время работал, но после обновления системы мне пришлось переключиться на set(Python_FIND_STRATEGY VERSION). Должен ли я добавлять уродливый, устаревший код, зависящий от платформы, и в то же время Я уже точно знаю, где находится двоичный файл?
Следовательно, это временный обходной путь, который я сейчас оцениваю:

Код: Выделить всё

execute_process(COMMAND which python3
OUTPUT_VARIABLE Python3_EXECUTABLE
OUTPUT_STRIP_TRAILING_WHITESPACE
)
find_package(Python3 COMPONENTS Interpreter REQUIRED)
Это «Просто посмотрите на $PATH и ведите себя так же, как ваша оболочка», но мне кажется, что это излишне громоздко и хрупко. Я предвижу увеличение проблем с долгосрочным обслуживанием. Какую часть документации я пропустил, где объясняется повторное использование среды? Или приведенное выше решение настолько элегантно, насколько это возможно в CMake?

Обновление:
  • Код: Выделить всё

    find_program(Python3_EXECUTABLE python3)
    : Мне бы хотелось использовать это, но оно не является надежным (так же, как set(Python_FIND_STRATEGY LOCATION) не является надежным): в системе, где -a python имеет 5 записей, CMake надежно игнорирует первую запись и вместо этого выбирает вторую.

Вернуться в «Python»