# API [链接](https://www.bookstack.cn/read/xmake/manual-project_target.md) `api("param1","param2",...,dict_prop)` `on_script("dir.file") || on_script(function(...) end) ` ## [命名规范](https://www.bookstack.cn/read/xmake/manual-specification.md) 接口的命名,是有按照预定义的一些规范来命名的,这样更加方便理解和易于使用,目前命名按照如下一些规则: | 接口规则 | 描述 | | ----------------------- | ------------------------------------------------------------ | | `is_`, `has_`前缀的接口 | 表示为条件判断 | | `set_`前缀的接口 | 表示为覆盖设置 | | `add_`前缀的接口 | 表示为追加设置 | | `s`后缀的接口 | 表示支持多值传入,例如:`add_files("*.c", "test.cpp")` | | `on_`前缀的接口 | 表示为覆盖内置脚本 | | `before_`前缀的接口 | 表示为在内置脚本运行前,执行此脚本 | | `after_`前缀的接口 | 表示为在内置脚本运行后,执行此脚本 | | `scope("name")`的接口 | 表示为定义一个描述域,例如:`target("xxx")`, `option("xxx")` | | 描述域/描述设置 | 建议缩进表示 | ## [条件判断](https://www.bookstack.cn/read/xmake/manual-conditions.md) 条件判断的api,一般用于必须要处理特定平台的编译逻辑的场合。。通常跟lua的if语句配合使用。 | 接口 | 描述 | 支持版本 | | ------------------------------------------------------------ | ---------------------------- | ----------------------- | | [is_os](https://www.bookstack.cn/read/xmake/manual-conditions.md#is_os) | 判断当前构建目标的操作系统 | >= 2.0.1 | | [is_arch](https://www.bookstack.cn/read/xmake/manual-conditions.md#is_arch) | 判断当前编译架构 | >= 2.0.1 | | [is_plat](https://www.bookstack.cn/read/xmake/manual-conditions.md#is_plat) | 判断当前编译平台 | >= 2.0.1 | | [is_host](https://www.bookstack.cn/read/xmake/manual-conditions.md#is_host) | 判断当前主机环境操作系统 | >= 2.1.4 | | [is_mode](https://www.bookstack.cn/read/xmake/manual-conditions.md#is_mode) | 判断当前编译模式 | >= 2.0.1 | | [is_kind](https://www.bookstack.cn/read/xmake/manual-conditions.md#is_kind) | 判断当前编译类型 | >= 2.0.1 | | [is_option](https://www.bookstack.cn/read/xmake/manual-conditions.md#is_option) | 判断选项是否启用 | >= 2.0.1 < 2.2.2 已废弃 | | [is_config](https://www.bookstack.cn/read/xmake/manual-conditions.md#is_config) | 判断指定配置是否为给定的值 | >= 2.2.2 | | [has_config](https://www.bookstack.cn/read/xmake/manual-conditions.md#has_config) | 判断配置是否启用或者存在 | >= 2.2.2 | | [has_package](https://www.bookstack.cn/read/xmake/manual-conditions.md#has_package) | 判断依赖包是否被启用或者存在 | >= 2.2.3 | ## 特殊字符 ### 正则表达式 ```lua -- 递归添加src下的所有c文件,但是不包括src/impl/下的所有c文件 add_files("src/**.c|impl/*.c") -- 添加src下的所有cpp文件,但是不包括src/test.cpp、src/hello.cpp以及src下所有带xx_前缀的cpp文件 add_files("src/*.cpp|test.cpp|hello.cpp|xx_*.cpp") -- 批量导入配置文件 includes("test/**/xmake.lua") ``` ### [内置变量](https://www.bookstack.cn/read/xmake/manual-builtin_variables.md) ```lua target("test") -- 添加工程源码目录下的源文件 add_files("$(projectdir)/src/*.c") -- 添加构建目录下的头文件搜索路径 add_includedirs("$(buildir)/inc") ``` | 接口 | 描述 | 支持版本 | | ------------------------------------------------------------ | --------------------------- | -------- | | [$(os)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varos) | 获取当前编译平台的操作系统 | >= 2.0.1 | | [$(host)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varhost) | 获取本机操作系统 | >= 2.0.1 | | [$(tmpdir)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#vartmpdir) | 获取临时目录 | >= 2.0.1 | | [$(curdir)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varcurdir) | 获取当前目录 | >= 2.0.1 | | [$(buildir)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varbuildir) | 获取构建输出目录 | >= 2.0.1 | | [$(scriptdir)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varscriptdir) | 获取工程描述脚本目录 | >= 2.1.1 | | [$(globaldir)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varglobaldir) | 获取全局配置目录 | >= 2.0.1 | | [$(configdir)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varconfigdir) | 获取本地工程配置目录 | >= 2.0.1 | | [$(programdir)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varprogramdir) | xmake安装脚本目录 | >= 2.1.5 | | [$(projectdir)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varprojectdir) | 获取工程根目录 | >= 2.0.1 | | [$(shell)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varshell) | 执行外部shell命令 | >= 2.0.1 | | [$(env)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varenv) | 获取外部环境变量 | >= 2.1.5 | | [$(reg)](https://xmake.io/mirror/zh-cn/manual/builtin_variables.html#varreg) | 获取windows注册表配置项的值 | >= 2.1.5 | ## 模块接口 ### [内置模块](https://www.bookstack.cn/read/xmake/manual-builtin_modules.md) ### [扩展模块](https://www.bookstack.cn/read/xmake/manual-extension_modules.md) ### 常用接口 - import - includes ## 测试 ```lua on_test(function (package) assert(package:has_cxxfuncs("func1", {includes = "xxx.h", configs = {defines = "c++14", cxflags = "-Dxxx"}})) end) on_test(function (package) assert(package:check_cxxsnippets({test = [[ #include #include #include #include using namespace boost::algorithm; using namespace std; static void test() { string str("a,b"); vector strVec; split(strVec, str, is_any_of(",")); assert(strVec.size()==2); assert(strVec[0]=="a"); assert(strVec[1]=="b"); } ]]}, {configs = {languages = "c++14"}})) end) ``` # 项目配置 ## [config.lua](https://www.bookstack.cn/read/xmake/guide-configuration.md) 相当于命令行配置,优先级最高 ### 类型 本地配置会覆盖全局配置 - 全局配置 - 所有项目生效 - 本地配置 - 本地项目生效 ### 作用 - 设置编译选项 - 设置环境变量 - 设置项目配置 ## xmake.lua ```lua -- 全局根作用域,影响所有target,包括includes() 中的子工程target设置 add_defines("DEBUG") option("test") set_default(false) -- 显示结束作用域 option_end() -- 隐式结束上一个作用域 target("demo") set_kind("binary") add_files("src/*.c") target_end() ``` ### 配置域 `set_xxx`/`add_xxx`的配置集,用于静态的生成lua对象的属性集 配置域通过includes 导入子配置 配置文件在不同阶段会被多次解析 **会被执行多遍!** - 配置里可以加入简单的逻辑判断 - 沙盒环境,被禁止执行复杂操作(屏蔽接口) ### 描述域 命令行中的属性优先级最高,会影响到所有设置 进入另一个target/option域设置,会自动离开上个target/option域,但是有时候为了比较一些作用域污染情况,我们可以显示离开某个域 - 命令行 - 配置域 - 全局域 - 范围域 ### 脚本域 导入后就可以直接使用里面的所有公有接口,私有接口用`_`前缀标示,表明不会被导出,不会被外部调用到。 其中 main 为入口函数,可选,如果设置,模块 foo 可以直接被调用 - 在指定时机中执行复杂操作,只执行一遍 - 脚本域中开放所有接口,可执行任何操作 #### on_link ```lua --定制化处理target的链接过程 target("test") on_link(function (target) print("link it") end) ``` #### on_build ```lua --[[ 覆盖target目标默认的构建行为,实现自定义的编译过程, 一般情况下,并不需要这么做,除非确实需要做一些xmake默认没有提供的编译操作 如果第一个参数为字符串,那么就是指定这个脚本需要在哪个平台|架构下,才会被执行 ]] target("test") on_build("iphoneos|arm*", function (target) print("build for iphoneos and arm") end) ``` #### on_build_file ```lua --通过此接口,可以用来hook指定target内置的构建过程,自己重新实现每个源文件编译过程 target("test") set_kind("binary") add_files("src/*.c") on_build_file(function (target, sourcefile, opt) end) ``` #### on_build_files ```lua --通过此接口,可以用来hook指定target内置的构建过程,替换一批同类型源文件编译过程: target("test") set_kind("binary") add_files("src/*.c") on_build_files(function (target, sourcebatch, opt) end) ``` 其中sourcebatch描述了这批同类型源文件: - `sourcebatch.sourcekind`: 获取这批源文件的类型,比如:cc, as, .. - `sourcebatch.sourcefiles()`: 获取源文件列表 - `sourcebatch.objectfiles()`: 获取对象文件列表 - `sourcebatch.dependfiles()`: 获取对应依赖文件列表,存有源文件中编译依赖信息,例如:xxx.d #### on_clean ```lua --覆盖target目标的xmake [c|clean}的清理操作,实现自定义清理过程。 target("test") -- 设置自定义清理脚本 on_clean(function (target) -- 仅删掉目标文件 os.rm(target:targetfile()) end) ``` #### on_package ```lua --覆盖target目标的xmake [p|package}的打包操作,实现自定义打包过程,如果你想对指定target打包成自己想要的格式,可以通过这个接口自定义它 target("demo") set_kind("shared") add_files("jni/*.c") on_package(function (target) os.exec("./gradlew app:assembleDebug") end) ``` #### on_install ```lua --覆盖target目标的xmake [i|install}的安装操作,实现自定义安装过程 target("test") -- 设置自定义安装脚本,自动安装apk文件 on_install(function (target) -- 使用adb安装打包生成的apk文件 os.run("adb install -r ./bin/Demo-debug.apk") end) ``` #### on_uninstall ```lua --覆盖target目标的xmake [u|uninstall}的卸载操作,实现自定义卸载过程 target("test") on_uninstall(function (target) ... end) ``` #### on_run ```lua --覆盖target目标的xmake [r|run}的运行操作,实现自定义运行过程。 target("test") -- 设置自定义运行脚本,自动运行安装好的app程序,并且自动获取设备输出信息 on_run(function (target) os.run("adb shell am start -n com.demo/com.demo.DemoTest") os.run("adb logcat") end) ``` #### on_link ```lua --定制化处理target的链接过程 target("test") on_link(function (target) print("link it") end) ``` #### 扩展事件 - before_xxx - after_xxx target:on_xxx的所有接口都覆盖内部默认实现,通常我们并不需要完全复写,只是额外挂接自己的一些逻辑,那么可以使用`target:before_xxx`和`target:after_xxx`系列脚本就行了。 所有的on_xxx都有对应的before_和after_xx版本,参数也完全一致 ## 文件拆分 文件间存在树形继承关系,当前文件目录为工作空间 ### 配置域 配置域通过includes 导入子配置 - 拆分属性配置到多个文件 - 支持批量导入 ### 脚本域 不仅可以使用大部分lua的api,还可以使用很多xmake提供的扩展模块 所有扩展模块,通过import来导入 # [Target](https://www.bookstack.cn/read/xmake/manual-project_target.md) - 项目属性配置 - 项目间存在继承关系 ## 项目配置 ```lua -- 批量导入配置文件 includes("test/**/xmake.lua") target("test") -- 静态库 | 动态库 | 可执行程序 -- static | shared | binary set_kind("binary") -- 源文件 add_files("src/*.cpp") -- 删除指定文件 del_files("src/test.c") -- 头文件 add_headerfiles("src/*.h") -- 头文件目录 add_includedirs("/usr/local/include") -- 库目录 add_linkdirs("/usr/local/lib") -- 链接 非系统库 add_links("pthread") -- 链接 系统库 add_syslinks("pthread") -- 项目依赖,会自动添加目录与库 add_deps("lua") -- 就继承了 lua 的所有导出设置:linkdirs, links, includedirs以及defines -- {inherit = false} 可禁止配置继承 -- 添加第三方库依赖 add_requires("lua") -- 链接第三方库 add_packages("lua") ``` ## 第三方库 ```lua -- 远程第三方仓库集 add_repositories("my-repo git@github.com:myrepo/xmake-repo.git") -- 本地第三方仓库集 add_repositories("my-repo myrepo") -- 定义第三方库 package("libjpeg") set_urls("http://www.ijg.org/files/jpegsrc.$(version).tar.gz") add_versions("v9c", "650250979303a649e21f87b5ccd02672af1ea6954b911342ea491f351ceb7122") on_install("windows", function (package) os.mv("jconfig.vc", "jconfig.h") os.vrun("nmake -f makefile.vc") os.cp("*.h", package:installdir("include")) os.cp("libjpeg.lib", package:installdir("lib")) end) on_install("macosx", "linux", function (package) import("package.tools.autoconf").install(package) end) package_end() --语义版本支持,例如:”>= 1.1.0 < 1.2”, “~1.6”, “1.2.x”, “1.*” add_requires("lua 5.4.*", "libpng ~1.16", "brew::zlib", {alias = "zlib"}) add_requires("vcpkg::zlib", "vcpkg::pcre2") ``` ## 编译配置 ```lua -- 启用调试符号 set_symbols("debug") -- 隐藏符号 set_symbols("hidden") -- 添加扩展指令集 add_vectorexts("sse2", "sse3", "ssse3", "mmx") -- 仅添加C代码相关编译flags add_cflags("-g", "-O2", "-DDEBUG") -- 添加C/C++代码相关编译flags add_cxflags("-g", "-O2", "-DDEBUG") -- 仅添加C++代码相关编译flags add_cxxflags("-g", "-O2", "-DDEBUG", {force = true}) -- force 强制检测 flag 是否添加成功 -- 设置语言标准 set_languages("c99", "c++11") -- 编译优化选项 set_optimize("fastest") set_toolchain("cxx", "clang") set_toolchain("ld", "clang++") -- 设置 xmake f 参数默认值,优先级最高 set_config("cflags", "-DTEST") set_config("sdk", "/home/xxx/tooksdk") set_config("cc", "gcc") set_config("ld", "g++") ``` ## Lua对象接口 | Target 接口 | | | -------------------------------- | ------------------ | | target:name() | 获取目标名 | | target:targetfile() | 获取目标文件路径 | | target:targetkind() | 获取目标构建类型 | | target:get("defines") | 获取目标宏定义 | | target:get("xxx") | 获取set_/add_ 信息 | | target:add("link","pthread") | 添加目标设置 | | target:set("link","pthread","z") | 覆写目标设置 | | target:deps() | 获取目标所有依赖 | | target:dep("depname") | 获取指定依赖 | | target:opts(") | 获取所有关联选项 | | target:opt("optname") | 获取指定关联选项 | | target:pkgs() | 获取所有关联依赖包 | | target:pkg("pkgname") | 获取指定关联依赖包 | | target:sourcebatches() | 获取所有源文件列表 | # Rule - 属性与事件组成特定实体 - 方便继承到其他域中 - 项目间存在组合关系 # Package 第三方库配置 - 语义版本支持,例如:”>= 1.1.0 < 1.2”, “~1.6”, “1.2.x”, “1.*” 第三方库的配置和项目配置不一样 kind 决定 package 如何用于 项目 - 程序依赖 - 库依赖 - 源码依赖 ## 接口 - #### 类型 - #### set_kind - #### 版本 - #### set_urls - #### add_urls - #### add_versions - #### add_patches - #### 参数 - #### add_configs ```lua -- 源码地址 set_urls("https://ffmpeg.org/releases/ffmpeg-$(version).tar.bz2", {alias = "home"}) add_urls("https://github.com/FFmpeg/FFmpeg/archive/n$(version).zip", {alias = "github"}) add_urls("https://gitlab.gnome.org/GNOME/libxml2.git") -- 源码包 与 哈希码 add_versions("home:4.0.2", "346c51735f42c37e0712e0b3d2f6476c86ac15863e4445d9e823fe396420d056") add_versions("github:4.0.2", "4df1ef0bf73b7148caea1270539ef7bd06607e0ea8aa2fbf1bb34062a097f026") -- 版本补丁 add_patches("1.15", "https://raw.githubusercontent.com/Homebrew/patches/9be2793af/libiconv/patch-utf8mac.diff", "e8128732f22f63b5c656659786d2cf76f1450008f36bcf541285268c66cabeab") -- 配置自定义参数 与 参数描述 add_configs("bitwidth", {description = "Set the code unit width.", default = "8", values = {"8", "16", "32"}}) package("luasocket") -- 设置类型 binary 不可省略 set_kind("library") set_homepage("https://cmake.org") set_description("A cross-platform family of tool designed to build, test and package software") ``` # Option xmake 命令后加入可选配置 # Task ```shell #task project #option : k m #kind vsxmake2022 #mode "debug;release" xmake project -k vsxmake2022 -m "debug;release" xmake project --help ``` xmake可以实现自定义任务或者插件,其两者的核心就是`task`任务,其两者实际上是一样的,xmake的插件都是用`task`实现的。 本质上都是任务,只是[set_category](https://www.bookstack.cn/read/xmake/manual-plugin_task.md#taskset_category)分类不同而已。 | 接口 | 描述 | 支持版本 | | ------------------------------------------------------------ | ------------------ | -------- | | [task](https://www.bookstack.cn/read/xmake/manual-plugin_task.md#task) | 定义插件或者任务 | >= 2.0.1 | | [task_end](https://www.bookstack.cn/read/xmake/manual-plugin_task.md#task_end) | 结束定义插件或任务 | >= 2.1.1 | | [set_menu](https://www.bookstack.cn/read/xmake/manual-plugin_task.md#taskset_menu) | 设置任务菜单 | >= 2.0.1 | | [set_category](https://www.bookstack.cn/read/xmake/manual-plugin_task.md#taskset_category) | 设置任务类别 | >= 2.0.1 | | [on_run](https://www.bookstack.cn/read/xmake/manual-plugin_task.md#taskon_run) | 设置任务运行脚本 | >= 2.0.1 |