首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake使用国产公式安装pybind11绑定

CMake使用国产公式安装pybind11绑定
EN

Stack Overflow用户
提问于 2021-03-05 17:42:11
回答 2查看 194关注 0票数 1

我想为一个CMake项目提供一个自制公式,该项目构建并安装一个C++库及其使用pybind11编写的Python绑定。理想情况下,这个公式应该通过运行一个平面来工作。

代码语言:javascript
复制
cmake --build . --target install

这个安装流程在本地运行良好,但是使用Homebrew公式在Python绑定的安装目录中引入了一个问题:当头和库安装在由#{前缀}标识的C业力的适当目录中时,绑定必须位于Python可见的站点包目录中。我在CMake中获得这样的目录

代码语言:javascript
复制
install(TARGETS pyariadne DESTINATION ${Python_SITEARCH})

但是这个目录似乎不能用Homebrew写,因为它返回一个Operation not permitted。通过以下方法标识安装目录

代码语言:javascript
复制
execute_process(COMMAND python3 -m site --user-site OUTPUT_VARIABLE INSTALL_DIR)

也不起作用,因为Homebrew标识了/tmp中的临时用户站点,因此安装在那里的任何库随后都会被删除。

我应该如何安装从Homebrew到目录的所有东西,而不需要改变目录的权限呢?我想避免对pypi进行打包,并使用pip分别安装绑定。

编辑(输出示例,涉及目录):

代码语言:javascript
复制
[109/110] Install the project...
-- Install configuration: "Release"
-- Installing: 

/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pyariadne.so
CMake Error at cmake_install.cmake:49 (file):
  file INSTALL cannot copy file
  "/tmp/ariadne-20210305-1763-ggejxl/ariadne-2.1-rc2/build/pyariadne.so" to
  
"/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pyariadne.so":
  Operation not permitted.

目录/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages链接到/usr/local/lib/python3.9/site-packages。前者有用户lgeretti:staff,后者有用户lgeretti:admin。

这个问题不仅发生在我的机器上,而且我还在macos:最新的GitHub操作机器上验证它,这里唯一需要的步骤是brew安装软件包。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-06 18:34:32

这是Luca的好解决方案的更好的CMake实现。应该直接通过缓存变量引入包自定义点,而不是特定于packager的标志.这是标准GNUInstallDirs模块采用的方法。见下文:

代码语言:javascript
复制
find_package(Python)

set(MyProj_INSTALL_PYTHONDIR "${Python_SITEARCH}"
    CACHE STRING "Install destination for Python targets")
install(TARGETS pyariadne DESTINATION "${MyProj_INSTALL_PYTHONDIR}")

MyProj_INSTALL_PYTHONDIR的默认值是Python_SITEARCH,但可以在包脚本中重写它:

代码语言:javascript
复制
def install
  mkdir "build" do
    system "cmake -G \"Ninja\" .. -DCMAKE_BUILD_TYPE=Release " \
           "-DMyProj_INSTALL_PYTHONDIR=libexec -DCMAKE_INSTALL_PREFIX=#{prefix}"
    system "cmake", "--build", ".", "--target", "install", "--parallel"
  end

  python_version = Language::Python.major_minor_version Formula["python@3.9"].bin/"python3"
  (lib/"python#{python_version}/site-packages/homebrew-ariadne.pth").write <<~EOS
    import site; site.addsitedir('#{libexec}')
  EOS
end

这种方式要好得多,因为CMake构建不再需要了解任何关于Homebrew的知识。

票数 1
EN

Stack Overflow用户

发布于 2021-03-06 15:31:29

在Homebrew讨论中从这个职位找到了解决方案,它依赖于libexec目录和pth文件创建:

  1. 在CMake中使用libexec作为安装目标,条件是使用本地安装而不是本地安装:
代码语言:javascript
复制
  if (HOMEBREW)
      install(TARGETS pyariadne DESTINATION libexec)
  else()
      find_package(Python)
      install(TARGETS pyariadne DESTINATION ${Python_SITEARCH})
  endif()
  1. 在公式中设置以下内容,以创建.pth文件:
代码语言:javascript
复制
  def install
    mkdir "build" do
      system "cmake -G \"Ninja\" .. -DCMAKE_BUILD_TYPE=Release -DHOMEBREW=1 -DCMAKE_INSTALL_PREFIX=#{prefix}"
      system "cmake", "--build", ".", "--target", "install", "--parallel"
    end

    python_version = Language::Python.major_minor_version Formula["python@3.9"].bin/"python3"
    (lib/"python#{python_version}/site-packages/homebrew-ariadne.pth").write <<~EOS
      import site; site.addsitedir('#{libexec}')
    EOS
  end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66497187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档