开发者社区> 技术小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

xmake v2.2.2 发布, 让C/C++拥有包依赖自动构建

简介:
+关注继续查看

历经四个多月,xmake终于更新了新版本v2.2.2,并且上线了重量级功能:原生支持的远程依赖包管理。

而这个特性,其实我陆陆续续写了将近一年的时间,才初步完成,对于此特性的开发进展和历史,有兴趣的同学可以看下相关issues:#69

目前的实现效果如下,完全一致的语义版本依赖描述:

add_require.png

完全一致的跨平台构建行为,一键xmake编译:

package_manage.png

完整的项目描述:

add_requires("tbox 1.6.*", "libpng ~1.16", "zlib")

target("test")
    set_kind("binary")
    add_files("src/*.c") 
    add_packages("tbox", "libpng", "zlib")

我先简单介绍下我做这个功能的背景:

我们在写C/C++程序的时候,对于第三方依赖库的使用一直是一个老大难问题,因为每个依赖库的构建系统不同、代码平台支持力度的差异,导致没法像其他高级语言那样有方便好用的包管理支持。

虽然现在已经有了homebrew, vcpkg等包管理工具来解决这一问题,但是多少都有一些局限性,例如:

  1. homebrew不支持iphoneos, android, windows平台
  2. vcpkg不支持语义版本选择,多版本管理
  3. 另外都不支持项目管理和构建

对于目前现有的跨平台构建工具,都缺少内置的包管理支持,像cmake仅提供了find_package去查找系统包,虽然可以和vcpkg等第三方包管理配合使用,但我个人觉得并不是很方便。 这会使得项目的其他用户在编译的时候,额外要求去安装vcpkg或者安装依赖库到系统上才行,对于pc平台还好弄些,对于iphoneos, android等平台的依赖库,用户就要折腾上一会了。

而xmake的理念就是:真正的一致维护, 真正的一键编译

  • 构建行为的一致性: 不管你的项目是否有库依赖,工具依赖,只需要执行一个xmake命令,即可编译通过。

  • 项目维护的一致性: 不管你的项目是在windows上用,还是给linux, iphone, android上用,都只需要一份xmake.lua维护项目即可。

而cmake还需要生成额外的第三方IDE工程文件,即使cmakelist.txt相同,但是构建、维护体验上对用户来讲都不可能保证完全一致,毕竟还受限于vc/make此类工具。

目前支持的特性

  • 语义版本支持,例如:&rdquo;>= 1.1.0 < 1.2&rdquo;, &ldquo;~1.6&rdquo;, &ldquo;1.2.x&rdquo;, &ldquo;1.*&rdquo;

  • 提供官方包仓库、自建私有仓库、项目内置仓库等多仓库管理支持

  • 跨平台包编译集成支持(不同平台、不同架构的包可同时安装,快速切换使用)

  • debug依赖包支持,实现源码调试

依赖包处理机制

这里我们简单介绍下整个依赖包的处理机制:

package_arch.png

  1. 优先检测当前系统目录、第三方包管理下有没有存在指定的包,如果有匹配的包,那么就不需要下载安装了 (当然也可以设置不使用系统包)

  2. 检索匹配对应版本的包,然后下载、编译、安装(注:安装在特定xmake目录,不会干扰系统库环境)

  3. 编译项目,最后自动链接启用的依赖包

新特性

  • 新增fasm汇编器支持

  • 添加has_config, get_config和is_config接口去快速判断option和配置值

  • 添加set_config接口去设置默认配置

  • 添加$xmake --try去尝试构建工程

  • 添加set_enabled(false)去显示的禁用target

  • #69: 添加远程依赖包管理, add_requires("tbox ~1.6.1")

  • #216: 添加windows mfc编译规则

改进

  • 改进Qt编译编译环境探测,增加对mingw sdk的支持

  • 在自动扫描生成的xmake.lua中增加默认debug/release规则

  • #178: 修改mingw平台下的目标名

  • 对于add_files()在windows上支持大小写不敏感路径模式匹配

  • 改进detect.sdks.find_qt对于Qt根目录的探测

  • #184: 改进lib.detect.find_package支持vcpkg

  • #208: 改进rpath对动态库的支持

Bugs修复

  • #177: 修复被依赖的动态库target,如果设置了basename后链接失败问题

  • 修复$xmake f --menu中Exit问题以及cpu过高问题

  • #197: 修复生成的vs201x工程文件带有中文路径乱码问题

  • 修复WDK规则编译生成的驱动在Win7下运行蓝屏问题

  • #205: 修复vcproj工程生成targetdir, objectdir路径设置不匹配问题

更多详细描述见文章:http://tboox.org/cn/2018/10/13/xmake-update-v2.2.2-package-deps/

本文来自云栖社区合作伙伴“开源中国”

本文作者ruki 

原文链接

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Flink】(十三)Flink CEP Library 使用案例分析
【Flink】(十三)Flink CEP Library 使用案例分析
62 0
Linux+XAMPP+eolinker开源版v3.2.4
eolinker是一个由国人开源的接口管理系统(AMS),特性及介绍详见开源中国-eolinker首页. 搭建步骤参考:eolinker开源指南 系统环境:CentOS Linux release 7.
1731 0
将sqlite3移植到嵌入式Linux开发板M6708上
最近,因为项目的需要,我们购买了广州致远电子有限公司的M6708-T工控板(预装Linux系统),准备将sqlite3移植到本嵌入式开发板上。
1408 0
IDEA发布应用时发布到lib下面的包不全
IDEA发布应用时发布到lib下面的包不全,Tomcate启动时就报:At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete li...
930 0
【Spark Summit EU 2016】物联网中的Lambda架构——使用Spark Streaming与MLlib进行快速数据分析
本讲义出自Bas Geerdink在Spark Summit EU 2016上的演讲,主要介绍了物联网时代新的数据形式、新的用例、新的技术以及新的挑战,并介绍了什么是快速数据以及什么是大数据,并详细地介绍了物联网中的Lambda架构,流处理和批处理的相关内容以及如何使用Spark Streaming与MLlib进行快速数据分析。
2162 0
[CLR via C#]5.3 值类型的装箱和拆箱
原文:[CLR via C#]5.3 值类型的装箱和拆箱   在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制。   下面总结了对值类型的一个实例进行装箱操作时内部发生的事:   1)在托管堆中分配好内存。
908 0
+关注
技术小能手
云栖运营小编~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
继承与功能组合
立即下载
使用C++开发PHP7扩展
立即下载
AliSQL 开源之路
立即下载