2020-06-16 17:56:08
xmake是一个基于Lua的轻量级现代化C/C++跨平台构建系统,理念是:简单,高效,跨平台。
最近对xmake内部做了不少的重构来改进,并且新增了不少实用的新特性,欢迎来体验。
项目源码 官方文档一些新特性:
一键编译其他构建系统维护的项目,实现无缝对接,并且支持交叉编译(比如autotools的快速交叉编译,见下文详述) 新增xmake project -k ninja
工程生成插件,支持对build.ninja构建系统文件的生成
一些改进点:
改进命令行参数输入,支持*nix style的参数输入,感谢@OpportunityLiu的贡献 改进tab命令补全,增加对参数values的命令补全支持 优化get.sh安装和xmake update更新脚本,添加国内镜像源,加速下载和安装更新 gcc/clang编译错误输出支持原生色彩高亮支持 新增msys/cygwin平台,并且xmake源码也支持msys/mingw平台编译一些看不见的改进点:
添加socket, pipe模块,改进process模块 重构整个进程调度器,更好的调度并行构建 重构改进整个coroutine协程模块,支持对socket/pipe/process三者的同时调度支持(为后续远程编译和分布式编译做准备)还有一些零散的bug修复,见下文更新内容。
xmake现已支持对ninja构建文件的生成,让用户可以使用ninja来快速构建xmake维护的项目。不得不承认,目前就构建速度来讲,ninja确实比xmake快不少,后续版本我会尝试优化下xmake的构建速度。
$ xmake project -k ninja
然后调用ninja来构建:
$ ninja
或者直接使用xmake命令来调用ninja构建,见下文。
xmake v2.3.1以上版本直接对接了其他第三方构建系统,即使其他项目中没有使用xmake.lua来维护,xmake也可以直接调用其他构建工具来完成编译。
那用户直接调用使用第三方构建工具来编译不就行了,为啥还要用xmake去调用呢?主要有以下好处:
完全的行为一致,简化编译流程,不管用了哪个其他构建系统,都只需要执行xmake这个命令就可以编译,用户不再需要去研究其他工具的不同的编译流程 完全对接xmake config
的配置环境,复用xmake的平台探测和sdk环境检测,简化平台配置
对接交叉编译环境,即使是用autotools维护的项目,也能通过xmake快速实现交叉编译
目前已支持的构建系统:
autotools(已完全对接xmake的交叉编译环境) xcodebuild cmake make msbuild scons meson bazel ndkbuild ninja例如,对于一个使用cmake维护的项目,直接在项目根目录执行xmake,就会自动触发探测机制,检测到CMakeLists.txt,然后提示用户是否需要使用cmake来继续完成编译。
$ xmake
note: CMakeLists.txt found, try building it (pass -y or --confirm=y/n/d to skip confirm)?
please input: y (y/n)
-- Symbol prefix:
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/ruki/Downloads/libpng-1.6.35/build
[ 7%] Built target png-fix-itxt
[ 21%] Built target genfiles
[ 81%] Built target png
[ 83%] Built target png_static
...
output to /Users/ruki/Downloads/libpng-1.6.35/build/artifacts
build ok!
目前支持xmake clean
, xmake --rebuild
和xmake config
等常用命令与第三方系统的无缝对接。
我们可以直接清理cmake维护项目的编译输出文件
$ xmake clean
$ xmake clean --all
如果带上--all
执行清理,会清除autotools/cmake生成的所有文件,不仅仅只清理对象文件。
默认xmake
对接的是增量构建行为,不过我们也可以强制快速重建:
$ xmake --rebuild
如果一个项目下有多个构建系统同时在维护,比如libpng项目,自带autotools/cmake/makefile等构建系统维护,xmake默认优先探测使用了autotools,如果想要强制切换其他构建系统,可以执行:
$ xmake f --trybuild=[autotools|cmake|make|msbuild| ..]
$ xmake
另外,配置了--trybuild=
参数手动指定了默认的构建系统,后续的build过程就不会额外提示用户选择了。
众所周知,autotools维护的项目虽然很多都支持交叉编译,但是交叉编译的配置过程很复杂,不同的工具链处理方式还有很多的差异,中途会踩到很多的坑。
即使跑通了一个工具链的交叉编译,如果切到另外一个工具链环境,可能又要折腾好久,而如果使用xmake,通常只需要两条简单的命令即可:
!> 目前就autotools对接支持了xmake的交叉编译,后期还会对cmake等其他构建系统加上支持。
交叉编译android平台
$ xmake f -p android --trybuild=autotools [--ndk=xxx]
$ xmake
!> 其中,–ndk参数配置是可选的,如果用户设置了ANDROID_NDK_HOME环境变量,或者ndk放置在~/Library/Android/sdk/ndk-bundle,xmake都能自动检测到。
是不是很简单?如果你觉得这没啥,那么可以对比下直接操作./configure
去配置交叉编译,可以看下这篇文档对比下:将NDK 与其他编译系统配合使用
说白了,你大概得这样,还不一定一次就能搞定:
$ export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
$ export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
$ export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
$ export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
$ export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
$ export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
$ export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
$ export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
$ ./configure --host aarch64-linux-android
$ make
交叉编译iphoneos平台
$ xmake f -p iphoneos --trybuild=autotools
$ xmake
交叉编译mingw平台
$ xmake f -p mingw --trybuild=autotools [--mingw=xxx]
$ xmake
使用其他交叉编译工具链
$ xmake f -p cross --trybuild=autotools --sdk=/xxxx
$ xmake
关于更多交叉编译的配置细节,请参考文档:交叉编译,除了多了一个--trybuild=
参数,其他交叉编译配置参数都是完全通用的。
我们可以通过--tryconfigs=
来传递用户额外的配置参数到对应的第三方构建系统,比如:autotools会传递给./configure
,cmake会传递给cmake
命令。
$ xmake f --trybuild=autotools --tryconfigs="--enable-shared=no"
$ xmake
比如上述命令,传递--enable-shared=no
给./configure
,来禁用动态库编译。
另外,对于--cflags
, --includedirs
和--ldflags
等参数,不需要通过--tryconfigs
,通过xmake config --cflags=
等内置参数就可透传过去。
通用编译方式
大多数情况下,每个构建系统对接后的编译方式都是一致的,除了--trybuild=
配置参数除外。
$ xmake f --trybuild=[autotools|cmake|meson|ninja|bazel|make|msbuild|xcodebuild]
$ xmake
!> 我们还需要确保–trybuild指定的构建工具已经安装能够正常使用。
构建Android jni程序
如果当前项目下存在jni/Android.mk
,那么xmake可以直接调用ndk-build来构建jni库。
$ xmake f -p android --trybuild=ndkbuild [--ndk=]
$ xmake
目前的输入规范参考自:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
也非常感谢@OpportunityLiu的贡献,现在的输入方式,可以支持采用如下写法:
$ xmake -j8 -rvD
之前只能这么写:
$ xmake -j 8 -r -v -D
之前的版本,只能对参数名进行补全,现在可以对参数值进行补全和值列表提示,比如敲如下命令后:
$ xmake f --plat=and
按tab键就可以补全platform参数,变成
$ xmake f --plat=android
xmake新增一个配置参数,可以指定源文件的类型,强制作为对应的源文件来编译,比如将c代码作为c++来编译。
target("test")
set_kind("binary")
add_files("src/*.c", {sourcekind = "cxx"})
*.c
作为c++代码编译, add_files("*.c", {sourcekind = "cxx"})
。
#681: 支持在msys/cygwin上编译xmake,以及添加msys/cygwin编译平台
添加socket/pipe模块,并且支持在协程中同时调度process/socket/pipe
#192: 尝试构建带有第三方构建系统的项目,还支持autotools项目的交叉编译
启用gcc/clang的编译错误色彩高亮输出
#588: 改进工程生成插件xmake project -k ninja
,增加对build.ninja生成支持
系统出现:windows无法验证此驱动程序软件的发布者
04-17
通过python和websocket构建实时通信系统[扩展saltstack监控]
06-27
系统下不停提示“正在安装新键盘,点按可选择要使用此键盘执行的操作”
07-17
Atom 1.44.0 发布,GitHub 推出的跨平台文本编辑器
07-07
Bouyei.Geo 1.0 GIS 空间格式处理解析发布
04-26
Byteman 4.0.11 发布,Java 字节码注入工具
06-03
Clojure 发布年度调查报告:用于开发企业软件的比例历史最高
05-23
Firefox 73 正式发布
04-29
GitHub是如何无缝迁移到Kubernetes的?
04-20
Lenovo G550在Windows XP操作系统下触控板驱动安装方法
07-17
Linux lsmod显示已载入系统的模块命令详解
07-24
Material UI 4.9.2 发布,Material Design React 组件
05-20
PHP 5.2/5.3 Hash漏洞补丁发布
07-15
Pale Moon 28.8.2.1 发布,苍月浏览器
06-11
Q4OS 4.0 测试版本发布,基于 Debian 的桌面发行版
04-27
Redhat5系统安装网卡驱动报错
07-21
Scheme 实现 GNU Guile 3.0.0 发布,性能大幅提升
05-09
ShowDoc v2.6.1 发布,IT 团队的在线 API 文档工具
03-15
Spring Security 5.3.0.RC1 发布,Spring 安全框架
06-05
T270 G5服务器liunx系统运行过程报“nautilus崩溃”错误的原因?
07-18
d3d9(系统文件)2021 绿色版
530.9K
下载gghost一键恢复(系统备份还原工具)v10.03.09 中文版
14.5M
下载ghost11(系统ghost工具箱)v11.0 中文版
15.8M
下载hwinfo32(系统信息检测工具) v7.05.4490 中文版
10.1M
下载mt4(多帐户云跟单管理系统)v4.0 免费版
3.2M
下载ntbootautofix(多系统修复软件)v2.5.7 免费版
736.6K
下载oa系统下载
2.7M
下载packet.dll(Windows系统文件)2021 免费版
14.7K
下载xlive(系统U盘安装软件) v1.0 官方版
21.3MB
下载aida32下载
3.37MB
下载cinebench r15下载
108.1M
下载everest ultimate edition下载
6.7M
下载msvcp100下载
133.8K
下载proteus下载
371.9MB
下载wpcap.dll下载
0.1MB
下载