从本地 C++ 程序构建 conda 包

Posted

技术标签:

【中文标题】从本地 C++ 程序构建 conda 包【英文标题】:Build conda package from a local C++ program 【发布时间】:2020-05-28 15:00:17 【问题描述】:

我正在尝试构建(然后上传)一个 conda 包,其中包含我用 C++ 开发的自定义程序。 简化问题,我有一个关注meta.yaml

package:
  name: CoolName
  version: "1.0.0"

source:
  path: ./source

requirements:
  build:
    - make

以及以下build.sh

make

我有两个问题: 1) 我应该如何以及在哪里复制作为make 编译结果的二进制文件,以便在环境激活时确实可以识别它? 2) 我应该如何将 g++ 指定为依赖项?我想让这个包稍后可用于linux-64osx-64... 在构建过程中(在 Makefile 中)我只使用 g++。


编辑

我已将构建脚本修改为:

make
mkdir -p $PREFIX/bin
cp my_binary $PREFIX/bin/my_binary

现在conda-build 成功了。但是,当我稍后尝试使用 conda install --use-local 在本地安装软件包时,我得到:

Collecting package metadata (current_repodata.json): done
Solving environment: done

# All requested packages already installed.

但这不是真的,我的二进制文件没有安装在任何地方并且无法识别......

【问题讨论】:

我正在尝试将本地 C++ 库转换为 conda 包,类似于您所做的。您是否可以分享您的流程/代码仓库以供参考? 【参考方案1】:
    我应该如何以及在哪里复制作为 make 编译结果的二进制文件,以便在环境激活时确实可以识别它?

正如您在编辑中提到的,安装在 $PREFIX 中的某处

    我应该如何将 g++ 指定为依赖项?

要使用 conda 提供的编译器(而不是您的系统编译器),请使用:

requirements:
  build:
    -  compiler('cxx') 

我希望这个包以后可用于 linux-64 和 osx-64...在构建过程中(在 Makefile 中)我只使用 g++。

注意:在 Mac 上,它将使用 clang++,而不是 g++。确保您的 Makefile 尊重 $CXX 环境变量,而不是硬编码 g++

但是,当我稍后尝试使用 conda install --use-local 在本地安装软件包时,我得到:

这很奇怪。 conda install --use-local CoolName 应该做你想做的事。但这里有一些事情可以尝试:

仔细检查您尝试将其安装到的环境的内容:

  conda list

尝试安装到新环境:

  conda create -n my-new-env --use-local CoolName

在成功构建包之前删除您可能创建的包的任何过时版本:

# Inspect the packages you've created,
# and consider deleting all but the most recent one.
ls $(conda info --base)/conda-bld/linux-64/CoolName*.tar.bz2

...然后尝试再次运行conda install

【讨论】:

谢谢!我删除了所有内容,仅使用我的程序构建了一个新的env,它可以正常工作!

以上是关于从本地 C++ 程序构建 conda 包的主要内容,如果未能解决你的问题,请参考以下文章

conda 从本地存档文件构建源

如何将 conda 骨架与未上传到 pypi 的包一起使用?

Xcode 导入本地 Swift 包并从应用程序构建

conda包手动下载 本地安装

用Anaconda安装本地python包

如何克隆 PyPI 存储库并作为本地存储库维护