当前位置: 首页 > 工具软件 > xmake-idea > 使用案例 >

xmake更新3

羊舌勇
2023-12-01

v2.0.1

任务,插件,导出工程,生成文档,自定义宏脚本,类库,
绑定宏选项,简化模板
可扩展性:插件/工程模板/平台/架构/动作/选项/任务/宏脚本都可扩展.
目标:实现一人移植,万人使用.
增加了键值风格:

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.

v2.1.5

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_hset_config_h_prefix接口
add_csnippet,add_cxxsnippetoption
find_program,find_file,find_library,find_toolfind_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})

目标/选项可继承库/库目录.

v2.1.7

目标/选项/包批量导入模块的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")
//菜单路径.

v2.2.1

支持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")

v2.2.1

set_tools和add_tools为目标设置工具链.
mode.debug,mode.release,mode.profile和mode.check内建规则
支持yasm汇编器

v2.2.2

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.

v2.2.3

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")

v2.2.5

string.serializestring.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.

v2.2.6

可直接编译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"})
//这样

v2.2.7

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覆盖系统环境.

 类似资料: