Проблема с созданием пакета C с помощью cmake: с использованием Python .dylib, использование 2.7, а не 3.8, OS X

#c #python-3.x #macos #python-2.7 #cmake

#c #python-3.x #macos #python-2.7 #cmake

Вопрос:

Я пытаюсь создать «Плагин» C , который является частью «Orthanc» (проект с открытым исходным кодом). Я делал это как в UBUNTU, так и в OS X, но у меня возникли проблемы с использованием версии Python, отличной от установленной в системе версии (High Sierra, Python 2.7) в OS X. Я попытался установить Python 3.8, используя пакет OS X с веб-сайта Python, а также используя HomeBrew. Я не очень хорошо знаком с компиляцией OS X, но немного лучше разбираюсь в UNIX.

В CMakeLists.txt файл довольно длинный, но соответствующие части, вероятно,:

 if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  # The Python version cannot be controlled on OS X (yet)
  set(PYTHON_VERSION "3.6" CACHE STRING "Version of Python to be used")
endif()
  

 if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  find_package(PythonLibs)
  if (NOT PYTHONLIBS_FOUND)
    message(FATAL_ERROR "Cannot find the Python libraries")
  endif()

  message("Python library - Found version: ${PYTHONLIBS_VERSION_STRING}")
  message("Python library - Path to include directory: ${PYTHON_INCLUDE_DIRS}")
  message("Python library - Shared library: ${PYTHON_LIBRARIES}")
  

В фактической сборке есть несколько строк вывода о Python. CLI для сборки — это:

 cmake -DPYTHON_VERSION=3.8 -DSTATIC_BUILD=ON -DCMAKE_BUILD_TYPE=Release ../
  

хотя я пробовал разные варианты для версии 3.8, но по умолчанию всегда возвращается значение 2.7.

 -- Found PythonInterp: /usr/bin/python (found version "2.7.16") 
  

 -- Found PythonLibs: /usr/lib/libpython2.7.dylib (found version "2.7.16") 
Python library - Found version: 2.7.16
Python library - Path to include directory: /usr/include/python2.7
Python library - Shared library: /usr/lib/libpython2.7.dylib
-- Configuring done
CMake Warning (dev):
  Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
  --help-policy CMP0042" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  MACOSX_RPATH is not specified for the following targets:
  

Мой файл .bash_profile, вероятно, испорчен, но это самая последняя версия. Я установил как версию 3.8 с помощью brew, так и версию из .pkg на веб-сайте Python.

 source ~/.profile
export NVM_DIR="/Users/sscotti/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] amp;amp; . "$NVM_DIR/nvm.sh"  # This loads nvm

export PATH="/usr/local/bin:$PATH"
export PATH="/usr/local/sbin:$PATH"

# The version installed with HomeBrew
# export PATH="/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/Cellar/python@3.8/3.8.5/bin:$PATH"

# The version installed with OS X installer
# Setting PATH for Python 3.8
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"

 ##
 # Homebrew bash completion
 ##
 if [ -f $(brew --prefix)/etc/bash_completion ]; then
   source $(brew --prefix)/etc/bash_completion
 fi
  

Кажется, что, возможно:

 find_package(PythonLibs)
  

не удается найти мою другую версию Python?

Любые предложения приветствуются.

Только начинаю с Python, и это немного сбивает с толку, как настроить пару разных версий Python для целей разработки. Я не знаю, включены ли в версию Python brew или .pkg «пакеты разработки».

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

1. Документация для модуля FindPythonLibs не описывает PYTHON_VERSION переменную как возможный способ повлиять на поиск. Если вы хотите выбрать конкретную установку Python, установите соответствующие переменные PYTHON_LIBRARY и PYTHON_INCLUDE_DIR . Кроме того, в документации говорится, что FindPythonLibs модуль устарел в пользу FindPython и некоторых других модулей.

Ответ №1:

Просто продолжение моего вопроса. Я обнаружил, что если я явно определил эти пути для -DPYTHON_LIBRARY= и -DPYTHON_INCLUDE_DIR в cmake, то он отлично компилируется, и я могу использовать различные версии Python в OS X, если захочу. Я бы предположил, что есть другой, более элегантный способ, но это работает довольно хорошо.

 cmake -DPYTHON_LIBRARY=/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/libpython3.8.dylib -DPYTHON_INCLUDE_DIR=/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/include/python3.8/ -DPYTHON_VERSION=3.8 -DSTATIC_BUILD=ON -DCMAKE_BUILD_TYPE=Release ../