任务,插件,导出工程,生成文档,自定义宏脚本,类库,
绑定宏选项,简化模板
可扩展性:插件/工程模板/平台/架构/动作/选项/任务/宏脚本
都可扩展.
目标:实现一人移植,万人使用
.
增加了键值风格:
target
{
name = "test",
defines = "DEBUG",
files = {"src/*.c", "test/*.cpp"}
}
//
option
{
name = "demo",
default = true,
showmenu = true,
category = "option",
desciption = {"描述", " =y|n"}
}
//任务
task
{
name = "hello",
run = (function ()
-- trace
print("hello xmake!")
end),
menu = {
-- 用法
usage = "xmake hello [options]"
-- 描述
, description = "Hello xmake!"
-- 选项
, options = {}
}
}
智能代码扫描
.不用写描述
,在此
任务/宏/动作/选项/插件/模板
.
允许在子工程,用xmake
构建.add_rpathdirs
允许自动加载动态库
.
加$(programdir)/$(xmake)
内置变量,加is_host
.
find_package,find_library,find_file
查找.
检测:has_features, has_flags, has_cincludes, has_cfuncs
.检测代码片
.
可导出compile_commands.json
.
target("test")
set_kind("binary")
add_files("*.c")
on_load(function (target)
import("lib.detect.find_package")
target:add(find_package("zlib"))
//找到包,则加包.加包,一次性加了相应设施.
//如`links,includedirs`和`linkdirs`
end)
//
option("zlib")
set_showmenu(true)
before_check(function (option)
import("lib.detect.find_package")
option:add(find_package("zlib"))
end)
target("test")
add_options("zlib")
用选项/找包
来更好管理包
.
$ xmake f --zlib=n
$ xmake
//=n来禁用
远程管理包:
add_requires("mbedtls master optional")
add_requires("pcre2 >=1.2.0", "zlib >= 1.2.11")
add_requires("git@github.com:glennrp/libpng.git@libpng >=1.6.28")
target("test")
add_packages("pcre2", "zlib", "libpng", "mbedtls")
管理模块:
add_moduledirs("$(projectdir)/xmake/modules")
//最前面,指定模块目录.
可找到自定义
扩展模块.
projectdir
- xmake
- modules
- detect/package/find_openssl.lua
扩展了find_package
函数,找包顺序:
1,指定packagedirs
,找*.pkg
.
2,指定模块目录下有detect.packages.find_xxx
.
3,系统
时,且有pkg-config
,则找其提供目录.
用core.tool.compiler
下的compiler.has_features
判断编译器
特性.
target("test")
on_load(function (target)
import("core.tool.compiler")
if compiler.has_features("cxx_constexpr") then
target:add("defines", "HAS_CXX_CONSTEXPR=1")
end
end)
可看编译器
特征.
lib.detect.has_cincludes/lib.detect.has_cxxincludes
检测C/C++
头文件.
has_cfuncs/has_cxxfuncs
检查C/C++
函数
has_ctypes/has_cxxtypes
检查类型.
check_cxsnippets
是否编译,类似d
的编译
接口了.
set_precompiled_header("header.h|header.hpp")
//设置预编译头.`xmake.lua`所在为基路径
xmake project -k compile_commands
//编译命令.
生成编译数据库文件
用于外部工具.帮助在此
option:enable(false)
//禁用选项.
print(val("host"))
print(val("env PATH"))
打印内置变量.
target("test1")
set_kind("static")
set_files("*.c")
target("test2")
set_kind("static")
set_files("*.c")
target("demo")
add_deps("test1", "test2")
-- 会自动链接依赖目标,不用再配置.
且可级联.
lib.detect.find_tool
找工具.
local tool = find_tool("clang", {check = "--help"})
local tool = find_tool("clang", {check = function (tool) os.run("%s -h", tool) end})
local tool = find_tool("clang", {version = true, {pathes = {"/usr/bin", "/usr/local/bin", "$(env PATH)", function () return "/usr/xxx/bin" end}})
includes
代替加子目录/加子文件
.
用set_config_header
替代老的set_config_h
和set_config_h_prefix
接口
add_csnippet,add_cxxsnippet
到option
加find_program,find_file,find_library,find_tool
和find_package
接口.用val()
取内置变量.
val("host"), val("env PATH"), val("shell echo hello")和val("reg HKEY_LOCAL_MACHINE\\XX;Value")
支持.rc
资源文件.
加add_frameworkdirs/add_moduledirs
接口.
xmake f -p cross
用于交叉编译.
依赖库,自动加includes和links
.
废弃add_bindings和add_rbindings
set_config_header("config.h", {prefix = ""})
//配置头.
target("test")
on_load(function (target)
import("core.tool.compiler")
for feature, _ in pairs(compiler.features("cxx", {target = target})) do
-- 传入`target`在检测特性时继承`target`的所有编译配置
target:add("defines", "has_feature_" .. feature)
end
end)
//批量检测特征
更细控制文件
target("test")
add_defines("TEST1")
add_files("src/*.c")
add_files("test/*.c", "test2/test2.c", {defines = "TEST2", languages = "c99", includedirs = ".", cflags = "-O0"})
最后参数,设置指定文件
编译选项.
加依赖,允许禁止:
add_deps("test", {inherit = false})
目标/选项
可继承库/库目录
.
为目标/选项/包
批量导入模块的add_imports
.
xmake l package.manager.install xxx
一致安装包.
xmake macro ..
运行上次命令.
文档仓库
xmake的vim插件
xmake f --menu
图形化配置.
rule("man")
add_imports("core.project.rule")
//加脚本.
on_build(function (target, sourcefile)
rule.build("markdown", target, sourcefile)
end)
set_category
设置选项分级路径.
set_values("a", "b", "c")
选项值为a|b|c
.
set_category("root/submenu/submenu2")
//菜单路径.
支持QT
xmake create -l c++ -t console_qt test
$ xmake create -l c++ -t static_qt test
$ xmake create -l c++ -t shared_qt test
$ xmake create -l c++ -t quickapp_qt test
//空工程,简单示例:
target("qt_demo")
-- 加规则
add_rules("qt.application")
-- 加头
add_headers("src/*.h")
-- 加文件
add_files("src/*.cpp")
add_files("src/qml.qrc")
-- 加框架
add_frameworks("QtQuick")
默认,自动检测qt
,也可手动
$ xmake f --qt=~/Qt/Qt5.9.1
//qt静态库
target("test")
add_rules("qt.static")
add_files("src/*.cpp")
add_frameworks("QtNetwork", "QtGui")
用add_frameworks
加框架.
target("qt_widgetapp")
add_rules("qt.application")
add_files("src/*.cpp")
add_files("src/mainwindow.ui")
//ui接口文件,表明是`Widgets`应用.
add_files("src/mainwindow.h")
-- 加带`Q_OBJECT`的`meta`头文件
add_frameworks("QtWidgets")
set_tools和add_tools
为目标设置工具链
.
加mode.debug,mode.release,mode.profile和mode.check
内建规则
支持yasm
汇编器
加C++/C
自动包依赖.
add_requires("tbox 1.6.*", "libpng ~1.16", "zlib")
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("tbox", "libpng", "zlib")
//直接使用最新包.
理念:一致维护/一键编译
.
机制
:系统目录/第三方包管理
再下载
.编译时自动链接
启用依赖包
.
也可指定分支:
add_requires("tbox master")
add_requires("tbox dev")
//
add_requires("tbox", {optional = true})
//可选包
add_requires("tbox", {system = false})
//不用系统库时,可禁用
add_requires("tbox", {debug = true})
//调试依赖版本.
add_requires("tbox", {config = {small=true}})
//传递参数
加私有仓库:
$ xmake repo --add myrepo git@github.com:myrepo/xmake-repo.git
add_repositories("my-repo git@github.com:myrepo/xmake-repo.git")
或包仓库:
projectdir
- myrepo
//私有包仓库
- packages
- t/tbox/xmake.lua
- z/zlib/xmake.lua
- src
- main.c
- xmake.lua
add_repositories("my-repo myrepo")
$ xmake require
手动显示仓库
依赖.
$ xmake require tbox
//安装
$ xmake require -f -v tbox "1.5.x"
xmake require --extra="debug=true,config={small=true}" tbox
//额外信息
$ xmake require --list
//列举已安装包
$ xmake repo -u
//更新
用has_config, get_config和is_config
判断选项和配置值.
set_enabled(false)
显式禁用目标.支持fasm
.
detect.sdks.find_qt
探测qt.
xmake update
更新.支持cparser
,
add_syslinks
系统库,
xmake l time xmake [--rebuild]
记录编译耗时
xmake f --vs_sdkver=10.0.15063.0
//修改sdk版本
每天第一次构建时,自动清理最近30
天的临时文件
xmake update
xmake plugin --install
//管理插件
add_syslinks("pthread", "m", "dl")
target("demo")
add_links("a", "b")
add_linkdirs("$(buildir)/lib")
//系统链接在最后.
before_build_file/on_build_file/after_build_file
勾挂用户编译过程
target("test")
set_kind("binary")
add_files("src/*.c")
-- 兼容xp
add_defines("_USING_V140_SDK71_")
add_ldflags("/SUBSYSTEM:CONSOLE,5.01")
xmake f --vs_toolset=14.0
$ xmake
//指定版本.
$ xmake f --vs_sdkver=10.0.15063.0 -c
$ xmake project -k vs2015
//
-- 默认会有`ncurses,panel,form`等`links`
add_requires("ncurses")
target("test")
-- 显式指定,只用`ncurses`库
add_packages("ncurses",{links="ncurses"})
//
add_requires("lua")
target("test")
add_packages("lua", {links = {}})
//禁用库,只用头文件
add_requires("openssl", {group = "ssl", optional = true})
add_requires("mbedtls", {group = "ssl", optional = true})
//同组依赖包,只能`启用`一个库
//分组依赖包.
target("test")
add_packages("openssl", "mbedtls")
string.serialize
和string.deserialize
来序列,反序化对象
target:installdir()和set_installdir()
,置安装目录.
add_platformdirs
自定义扩展平台.
add_installfiles
,自定义安装文件.
add_configfiles和set_configvar
,
xmake project
支持生成CMakelist.txt
.
用private, public, interface
继承目标配置.
add_configs()
加自定义配置到包
.
add_headerfiles
,加头文件.
xmake update dev
更新分支.
option.add_features,option.add_cxxsnippets和option.add_csnippets
支持yasm
.
可直接编译Qt/Android
xmake create -t quickapp_qt -l c++ appdemo
cd appdemo
xmake f -p android --ndk=~/Downloads/android-ndk-r19c/ --android_sdk=~/Library/Android/sdk/ -c
xmake install
//安装到设备
option("test1", {default = true, showmenu = true, description = "test1 option"})
option("test2", {default = true, showmenu = true})
option("test3", {default = "hello"})
target("demo", {kind = "binary", files = "src/*.c"})
//这样
on_link, before_link和after_link
链接时
支持lex/flex,yacc/bison
target("calc")
set_kind("binary")
add_rules("lex", "yacc")
add_files("src/*.l", "src/*.y")
set_rundir("$(projectdir)/xxx")
//设置运行目录
add_runenvs("PATH", "/tmp/bin", "xxx/bin")
add_runenvs("NAME", "value")
//加运行时环境
add_cucodegens()
改进cuda
生成代码.
add_cleanfiles
定制清理文件.
set_runenv
覆盖系统环境.