基于 xmake,助力打造跨平台 C/C++依赖包生态

2019-08-10 08:14:13 +08:00
 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://tboox.org/cn/2019/08/09/xmake-upload-package/

3021 次点击
所在节点    程序员
27 条回复
AngelCriss
2019-08-10 10:11:45 +08:00
考虑支持 modules 吗?
waruqi
2019-08-10 10:19:07 +08:00
@AngelCriss 之后会加上支持
songjx1992
2019-08-10 10:24:37 +08:00
能取代 cmake 么
waruqi
2019-08-10 11:40:42 +08:00
@songjx1992 你可以试试 是否能满足你这边的需求
youngxhui
2019-08-10 12:01:48 +08:00
你好,前两天简单了解一下,但是 Windows 下提示缺少 VS,这个官方文档好像并没有提及,另外虽说是支持多语言,但是并没有找到示例,希望好好写写官方文档,减少上手难度。支持。
songjx1992
2019-08-10 12:18:34 +08:00
@waruqi 很好用的, 完全可以满足的.
只是希望那些已有的 cmake 的项目能用这个编译, 而不用手动去更改切换.
希望能有个 CMakeLists.txt 转化成 xmake 的功能
icylogic
2019-08-10 12:43:15 +08:00
是否考虑加入对 vcpkg/conan 的支持?(虽然看起来会比较麻烦)。因为我觉得你这个项目的优势在于用 lua 做构建流程(作为脚本语言比 cmakelists 强太多),包管理这个有了当然好,不过这方面我觉得你大概拼不过 vcpkg 和 conan 的社区,而且有些库甚至会官方维护 conanfile 和 vcpkg/port。
waruqi
2019-08-10 12:46:02 +08:00
@youngxhui 你可以看下 https://github.com/xmake-io/xmake/tree/master/tests/projects 里面的例子,也可以通过 xmake create -l swift test 创建其他语言的空工程 xmake create --help 你可以看下 文档我后续会不断完善
shawndev
2019-08-10 12:47:41 +08:00
看语法好像 bazel
waruqi
2019-08-10 12:48:32 +08:00
都是支持的 你可以看下文档 https://xmake.io/#/zh-cn/package/remote_package?id=%e6%b7%bb%e5%8a%a0vcpkg%e7%9a%84%e4%be%9d%e8%b5%96%e5%8c%85

除了 vcpkg conan 还支持 clib homwbrew
waruqi
2019-08-10 12:49:57 +08:00
@songjx1992 目前还不支持 但是支持 xmake.lua 转 cmakelists 目前 通过 xmake project -k cmakelists 命令 也可以生成 vsproj makefile 等
songjx1992
2019-08-10 13:21:22 +08:00
@waruqi 好的, 谢谢你的软件了
FrankHB
2019-08-10 17:16:38 +08:00
用 Lua 而不是依赖屑 CMakeLists 之类的残 DSL 是有前途多了,但看示例还是得用户自己写 build script 直觉上不能直接偷懒用第三方服务,也没有抓眼球又有特色的独家 feature (像 conan 的分布式 repo ),没到靠工具设计而不是维护包 /抱知名项目大腿就能单独生存下去的程度。

还是建议分开做包管理。

反过来专注 build 的方面,依赖“生成”是没前途的,兼容历史包袱同时也是给自己挖坑。(生成完 CMakeLists/makefile/... 是不是就更方便一脚踢开了?)

( Lua 和 Apache 嘛……对一般用户应该问题不大,不过我还是得自己糊轮子了。……编译 conan 和 vcpkg 都够一肚子气了。)
waruqi
2019-08-10 18:48:31 +08:00
@FrankHB conan 的分布式 repo 回头我研究下,不过 xmake 也是支持多 repo 的,并不是单 repo,只是默认有个官方仓库而已,而且还支持用户自建多个私有 repo,用于私有项目的内部依赖维护

关于 build 方面,xmake 就是我为了更加专注做好 build 体验,才会把包依赖内置集成进来的,这样对于用户
整个 build 流程以及 xmake.lua 会更加的简化

而且 xmake 专注做直接构建,不依赖 makefile,甚至不依赖 make 以及 ide,内部自动处理头文件依赖,多任务构建,以及增量构建。。后期还会加上内置的分布式编译支持

而生成 makefile cmakelist 以及 vcproj 等工程文件,只是 xmake 提供的附带功能,仅仅作为可选的插件提供,并不是 xmake 的专注点,只是为了满足部分用户的需求而已,xmake 主攻直接构建
FrankHB
2019-08-11 13:21:24 +08:00
@waruqi 作为包管理的 frontend 方便用户是没有问题的。不过我的感觉是这里很容易耦合,项目管理上也比较麻烦。(另外,作为用户,我最终希望把 build system/CI 和系统级的包管理合起来,这个方向现在到处都是碎片,看样子没什么人做。)

不依赖 makefile 整体是正确方向,因为 makefile 让用户折腾的主要的部分本质就是做得很不怎么样的 DSL。很多新的工具出来的理由也是不满 make,而其中一大理由就是 makefile 写起来维护起来体验太混账了( tab v. 空格……)。不过问题是……真的彻底摆脱得了吗?举个例子,GCC 的 LTO 实际上是依赖编码在 GCC 源码树中的 MAKE 环境变量的,-flto 会生成 makefile ……另外 -MF -MMD 出来的 deps 也算是 makefiles 的格式阴魂不散(虽然也许比 /cl showInclude 出来的干脆但实际上 parse 也有坑)。而且看了 xmake 的 get.sh 还是要求 make 来安装,没法直接 self host 的吧。

至于不依赖 IDE 本来就是正常思路(要依赖也是 IDE 依赖 build system ——如 VS 依赖 nmake/MSBuild,而不是反过来)。依赖 IDE 搞 build ……比如 Code::Blocks 内置 regexp parse #include 结果对付不了 #include MACRO 这样的笑话还是算了。

生成文件吸引用户是个好的策略,仅当专注的部分优势足够明显。
songjx1992
2019-08-11 17:29:54 +08:00
@FrankHB #15 对于 gcc 来说, Makefile 的环境变量和 shell 的环境变量是一样的吧
Monad
2019-08-11 17:33:30 +08:00
咨询一个使用中碰到的问题


但是类似的方式安装 zlib 是没问题的=.= 求教呀
Monad
2019-08-11 17:36:31 +08:00
另外 doc 里面写的
add_requires("brew::zlib", {alias = "zlib"}})
这里应该多了个右大括号吧
FrankHB
2019-08-11 17:55:01 +08:00
@songjx1992 一般来讲是一样。不过多开几个 shell 不注意的话(比如 make 和 mingw32-make 串了)的话,画面可以很美……
Monad
2019-08-11 19:11:35 +08:00
另外希望能够支持 C#工程呢,CMake 在 Linux/macOS 下并没有 Visual Studio 系列的 Generator.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/590638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX