Я участвую в программном проекте, который должен быть построен с использованием разных версий 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)
Обновление:
- : Мне бы хотелось использовать это, но оно не является надежным (так же, как set(Python_FIND_STRATEGY LOCATION) не является надежным): в системе, где -a python имеет 5 записей, CMake надежно игнорирует первую запись и вместо этого выбирает вторую.
Код: Выделить всё
find_program(Python3_EXECUTABLE python3)