基于xmake, 助力打造c/c++依赖包生态

waruqi
ruki 2019-08-13 字数 1642

xmake集成了内置的远程包依赖管理,用户只需要简单地在项目中添加自己所需要的包和版本,即可自动下载和集成对应的包到项目中,并且实现编译和链接。

例如:

add_requires("libuv master", "ffmpeg", "zlib 1.20.*")

add_requires("tbox >1.6.1", {optional = true, debug = true})

add_requires("boost", {alias = "boost_context", configs = {context = true}})

target("test")

set_kind("binary")

add_files("src/*.c")

add_packages("libuv", "ffmpeg", "tbox", "boost_context", "zlib")

xmake的包仓库设计之初,就考虑到了语义版本支持,以及依赖包的跨平台支持,只要包自身能支持的平台,都可以集成进来,比如zlib包,在xmake中使用,iphoneos, android以及mingw平台下都是完全可用的。

用户只需要简单的切下构建平台:

xmake f -p iphoneos -a arm64

xmake

note: try installing these packages (pass -y to skip confirm)?

in xmake-repo:

-> zlib 1.2.11

please input: y (y/n)

=> download https://downloads.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz .. ok

=> install zlib 1.2.11 .. ok

就可以对iphoneos平台下载集成add_requires中对应的包,xmake的最终目标,是打造一个跨平台的包仓库,用户不再需要满地找c/c++库,然后研究各种平台的移植,只需要简单的添加上包依赖,即可在各个平台都能方便使用。

当然了,目前xmake的官方仓库还在发展初期,里面的包还很少,支持的平台也不是很完善,因此,这里我简单介绍下用户如何去自己制作和上传自己需要的c/c++包,并如何提交到我们的仓库中(也可以自建私有仓库), 希望有兴趣的小伙伴可以帮忙贡献一份微薄之力,一起共同打造和建立c/c++依赖包生态。

项目源码: https://github.com/xmake-io/xmake

官方文档: https://xmake.io

完整原文: https://tboox.org/cn/2019/08/09/xmake-upload-package/

29 个回复
javame
yimin 2019-08-22

这个包的windows 32位环境有吗?

【 在 waruqi (ruki) 的大作中提到: 】

: xmake集成了内置的远程包依赖管理,用户只需要简单地在项目中添加自己所需要的包和版本,即可自动下载和集成对应的包到项目中,并且实现编译和链接。

: 例如:

: add_requires("libuv master", "ffmpeg", "zlib 1.20.*")

: ...................

waruqi
ruki 2019-08-26

你是指哪个包,大部分都是有的 win上

【 在 javame 的大作中提到: 】

: 这个包的windows 32位环境有吗?

javame
yimin 2019-08-26

我下的源代码,编译出来是要powershell和lua环境吗?

【 在 waruqi 的大作中提到: 】

: 你是指哪个包,大部分都是有的 win上

Snija
-_- 2019-08-27

有没有考虑过集成python作为一个可选的脚本提供工具,与lua并存,作为一个可选的编译选项。

另外如何指定用系统的Qt?(比如/usr/include/qt5和/usr/lib/qt)

【 在 waruqi 的大作中提到: 】

: xmake集成了内置的远程包依赖管理,用户只需要简单地在项目中添加自己所需要的包和版本,即可自动下载和集成对应的包到项目中,并且实现编译和链接。

: 例如:

: add_requires("libuv master", "ffmpeg", "zlib 1.20.*")

: ...................

hgoldfish
老鱼 2019-08-27

用 python 的话就得重写了。可以考虑 scons,但它对 qt 的支持不太好。

【 在 Snija (-_-) 的大作中提到: 】

: 有没有考虑过集成python作为一个可选的脚本提供工具,与lua并存,作为一个可选的编译选项。

: 另外如何指定用系统的Qt?(比如/usr/include/qt5和/usr/lib/qt)

Snija
-_- 2019-08-27

