xmake 是一个基于 Lua 的轻量级现代化 C/C++跨平台构建系统,理念是:简单,高效,跨平台。
最近对 xmake 内部做了不少的重构来改进,并且新增了不少实用的新特性,欢迎来体验。
一些新特性:
xmake project -k ninja
工程生成插件,支持对 build.ninja 构建系统文件的生成一些改进点:
一些看不见的改进点:
还有一些零散的 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 config
的配置环境,复用 xmake 的平台探测和 sdk 环境检测,简化平台配置目前已支持的构建系统:
例如,对于一个使用 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 等其他构建系统加上支持。
$ 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
$ xmake f -p iphoneos --trybuild=autotools
$ xmake
$ 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 指定的构建工具已经安装能够正常使用。
如果当前项目下存在jni/Android.mk
,那么 xmake 可以直接调用 ndk-build 来构建 jni 库。
$ xmake f -p android --trybuild=ndkbuild [--ndk=]
$ xmake
目前的输入规范参考自:https://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"})
。xmake project -k ninja
,增加对 build.ninja 生成支持 1
mmqc 2020-02-24 10:28:09 +08:00
支持一下
|
2
zhuangzhuang1988 2020-02-24 10:45:47 +08:00
学不动了.
|
3
Alexhohom 2020-02-24 11:09:20 +08:00
mark,看起来很美好
|
4
waruqi OP @zhuangzhuang1988 哈哈 入门很简单 你可以先体验下
|
5
vitovan 2020-02-24 11:51:21 +08:00
看楼主整洁的发帖风格,就觉得这个工具挺靠谱
|
6
j137tt736CExzlfM 2020-02-24 12:02:38 +08:00
支持一下,不错!
|
7
ylx 2020-02-24 12:03:56 +08:00 via iPhone
可以用来编译内核吗
|