v2.3.1
1,无缝交叉编译
. 2,用xmake project -k ninja
生成ninja
构建配置. 添加socket,pipe
模块,改进process
模块.重构进程调度器
,并行调度建设.重构协程模块
,准备远程
和分布式
编译. 生成后,用$ ninja
构建. 无xmake.lua
,可调用其它施工工具
来完成编译. 只管xmake
就行,对接xmake config
配置环境,重用xmake
平台探测和sdk
环境检测,简化平台配置 目前支持autotools xcodebuild cmake make msbuild scons meson bazel ndkbuild ninja
. 可对接xmake clean, xmake --rebuild和xmake config
命令.
$ xmake clean $ xmake clean --all //可清理第三方 $ xmake --rebuild //强制构建
可试构建
$ xmake f --trybuild=[autotools|cmake|make|msbuild| ..] $ xmake
快速交叉编译
$ xmake f -p android --trybuild=autotools [--ndk=xxx] $ xmake // $ 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 //交叉编译工具链.
ANDROID_NDK_HOME
环境变量. 用--tryconfigs=
传递用户配置
.
$ xmake f --trybuild=autotools --tryconfigs="--enable-shared=no" //禁用动态编译 $ xmake
而xmake config --cflags=
可透传,--cflags
,--includedirs
和--ldflags
同样如此
$ xmake f --trybuild=[autotools|cmake|meson|ninja|bazel|make|msbuild|xcodebuild] //用
其他工具编译. $ xmake // $ xmake f -p android --trybuild=ndkbuild [--ndk=] $ xmake //
命令风格:
$ xmake -j8 -rvD //替代 $ xmake -j 8 -r -v-D
按C++
编译C
.
target("test")
set_kind("binary")
add_files("src/*.c", {
sourcekind = "cxx"})
v2.3.2
加速构建
.多目标
同时构建.并行
链接无依赖目标,细粒化调度.
v2.3.4
解耦平台与工具链
,
$ xmake f -p windows --toolchain=clang
//不仅仅是
xmake f -p windows
//原来的默认用msvc
内置了常用
工具链,避免交叉编译工具链
复杂配置
过程,只需传递工具链名到--toolchain=xxx
即可.
$ xmake f -p cross --toolchain=llvm --sdk="C:\Program Files\LLVM"
$ xmake
//用llvm
内置工具链
,只需要设置--toolchain=
和--sdk=
. 显示支持的工具链
$ xmake show -l toolchains
同步切换工具链:
$ xmake f --toolchain=clang
$ xmake
一个切换,一堆工具都切换了.
$ xmake f --toolchain=gcc
$ xmake
//切换回来.
自定义工具链
toolchain("myclang")
set_kind("standalone")
set_toolset("cc", "clang")
set_toolset("cxx", "clang", "clang++")
set_toolset("ld", "clang++", "clang")
set_toolset("sh", "clang++", "clang")
set_toolset("ar", "ar")
set_toolset("ex", "ar")
set_toolset("strip", "strip")
set_toolset("mm", "clang")
set_toolset("mxx", "clang", "clang++")
set_toolset("as", "clang")
-- ...
在xmake f --sdk=xx
探测工具. 还可针对,特定项目切换工具链
.
target("test")
set_kind("binary")
add_files("src/*.c")
set_toolchains("clang", "yasm")
//完整切换.
设置主题:
$ xmake g --theme=ninja
构建策略
set_policy("check.auto_ignore_flags", false)
target("test")
set_policy("check.auto_ignore_flags", false)
//局部目标也可以
列举当前策略配置:
$ xmake l core.project.policy.policies
默认,检测所有add_cxflags, add_ldflags
标志,但有时不需要. set_policy
对目标/项目
直接禁用默认
自动检测
行为.
set_policy("check.auto_ignore_flags", false)
target("test")
add_ldflags("-static")
check.auto_map_flags
自动映射,可能用户需要原始配置
. 用set_policy("check.auto_map_flags", false)
来取消映射.
set_policy("build.across_targets_in_parallel", false)
//禁用并行构建
新增编译模式
add_rules("mode.releasedbg")
//==
if is_mode("releasedbg") then
set_symbols("debug")
set_optimize("fastest")
set_strip("all")
end
最小大小
add_rules("mode.minsizerel")
//==
if is_mode("minsizerel") then
set_symbols("hidden")
set_optimize("smallest")
set_strip("all")
end
显示:
$ xmake show
//显示自身信息
$ xmake show -l toolchains
//显示工具链
$ xmake show --target=tbox
//显示目标配置
$ xmake show -l modes
//内置编译模式列表
$ xmake show -l rules
//内置编译规则列表
$ xmake show --help
//显示显示帮助
用xmake f --menu
来可视化配置.
target("buildvm")
set_kind("binary")
add_files("src/*.c")
set_toolchains("xcode", {
plat = os.host(), arch = os.arch()})
//特定目标工具链
target("luajit")
set_kind("static")
add_deps("buildvm")
add_files("src/*.c")
//其他主机.
针对不同平台,自动选用当前平台可用主机
工具链.
target("buildvm")
set_kind("binary")
add_files("src/*.c")
set_plat(os.host())
set_host(os.arch())
//自动设置,而非手动.
//直接设置特定`target`到主机平台,可内部自动选择`host`工具链了
target("luajit")
set_kind("static")
add_deps("buildvm")
add_files("src/*.c")
下载
$ xmake g --pkg_searchdirs="/download/packages"
//设置下载搜索目录.
$ xmake require --info zlib
-> searchdirs: /download/packages
-> searchnames: zlib-1.2.11.tar.gz
//搜索包名.
默认,msvc
的/GL
最小目标.
xmake show -l envs
//显示内置环境变量
add_files("src/*.c", {
rules = {
"xx", override = true}})
//重写内建规则.
内置tinyc
编译器,有winapi
,可开始写c
程序.
xmake f --toolchain=[tinyc|emscripten] xmake
//避免安装VS
用trybuild
迅速编译autotools/cmake
维护项目. 可快速对接android/ios/mingw
等交叉编译环境.
xmake f -p cross --sdk=/xxx
更多通用交叉工具链. 检测到autotools
,自动调用./configure; make
来编译. cmake
,则调用cmake
生成makefile/build.ninja
来编译. xmake -r
重新编译,xmake clean
统一清理,xmake -v
细节. xmake
对接cmake
交叉编译
xmake f -p android --trybuild=cmake --ndk=/xxx
xmake
//安卓
xmake f -p iphoneos --trybuild=cmake
xmake
//ios
xmake f -p mingw --trybuild=cmake --mingw=/sdk/xxx
xmake
用--trybuild=cmake
,启用cmake
的尝试编译模式,用-p android/iphoneos/mingw
切换到平台,对接对应工具,来实现交叉
编译. 用户不必关心不同工具链的配置
.还可用
xmake f -p iphoneos -a arm64 --trybuild=cmake
快速切换架构. 最好尽量用xmake.lua
.xmake
会更完美支持交叉编译
.
xmake f -p iphoneos
xmake
//或
xmake f -p android --ndk=/xxx
xmake
直接编译的.
对远程包支持交叉编译
add_requires("pcre2")
target("test")
set_kind("binary")
add_files("src/*.cpp")
add_packages("pcre2")
直接,用
xmake f -p iphoneos
xmake
切换平台.
xmake g --network=private
私有网络,不从官方包
下载.
xmake require --export
递归导出第3方依赖.
v2.3.8
支持icc
工具链.
$ xmake f --toolchain=icc
$ xmake
升级luajit
.
$ xmake f --toolchain=ifort
$ xmake
intel
的Fortran
.
xmake f -p wasm
支持emcc
工具链.
$ xmake create -t qt.quickapp_static quickapp
//静态链接
add_rules("mode.debug", "mode.release")
includes("qt_add_static_plugins.lua")
//配置必须插件.
target("demo")
add_rules("qt.quickapp_static")
//启用编译规则.
add_headerfiles("src/*.h")
add_files("src/*.cpp")
add_files("src/qml.qrc")
add_frameworks("QtQuickControls2", "QtQuickTemplates2")
qt_add_static_plugins("QtQuick2Plugin", {
linkdirs = "qml/QtQuick.2", links = "qtquick2plugin"})
qt_add_static_plugins("QtQuick2WindowPlugin", {
linkdirs = "qml/QtQuick/Window.2", links = "windowplugin"})
qt_add_static_plugins("QtQuickControls2Plugin", {
linkdirs = "qml/QtQuick/Controls.2", links = "qtquickcontrols2plugin"})
qt_add_static_plugins("QtQuickTemplates2Plugin", {
linkdirs = "qml/QtQuick/Templates.2", links = "qtquicktemplates2plugin"})
//编译
$ xmake f -p wasm [--qt=~/Qt]
$ xmake
设置平台,指定qt
根目录.打开,即可运行
. set_fpmodels()
设置浮点编译模式,级别有fast, strict, except, precise
.
set_fpmodels("fast")
set_fpmodels("strict")
set_fpmodels("fast", "except")
set_fpmodels("precise") -- defaul
启用openmp
add_requires("libomp", {
optional = true})
//加依赖
target("loop")
set_kind("binary")
add_files("src/*.cpp")
add_rules("c++.openmp")
//加规则.
//或add_rules("c.openmp")
add_packages("libomp")
如果c/C++
混合编译,则要加两个规则
.
set_languages("c17")
//置语言
不同架构
$ xmake f -p mingw -a arm64
$ xmake
快速集成,linux, macOS, windows, mingw, bsd, msys, iphoneos, android
八大平台. 跨平台集成C/C++
远程依赖库
add_requires("tbox >1.6.1", "libuv master", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8")
add_requires("conan::openssl/1.1.1g", {
alias = "openssl", optional = true, debug = true})
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("tbox", "libuv", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8", "openssl")
集成了vcpkg::,brew::
和conan::
等空间, 加了Zig
空工程模板
xrepo
$ xrepo install zlib tbox
//安装包.
$ xrepo install -p iphoneos -a arm64 zlib
$ xrepo install -p android [--ndk=/xxx] zlib
$ xrepo install -p mingw [--mingw=/xxx] zlib
$ xrepo install -p cross --sdk=/xxx/arm-linux-musleabi-cross zlib
//指定平台
$ xrepo install -m debug zlib
//调试
$ xrepo install -k shared zlib
//动态
$ xrepo install -f "vs_runtime=MD" zlib
$ xrepo install -f "regex=true,thread=true" boost
//指定配置
$ xrepo install brew::zlib
$ xrepo install vcpkg::zlib
$ xrepo install conan::zlib/1.2.11
$ xrepo install pacman:libpng
$ xrepo install dub:log
//第三方包
$ xrepo fetch pcre2
//查找包信息
$ xrepo fetch --ldflags openssl
$ xrepo fetch --cflags openssl
//
$ xrepo export -o /tmp/output zlib
//导出安装包(库/头文件)
$ xrepo import -i /xxx/packagedir zlib
//导入
$ xrepo search vcpkg::pcre
//搜索第3方包
$ xrepo env --show luajit
//查看包环境
$ xrepo env luajit
//加载包环境并运行
$ xrepo env -b "luajit 2.x" luajit
$ xrepo env -p iphoneos -b "zlib,libpng,luajit 2.x" cmake ..
$ xrepo info zlib
//查看包信息
$ xrepo remove --all
$ xrepo remove --all zlib pcr*
//卸载
包支持交叉编译
add_requires("zlib", "openssl")
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("zlib", "openssl")
//依赖包.
$ xmake f -p cross --sdk=/tmp/arm-linux-musleabi-cross
//切换平台.
自动拉取,然后用arm-linux-musleabi-cross
编译安装,自动集成.
$ xrepo search -p cross zli*
模糊查询.set_license
设置目标的许可
. 支持pacman
集成,
add_requires("libcurl 7.73.0", {
verify = false})
//取消验证sha256
增强交叉编译
toolchain("my_toolchain")
set_kind("standalone")
//独立
set_sdkdir("/tmp/arm-linux-musleabi-cross")
//sdk目录
toolchain_end()
target("hello")
set_kind("binary")
add_files("apps/hello/*.c")
就可手动--toolchain=my_toolchain
来切换到此工具链
.
toolchain("my_toolchain")
set_kind("standalone")
set_sdkdir("/tmp/arm-linux-musleabi-cross")
toolchain_end()
target("hello")
set_kind("binary")
add_files("apps/hello/*.c")
set_toolchains("my_toolchain")
//绑定工具链.
对嵌入式
开发来讲尤其
有用,因为嵌入式
平台的交叉编译工具链非常多,经常需要切换
来完成不同平台的编译
.
includes("toolchains/*.lua")
//工具链们
target("hello")
set_kind("binary")
add_files("apps/hello/*.c")
if is_plat("myplat1") then
set_toolchains("my_toolchain1")
//根据不同平台,设置工具链.
elseif is_plat("myplat2") then
set_toolchains("my_toolchain2")
end
快速切换
xmake f -p myplat1
xmake
更复杂的,用set_toolset,set_cross
和set_bindir
等
toolchain("my_toolchain")
set_kind("standalone")
set_sdkdir("/tmp/arm-linux-musleabi-cross")
on_load(function (toolchain)
-- 对架构,加工具链.
if toolchain:is_arch("arm") then
toolchain:add("cxflags", "-march=armv7-a", "-msoft-float", {
force = true})
toolchain:add("ldflags", "-march=armv7-a", "-msoft-float", {
force = true})
end
toolchain:add("ldflags", "--static", {
force = true})
toolchain:add("syslinks", "gcc", "c")
end)
加add_sysincludedirs
系统头包含目录,依赖包,默认用-isystem
.
v2.5.1
支持zig
. xmake f --menu
图形化配置. add_requireconfs
配置子包及子依赖.
add_requires("zlib")
add_requireconfs("zlib", {
configs = {
shared = true}})
//==
add_requires("zlib", {
configs = {
shared = true}})
多个要求时,可简化配置
add_requireconfs("*", {
configs = {
shared = true}})
//统一配置,
add_requires("zlib")
add_requires("pcre")
add_requires("libpng")
add_requires("libwebp")
//前面都是动态,下面为静态
add_requires("libcurl", {
configs = {
shared = false}})
多个配置.
add_requires("zlib 1.2.11")
add_requireconfs("zlib", {
override = true, version = "1.2.10"})
//覆盖前面的配置
add_requireconfs
用来改写特定包的配置. 如
add_requires("libpng", {
configs = {
shared = true}})
libpng
,用动态库,而内部zlib
为静态库,要改zlib
为动态
,则:
add_requires("libpng", {
configs = {
shared = true}})
add_requireconfs("libpng.zlib", {
configs = {
shared = true}})
//该项内部也是动态.
add_requires("libpng")
add_requireconfs("libpng.zlib", {
version = "1.2.10"})
//还可改版本.
递归依赖:
add_requires("libwebp")
add_requireconfs("libwebp.**|cmake", {
configs = {
cxflags = "-DTEST"}})
对子项目,全改配置.用|
来排除,如果只*
,则只是单级子项目改. set_group
来分组目标
.
add_rules("mode.debug", "mode.release") target("test1") set_kind("binary") add_files("src/*.cpp") set_group("group1") target("test2") set_kind("binary") add_files("src/*.cpp") set_group("group1") target("test3") set_kind("binary") add_files("src/*.cpp") set_group