也不一定要重写吧,就是提供个python写插件的接口,而且也有一些像lupa的初步实现。

【 在 hgoldfish 的大作中提到: 】

: 用 python 的话就得重写了。可以考虑 scons,但它对 qt 的支持不太好。

waruqi
ruki 2019-08-27

不需要,xmake内置了luajit,没有任何第三方依赖,不过win上源码编译xmake自身需要用xmake才能编译,建议win上直接下载安装包安装:https://github.com/xmake-io/xmake/releases

【 在 javame 的大作中提到: 】

: 我下的源代码,编译出来是要powershell和lua环境吗?

: :

waruqi
ruki 2019-08-27

不考虑python,如果要python,你可以试试scons或者meson,都很不错,或者你可以写个python转xmake.lua的脚本,wrap下也可以

xmake f --qt=xxx 可以指定qt sdk根目录

【 在 Snija 的大作中提到: 】

: 有没有考虑过集成python作为一个可选的脚本提供工具,与lua并存,作为一个可选的编译选项。

: 另外如何指定用系统的Qt?(比如/usr/include/qt5和/usr/lib/qt)

waruqi
ruki 2019-08-27

今天我正好发了2.2.8新版本,大伙可以试试,https://tboox.org/cn/2019/08/22/xmake-update-v2.2.8/  带来了全新的vs工程生成插件,更好的与vs进行了集成,并且支持了android/termux环境。

sssmmmxxx
sssmmmxxx 2019-08-27

能发展成rust的cargo么?cpp坑多我人傻,想转rust了

发自「今日水木 on iPhone 8 Plus」

【 在 waruqi 的大作中提到: 】

: xmake集成了内置的远程包依赖管理,用户只需要简单地在项目中添加自己所需要的包和版本,即可自动下载和集成对应的包到项目中,并且实现编译和链接。

: 例如:

: add_requires("libuv master", "ffmpeg", "zlib 1.20.*")

: add_requires("tbox >1.6.1", {optional = true, debug = true})

: add_requires("boost", {alias = "boost_context", configs = {context = true}})

: target("test")

: set_kind("binary")

: add_files("src/*.c")

: add_packages("libuv", "ffmpeg", "tbox", "boost_context", "zlib")

: xmake的包仓库设计之初,就考虑到了语义版本支持,以及依赖包的跨平台支持,只要包自身能支持的平台,都可以集成进来,比如zlib包,在xmake中使用,iphoneos, android以及mingw平台下都是完全可用的。

: 用户只需要简单的切下构建平台:

: xmake f -p iphoneos -a arm64

: xmake

: note: try installing these packages (pass -y to skip confirm)?

: in xmake-repo:

: -> zlib 1.2.11

: please input: y (y/n)

: => download https://downloads.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz .. ok

: => install zlib 1.2.11 .. ok

: 就可以对iphoneos平台下载集成add_requires中对应的包,xmake的最终目标,是打造一个跨平台的包仓库,用户不再需要满地找c/c++库,然后研究各种平台的移植,只需要简单的添加上包依赖,即可在各个平台都能方便使用。

: 当然了,目前xmake的官方仓库还在发展初期,里面的包还很少,支持的平台也不是很完善,因此,这里我简单介绍下用户如何去自己制作和上传自己需要的c/c++包,并如何提交到我们的仓库中(也可以自建私有仓库), 希望有兴趣的小伙伴可以帮忙贡献一份微薄之力,一起共同打造和建立c/c++依赖包生态。

: 项目源码: https://github.com/xmake-io/xmake

: 官方文档: https://xmake.io

: 完整原文: https://tboox.org/cn/2019/08/09/xmake-upload-package/

: --

waruqi
ruki 2019-08-27

xmake也支持rust构建,不过目前不是重点。。我也不用cpp,10年前就转c了。。

【 在 sssmmmxxx 的大作中提到: 】

: 能发展成rust的cargo么?cpp坑多我人傻,想转rust了

: 发自「今日水木 on iPhone 8 Plus」

