Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何在现有 CMake 项目中引入 xmake/xrepo 管理的包? #1970

Closed
cyfdecyf opened this issue Jan 12, 2022 · 7 comments
Closed

如何在现有 CMake 项目中引入 xmake/xrepo 管理的包? #1970

cyfdecyf opened this issue Jan 12, 2022 · 7 comments

Comments

@cyfdecyf
Copy link
Contributor

描述讨论详情

因为不确定 xmake/xrepo 是否已经提供该功能,暂时使用讨论类型的 issue。

目前正在考虑引入 xmake 或 vcpkg 进行 C++ 项目的第三方库依赖管理。xmake 的 private package repository 比 vcpkg registry 更加简单,相比 cmake,个人也更喜欢用 Lua 作为构建系统的语言。

因现有项目已经使用 cmake 进行构建,所以暂时只能考虑仅使用 xmake 进行包管理。随之而来的问题是:如何在 cmake 中通过 find_package 引入 xmake 管理的包?

没能在文档中找到直接的解决方案。我现在能想到的方案如下:

  1. 使用 xmake.lua 指定所有需要的包,执行 xmake install 安装
  2. 解析 xrepo fetch <pkg> 输出来获取每个包的 include, library 路径等信息,将这些信息生成为一个小的 cmake 文件
  3. 在现有项目的 CMakeLists.txt 中引用第 2 步中生成的 cmake 文件,这样即可使用由 xmake 管理的包

不知是否有更好的方案满足这个需求?

@cyfdecyf cyfdecyf changed the title 如何在 cmake 中通过 find_package 引入 xmake 管理的包? 如何在现有 CMake 项目中引入 xmake/xrepo 管理的包? Jan 12, 2022
@waruqi
Copy link
Member

waruqi commented Jan 12, 2022

大概流程,其实跟你说的方式类似,可以参考 conan 的 cmake wrapper 。。https://github.com/conan-io/cmake-conan

就是整了个 conan.cmake 让用户引入,然后它内部自动处理 fetch 和 添加 include links 等信息到对应的 var 上去。。

用户只需要要用提供的一些辅助接口配置下包就好。。

按理,xmake 应该也差不多这个模式对 cmake 项目来集成,但是因为目前这边主要精力一直在 xmake 项目自身构建上,所以这个 cmake wrapper 我一直没时间去整。。

后面有空可以看看,你也可以往这个方向上自己尝试搞一个类似的 wrapper。。

@waruqi
Copy link
Member

waruqi commented Jan 12, 2022

我创建了个类似的空工程,你有兴趣的话,也可以帮忙贡献个 xrepo.cmake

https://github.com/xmake-io/xrepo-cmake

@cyfdecyf
Copy link
Contributor Author

谢谢如此快速的回复。我试一下这条路能不能走通,走通之后我看下如何实现。

@waruqi
Copy link
Member

waruqi commented Jan 12, 2022

理论上肯定能通的,毕竟 conan 已经躺过了~ 如果这个 wrapper 实现了,还有个好处是统一化集成三方包源,毕竟 xrepo 也支持 vcpkg/conan 的包源,

@xq114
Copy link
Contributor

xq114 commented Jan 12, 2022

如果只是导入xmake而不是xrepo的话,另一个办法,在xmake的项目里加一行

add_rules("utils.install.cmake_importfiles")

这样会生成cmake的config文件给cmake导入。见 https://xmake.io/#/manual/custom_rule?id=utilsinstallcmake_importfiles

对xrepo中使用cmake的包,xmake会原样安装,使用cmake的find_package应该是可以的。例如opencv,可以建立一个虚拟环境

-- xmake.lua
add_requires("opencv")

然后运行

xrepo env shell

在虚拟环境内运行cmake,即可找到opencv。

更一般的使用xrepo中任意库,目前没有解决办法,如上必须引入额外的cmake toolchain

@waruqi
Copy link
Member

waruqi commented Jan 15, 2022

相关 pr: xmake-io/xrepo-cmake#1

@cyfdecyf
Copy link
Contributor Author

xrepo env shell

在虚拟环境内运行cmake,即可找到opencv。

更一般的使用xrepo中任意库,目前没有解决办法,如上必须引入额外的cmake toolchain

谢谢建议,我也会试下 xrepo env。目前还在探索 xmake 的阶段,很多功能还不知道该如何使用。

这个 issue 我先 close,用 xrepo-cmake 来解决。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants