xmake v2.5.5 发布,支持下载集成二进制镜像包 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
waruqi

xmake v2.5.5 发布,支持下载集成二进制镜像包

  •  
  •   waruqi
    waruqi 2021 年 7 月 1 日 2107 次点击
    这是一个创建于 1757 天前的主题,其中的信息可能已经有所发展或是发生改变。

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt ,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。

    2.5.5 版本中,我们继续改进远程包集成的体验,实现在云端预编译包,然后直接下载集成预编译的二进制包。这对于一些编译非常慢的包,可以极大的减少包的安装时间。

    另外,新版本中,我们还重新实现了新版的本地包生成方案,完全无缝支持 add_requiresadd_packages,从此远程包和本地包可以使用统一的集成方式来维护。

    新特性介绍

    下载安装预编译包

    之前 xmake 内置的包管理器每次安装包,都必须下载对应的包源码,然后执行本地编译安装集成,这对于一些编译非常慢的大包,以及一些依赖的编译工具非常多的包,安装起来会非常的慢。

    尤其是在 windows 上,不仅三方包对编译环境的依赖更加复杂,而且很多打包编译非常慢,例如:boost, openssl 等等。

    为此,我们基于 github action 实现对包的云端预编译,会将常用配置的包都去预编译一遍,然后存储到 build-artifacts 仓库的 Releases 下。

    然后,我们在安装包的时候,会自动从二进制镜像包源下载,实现快速集成(目前仅支持预编译 windows 包,后期会逐步放开到其他平台)。

    我们会预编译每个包的 plat/arch/MT/MD/static/shared 等各种配置组合,根据唯一的 buildhash 来精确拉取用户实际需要的包,所有的编译产物都会用 7zip 压缩打包,如下图:

    配置镜像源加速下载

    由于我们的预编译产物都放置在 github 上,对于国内用户,考虑到访问 github 并不是很稳定,我们也可以借助 xmake 镜像代理功能,将实际的下载自动切换到 fastgit 等镜像站点加速下载。

    我们可以通过一个 pac.lua 文件,配置镜像代理规则,比如对所有 github.com 域名的访问切到 hub.fastgit.org 域名,实现加速下载包。

    pac.lua 配置:

    function mirror(url) return url:gsub("github.com", "hub.fastgit.org") end 

    然后我们设置这个 pac.lua 文件,默认路径在 ~/.xmake/pac.lua,也可以手动配置使用指定位置的 pac.lua 。

    $ xmake g --proxy_pac=/tmp/pac.lua 

    然后,我们安装包的时候,如果遇到 github.com 域名下的包源,下载时候会自动切到 fastgit 镜像加速下载。

    $ xrepo install libpng > curl https://hub.fastgit.org/glennrp/libpng/archive/v1.6.37.zip -o v1.6.37.zip 

    因此,所有走预编译产物的下载也会得到提速,当然国内提供 github 镜像加速的不止 fastgit 一家,用户也可以切换到其他镜像源,比如 cnpmjs.org 等等。

    如何触发云端预编译

    默认情况下,xmake 不会主动进行所有包的云端预编译缓存,这样太耗时耗力,目前仅仅只有提交 pr 到 xmake-repo 官方包仓库,进行新包收录或者包版本更新时候,才会自动触发对应包的云端预编译行为。

    所以,如果用户想要贡献包进我们的仓库,基本上都是可以被预编译缓存的(除了 headeronly 库),而如果用户不想贡献包,也想获取对应包的预编译加速,也是可以的。

    只需要提交 pr 到 build-artifacts 仓库的 build 分支,编辑 build.txt 文件,修改里面需要触发预编译的包名和版本列表就行了,例如:

    build.txt

    { name = "asmjit", versiOns= { "2021.06.27" } } 

    只要 pr 被 merge 之后,就会自动触发预编译行为,然后生成最终的编译产物到 releases 。

    强制源码编译安装

    尽管我们提供了预编译下载安装的方式,但是如果用户还是想源码编译安装,我们也可以手动传入 --build 参数给 xrepo 命令,来强制切换到源码编译安装模式。

    $ xrepo install --build openssl 

    在 xmake.lua 中,我们也可以同样支持源码编译安装。

    add_requires("openssl", {build = true}) 

    如果没有指定,那么 xmake 会自动优先尝试走预编译包的下载安装。

    添加私有预编译包仓库

    我们的官方预编译包仓库在:build-artifacts

    同样,我们也可以配置添加自有的预编译仓库,添加方式类似:

    $ xmake repo --add local-repo [email protected]:xmake-mirror/myrepo-artifacts.git 

    也可以在 xmake.lua 中添加:

    add_repositories("local-repo [email protected]:xmake-mirror/myrepo-artifacts.git") 

    新版本地包方案

    默认打包格式

    新版本中,我们提供了一种新的本地包打包方案,将会更加无缝的对接 add_requiresadd_packages

    我们执行 xmake package 命令就能够生成默认的新版打包格式。

    $ xmake package package(foo): build/packages/f/foo generated 

    它将会产生 build/packages/f/foo/xmake.lua 文件,内容如下:

    package("foo") set_description("The foo package") set_license("Apache-2.0") add_deps("add", "sub") on_load(function (package) package:set("installdir", path.join(os.scriptdir(), package:plat(), package:arch(), package:mode())) end) on_fetch(function (package) local result = {} result.links = "foo" result.linkdirs = package:installdir("lib") result.includedirs = package:installdir("include") return result end) 

    其实就是采用 package() 来定义描述本地包,就跟远程包一样。

    而生成的目录结构如下:

    $ tree build/packages/f/foo/ build/packages/f/foo/ ├── macosx │ └── x86_64 │ └── release │ ├── include │ │ └── foo.h │ └── lib │ └── libfoo.a └── xmake.lua 

    我们也能够使用 add_requires/add_repositories 接口来无缝集成这个包。

    add_rules("mode.debug", "mode.release") add_repositories("local-repo build") add_requires("foo") target("bar") set_kind("binary") add_files("src/*.cpp") add_packages("foo") 

    其中,add_repositories 配置指定本地包的仓库根目录,然后就可以通过 add_requires 来引用这个包了。

    另外,生成的本地包,还有一个特性,就是支持 target/add_deps,会自动关联多个包的依赖关系,集成时候,也会自动对接所有依赖链接。

    这里有完整的测试例子

    "/usr/bin/xcrun -sdk macosx clang++" -o build/macosx/x86_64/release/bar build/.objs/bar/macosx/x86_64/release/src/main.cpp.o -arch x86_64 -mmacosx-version-min=10.15 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk -stdlib=libc++ -L/Users/ruki/projects/personal/xmake/tests/actions/package/localpkg/bar/build/packages/f/foo/macosx/x86_64/release/lib -L/Users/ruki/projects/personal/xmake/tests/actions/package/localpkg/bar/build/packages/s/sub/macosx/x86_64/release/lib -L/Users/ruki/projects/personal/xmake/tests/actions/package/localpkg/bar/build/packages/a/add/macosx/x86_64/release/lib -Wl,-x -lfoo -lsub -ladd -lz 

    备注:之前的老版本本地打包格式属于早期产物,还是会被保留,但是不推荐继续使用,想要继续使用,可以执行下面的命令打包:

    $ xmake package -f oldpkg 

    生成远程包

    除了本地包格式,xmake package 现在也支持生成远程包,便于用户将他们快速提交到远程仓库。

    我们只需要在打包时候,修改包格式。

    $ xmake package -f remote 

    他也会产生 packages/f/foo/xmake.lua 文件。

    package("foo") set_description("The foo package") set_license("Apache-2.0") add_deps("add", "sub") add_urls("https://github.com/myrepo/foo.git") add_versions("1.0", "<shasum256 or gitcommit>") on_install(function (package) local cOnfigs= {} if package:config("shared") then configs.kind = "shared" end import("package.tools.xmake").install(package, configs) end) on_test(function (package) -- TODO check includes and interfaces -- assert(package:has_cfuncs("foo", {includes = "foo.h"}) end) 

    包定义配置相比本地包,多了实际的安装逻辑,以及 urls 和 versions 的设置,

    我们也能够通过附加参数,去修改 urls,versions 等配置值,例如:

    $ xmake package -f remote --url=https://xxxx/xxx.tar.gz --shasum=xxxxx --homepage=xxxxx` 

    xmake 也会从 target 的 set_licenseset_version 等配置中读取相关配置信息。

    从第三方仓库搜索包

    xmake 内置的 xrepo 包管理器命令,之前可以支持搜索 xmake-repo 仓库中的内置包。

    $ xrepo search zlib "pcr*" zlib: -> zlib: A Massively Spiffy Yet Delicately Unobtrusive Compression Library (in xmake-repo) pcr*: -> pcre2: A Perl Compatible Regular Expressions Library (in xmake-repo) -> pcre: A Perl Compatible Regular Expressions Library (in xmake-repo) 

    而现在,我们还可以从 vcpkg, conan, conda 以及 apt 等第三方包管理器中搜索它们的包,只需要加上对应的包命名空间就行,例如:

    $ xrepo search vcpkg::pcre The package names: vcpkg::pcre: -> vcpkg::pcre-8.44#8: Perl Compatible Regular Expressions -> vcpkg::pcre2-10.35#2: PCRE2 is a re-working of the original Perl Compatible Regular Expressions library 
    $ xrepo search conan::openssl The package names: conan::openssl: -> conan::openssl/1.1.1g: -> conan::openssl/1.1.1h: 

    修改目标文件名

    我们知道,对于目标文件名的修改,我们可以使用 set_basename 或者使用 set_filename 接口来配置实现,前者修改 libxxx.so 中的 xxx 部分名字,后者可以修改完整的文件名。

    但是有些情况,我们仅仅想要修改:扩展名 .so,前缀名 lib,或者增加后缀名比如:libxxx-d.so 就会很麻烦,要么使用 set_filename 进行完整修改。

    现在,我们新提供了 set_prefixname, set_suffixnameset_extension 三个独立接口来更加灵活地配置它们。

    设置目标文件的前置名

    例如将默认的:libtest.so 改成 test.so

    target("test") set_prefixname("") 

    设置目标文件的后置名

    例如将默认的:libtest.so 改成 libtest-d.so

    target("test") set_suffixname("-d") 

    设置目标文件的扩展名

    例如将默认的:libtest.so 改成 test.dll

    target("test") set_prefixname("") set_extension(".dll") 

    默认的目标类型

    新版本中,如果用户没有对 target 设置 set_kind 指定目标类型,那么默认就是 binary 程序。

    因此,我们可以实现更小的配置,例如:

    target("test") add_files("src/*.c" 

    只需两行就可以完成一些小项目的编译,甚至可以更加简短:

    target("test", {files = "src/*.c"}) 

    新增 appletvos 编译平台

    我们还新增了一个 appletvos 的编译平台,用于支持 Apple 的 TVOS 系统上程序的编译,只需要:

    $ xmake f -p appletvos $ xmake 

    导入导出编译配置

    我们还可以导入导出已经配置好的配置集,方便配置的快速迁移。

    导出配置

    $ xmake f --export=/tmp/config.txt $ xmake f -m debug --xxx=y --export=/tmp/config.txt 

    导入配置

    $ xmake f --import=/tmp/config.txt $ xmake f -m debug --xxx=y --import=/tmp/config.txt 

    导出配置(带菜单)

    $ xmake f --menu --export=/tmp/config.txt $ xmake f --menu -m debug --xxx=y --export=/tmp/config.txt 

    导入配置(带菜单)

    $ xmake f --menu --import=/tmp/config.txt $ xmake f --menu -m debug --xxx=y --import=/tmp/config.txt 

    vs2022 支持

    另外,新版本中,我们也增加了对 vs2020 预览版的支持。

    改进 xrepo shell 环境

    在上个版本,我们支持了通过在当前目录下,添加 xmake.lua 文件,来定制化一些包配置,然后进入特定的包 shell 环境。

    add_requires("zlib 1.2.11") add_requires("python 3.x", "luajit") 
    $ xrepo env shell > python --version > luajit --version 

    而现在,我们还可以在 xmake.lua 配置加载对应的工具链环境,比如加载 vs 的编译环境。

    set_toolchains("msvc") 

    更新内容

    新特性

    • #1421: 针对 target 目标,增加目标文件名的前缀,后缀和扩展名设置接口。
    • #1422: 支持从 vcpkg, conan 中搜索包
    • #1424: 设置 binary 作为默认的 target 目标类型
    • #1140: 支持安装时候,手动选择从第三包包管理器安装包
    • #1339: 改进 xmake package 去产生新的本地包格式,无缝集成 add_requires,并且新增生成远程包支持
    • 添加 appletvos 编译平台支持, xmake f -p appletvos
    • #1437: 为包添加 headeronly 库类型去忽略 vs_runtime
    • #1351: 支持导入导出当前配置
    • #1454: 支持下载安装 windows 预编译包

    改进

    • #1425: 改进 tools/meson 去加载 msvc 环境,并且增加一些内置配置。
    • #1442: 支持从 git url 去下载包资源文件
    • #1389: 支持添加工具链环境到 xrepo env
    • #1453: 支持 protobuf 规则导出头文件搜索目录
    • 新增对 vs2022 的支持

    Bugs 修复

    • #1413: 修复查找包过程中出现的挂起卡死问题
    • #1420: 修复包检测和配置缓存
    • #1445: 修复 WDK 驱动签名错误
    • #1465: 修复缺失的链接目录
    13 条回复    2021-07-03 00:01:39 +08:00
    pabupa
        1
    pabupa  
       2021 年 7 月 1 日 via Android
    有类似 vcpkg 这样的仓库吗?
    pabupa
        2
    pabupa  
       2021 年 7 月 1 日 via Android
    @pabupa 看到了
    waruqi
        3
    waruqi  
    OP
       2021 年 7 月 1 日 via Android
    @pabupa 有内置仓库,也可以直接从 vcpkg 仓库装包
    3dwelcome
        4
    3dwelcome  
       2021 年 7 月 1 日
    别搞这个了,学 github 搞开源代码分析和 IDE 自动补全功能,比楼主这个要来钱。

    积累源代码越多,补全实力越强。
    ashong
        5
    ashong  
       2021 年 7 月 1 日
    对于 visual studio 用户来说,如何快速的把 vc++工程转到 xmake 管理? xmake 管理的 c++项目如何用 visual studio 调试? 网站上好像没有详细的教程。
    waruqi
        6
    waruqi  
    OP
       2021 年 7 月 1 日 via Android
    @ashong xmake project -k vsxmake 生成 vs 工程,就能用 vs 调试,文档里有说明
    ashong
        7
    ashong  
       2021 年 7 月 1 日
    @waruqi 多谢回复。
    添加、删除源代码文件后是不是需要重新生成工程文件? cmake 已经可以和 vs 集成调试了
    waruqi
        8
    waruqi  
    OP
       2021 年 7 月 1 日
    @ashong 配置上 add_rules("plugin.vsxmake.autoupdate"),就能自动更新 vsproj,生成的工程 跟你用 cmake 集成调试没什么区别, 一样可以和 xmake 集成调试
    ashong
        9
    ashong  
       2021 年 7 月 1 日
    @waruqi 明白了,谢谢
    waruqi
        10
    waruqi  
    OP
       2021 年 7 月 1 日
    @3dwelcome 我自己就是刚需用户,又不是为了来钱,搞开源有几个能来钱的。。
    paoqi2048
        11
    paoqi2048  
       2021 年 7 月 2 日
    xmake 越来越好了
    3dwelcome
        12
    3dwelcome  
       2021 年 7 月 2 日
    @waruqi "我自己就是刚需用户,又不是为了来钱,搞开源有几个能来钱的。。"

    我最大的刚需,是编译 github 上各种奇奇怪怪的代码库。

    很多库用不同语言,不同平台,不同库版本依赖,不同 VC/GCC 编译器。

    如果不需要人工干预,就能无脑编译成功,那才是 xmake 最大的成功。
    waruqi
        13
    waruqi  
    OP
       2021 年 7 月 3 日 via Android
    @3dwelcome xmake 有 trybuild 模式,尽管还不能做到完全无脑,但是大部分基于 cmake/autotools/meson 的库,xmake 都会无缝对接上,通常情况下只需要无脑执行 xmake 即可编译,另外还自动对接了 android / ios 等交叉编译环境,自动传入 cmake/autoconf 实现傻瓜式编译

    不过目前也只能算是 trybuild,有一定的失败率,但也简化了不少编译过程。另外后期等 xmake-repo 仓库的 port 脚本收录到一定程度,大部分包都能在仓库被找到,那么编译过程就会简化为安装导出过程,更加的稳定。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4632 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 122ms UTC 04:05 PVG 12:05 LAX 21:05 JFK 00:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86