Snija
-_- 2019-10-05
Snija
-_- 2019-10-06

通过add_headerfiles("include/pkg/*.h")加入的头文件,在package时丢失了目录结构,全部给放在include下面了,怎么解决?

hellogg
helloGG 2019-10-07

看到过你的项目。对不起没有仔细看。不过想请教一下几个问题:

1.xmake是个编译构建体系吧?我有个感觉,这样还是不太方便,因为需要使用者编译库的源码,这样的话还是有门槛的。

2.虽说可能您觉得xmake已经够简单了,但还是增加了一个步骤。

3.我原来有个设想,就是简单直接又暴力的把库在所有平台下都编译一份,然后放到服务器上,使用都要用哪个下哪个。或者有个更好的组织方式更好。这样使用者的代价最小,就是下自己平台的二进制文件和头文件即可。java之所以成功,就是因为它强大的库使用也极其方便。

4.c++的给人难用的悲剧就在于没有统一的库给人使用,需要自己非常麻烦的在各种平台下编译。如果能有个傻瓜式的解决方法,砍掉这个高门槛,肯定会有很多人喜欢用c++的。

【 在 waruqi 的大作中提到: 】

: xmake集成了内置的远程包依赖管理,用户只需要简单地在项目中添加自己所需要的包和版本,即可自动下载和集成对应的包到项目中,并且实现编译和链接。

: 例如:

: add_requires("libuv master", "ffmpeg", "zlib 1.20.*")

: ...................

hellogg
helloGG 2019-10-07

具体来说,需要有一个服务器,存入所有平台下编译出来的所有库。

这些库需要按一定方式组织起来,让使用者方便使用。

或者每个平台下编译出来的所有库,可以做为一个sdk下载。可能会很大,比如几个G。甚至几十个G。当然会分各种版本,比如调试,发布版本,静态,动态库,或者win下的MT,MD。

然后如果这个统一的库能够被大家所接受,变成一个标准,那就好了。

这个统一的库,当然可以用你的xmake编译,或者其它任何方法编译。

要是有这么一个东西就好了。

Snija
-_- 2019-10-07

https://conan.io有预编译好的库

【 在 hellogg 的大作中提到: 】

: 具体来说,需要有一个服务器,存入所有平台下编译出来的所有库。

: 这些库需要按一定方式组织起来,让使用者方便使用。

: 或者每个平台下编译出来的所有库,可以做为一个sdk下载。可能会很大,比如几个G。甚至几十个G。当然会分各种版本,比如调试,发布版本,静态,动态库,或者win下的MT,MD。

: ...................

txgx
纸上谈医 2019-10-08

有点过时了吧,

怎么和c++20结合起来呢?

【 在 waruqi 的大作中提到: 】

: xmake集成了内置的远程包依赖管理,用户只需要简单地在项目中添加自己所需要的包和版本,即可自动下载和集成对应的包到项目中,并且实现编译和链接。

: 例如:

: add_requires("libuv master", "ffmpeg", "zlib 1.20.*")

: ...................

PGP
--- 2019-10-09

vcpkg,homebrew,apt,真的够简单了

【 在 hellogg 的大作中提到: 】

: 看到过你的项目。对不起没有仔细看。不过想请教一下几个问题:

: 1.xmake是个编译构建体系吧?我有个感觉,这样还是不太方便,因为需要使用者编译库的源码,这样的话还是有门槛的。

: ....................

waruqi
ruki 2019-10-11

通过()设置下需要导出的层级就行了,add_headerfiles("include/(pkg/*.h)")

这块在文档https://xmake.io/#/zh-cn/manual/project_target?id=targetadd_installfiles 里面有详细描述,后续使用问题,尽量到github issues上反馈吧。

谢谢

【 在 Snija 的大作中提到: 】

: 通过add_headerfiles("include/pkg/*.h")加入的头文件,在package时丢失了目录结构,全部给放在include下面了,怎么解决?