CMake find_package для Python3 не работает при нахождении Python 2 - PullRequest
1 голос
/ 10 июля 2020

При переходе на CMake 3.17.3 (с 3.13.3) мы наткнулись на проблему с Python. В root CMakeLists.txt теперь у нас есть:

find_package(Python3 REQUIRED COMPONENTS Interpreter)

Однако это не работает со следующим:

CMake Error at /home/abadura/cmake/cmake-3.17.3-Linux-x86_64/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
  Could NOT find Python3 (missing: Python3_EXECUTABLE Interpreter)

      Reason given by package: 
          Interpreter: Wrong major version for the interpreter "/build/ltesdkroot/Platforms/LINUX/MB_PS_LFS_REL_2020_07_0068/sdk/bld-tools/x86_64-pc-linux-gnu/bin/python"

Call Stack (most recent call first):
  /home/abadura/cmake/cmake-3.17.3-Linux-x86_64/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:445 (_FPHSA_FAILURE_MESSAGE)
  /home/abadura/cmake/cmake-3.17.3-Linux-x86_64/share/cmake-3.17/Modules/FindPython/Support.cmake:2437 (find_package_handle_standard_args)
  /home/abadura/cmake/cmake-3.17.3-Linux-x86_64/share/cmake-3.17/Modules/FindPython3.cmake:309 (include)
  CMakeLists.txt:20 (find_package)

, в то время как Python найдено (/build/ltesdkroot/Platforms/LINUX/MB_PS_LFS_REL_2020_07_0068/sdk/bld-tools/x86_64-pc-linux-gnu/bin/python) сообщает версия Python 2.7.15+.

Поиск и эксперименты обнаружил, что добавление:

set(Python3_FIND_STRATEGY VERSION)

перед find_package помогает. С этим добавленным Python найдено:

-- Found Python3: /opt/python/x86_64/3.6.0/bin-wrapped/python3.6 (found version "3.6.0") found components: Interpreter 

Теперь проблема в том, что Find Python3 документация утверждает следующее:

Python3_FIND_STRATEGY

Эта переменная определяет, как будет выполняться поиск. Для переменной Python3_FIND_STRATEGY можно задать одно из следующих значений:

  • VERSION: попробуйте найти самую последнюю версию во всех указанных местах. Это значение по умолчанию, если политика CMP0094 не определена или имеет значение OLD.
  • LOCATION: поиск прекращается, как только обнаруживается версия, удовлетворяющая ограничениям версии. Это значение по умолчанию, если для политики CMP0094 установлено значение NEW.

Итак, LOCATION должен работать нормально, исходя из моего понимания описания. Он должен игнорировать /build/ltesdkroot/Platforms/LINUX/MB_PS_LFS_REL_2020_07_0068/sdk/bld-tools/x86_64-pc-linux-gnu/bin/python, поскольку он не удовлетворяет ограничениям версии (это Python 2, а не Python 3) и должен продолжать поиск /opt/python/x86_64/3.6.0/bin-wrapped/python3.6, который удовлетворяет ограничениям. (Для полноты картины я попытался добавить явную версию 3.6 в find_package, и это ничего не изменило.)

Другой вопрос, следует ли мне устанавливать Python3_FIND_STRATEGY или использовать CMP0094 прямо. В документации CMP0094 есть несколько пугающее предупреждение:

Примечание. Поведение политики OLD устарело по определению и может быть удалено в будущем. версия CMake.

Итак, я не уверен, какой подход (установка Python3_FIND_STRATEGY или активация OLD для CMP0094 ) является желаемым (стабильным) подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...