UP | HOME

xmake

Table of Contents

xmake note.

<!– more –>

xmake

Install

安装 Windows 版本

使用安装包
windows 下提供了预制的 nsis 安装包,我们可直接从 github 的 Releases 下载页面下载后,运行安装包即可。

从 Releases 上下载 windows 安装包 https://github.com/xmake-io/xmake/releases
运行安装程序 xmake-[version].exe, 如 xmake-master.win64.exe

vscode c/c++ 开发环境搭建

安装如下 vscode 插件:

     
XMake tboox Extended XMake support in Visual Studio Code
C/C++ Microsoft C/C++ IntelliSense, debugging, and code browsing.
clangd LLVM C/C++ completion, navigation, and insights

clangd 的代码补全基于一个叫做 compile_commands.json 的文件,我们首先告诉 clangd 去 build 目录下找。打开 clangd 设置,添加以下命令:
–compile-commands-dir=${workspaceFolder}/build
clangd-config.jpg
xmake 可以生成 compile_commands.json,但是其默认是将这个文件生成在.vscode 文件夹下,因此需要改一下 xmake 的设置,让它生成到 build 目录下:
xmake-config01.jpg

xmake 中 run 默认不会执行编译,进行如下配置,可使 run 时执行 build:
xmake-config02.jpg

当 xmake.lua 文件发生修改时,就会自动在 build 目录下生成 compile_commands.json,到此所有的配置就完成了。
如果没有自动生成 compile_commands.json,我们可以在 vscode 中使用 >XMake: UpdateIntellisense 命令手动触发生成,或者在命令行中输入以下命令来生成。
xmake project -k compile_commands build

Base Usage

创建工程

方法 1:手动创建
  1. 创建工程目录
# 创建目录
mkdir hello_world
cd hello_world
  1. 创建 xmake.lua 文件
-- 创建 xmake.lua 文件, 使用下面内容填充
add_rules("mode.debug", "mode.release")
target("hello_world")
  set_kind("binary")
  add_files("src/*.cpp")
  1. 自动配置工程
# 自动配置工程
xmake f    # 或者 xmake config

# 查看工程配置, 如果没有配置工程,则自动配置工程
xmake f -v # 或者xmake config -v
方法 2:命令行
xmake create hello_world
# 上面命令生成如下目录结构和文件:
# hello_world
#   src/
#       main.cpp
#   .gitignore
#   xmake.lua

工程配置

# 自动配置工程
xmake f    # 或者 xmake config

# 查看工程配置, 如果没有配置工程,则自动配置工程
xmake f -v

# 配置platform architecture mode
xmake f -p [windows|linux|macosx|android|iphoneos ..] -a [x86|arm64 ..] -m [debug|release]

# 配置 vs版本
xmake f --vs=2022

C++包管理

查找 package
# 查找 vulkan package
## 可以看到 vulkansdk 是我们需要的package
xrepo search vulkan

# The package names:
#     vulkan:
#       -> vulkansdk: LunarG Vulkan® SDK (in xmake-repo)
#       -> volk-1.3.275+0: volk is a meta-loader for Vulkan (in xmake-repo)
#       -> glfw-3.4: GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan application development. (in xmake-repo)
# .......
查询 package 信息
# 查询 vulkansdk package 信息
xrepo info vulkansdk
# 下面的 configs 字段表示可以配置的信息
# The package info of project:
#     require(vulkansdk):
#       -> description: LunarG Vulkan® SDK
#       -> version: latest
#       -> repo: xmake-repo https://gitee.com/tboox/xmake-repo.git master
#       -> cachedir: C:\Users\wolfand11\AppData\Local\.xmake\cache\packages\2404\v\vulkansdk\latest
#       -> installdir: C:\Users\wolfand11\AppData\Local\.xmake\packages\v\vulkansdk\latest\46c06c99027e4154b6f020db58363b1d
#       -> searchdirs:
#       -> searchnames:
#       -> fetchinfo: latest
#       -> platforms: all
#       -> requires:
#          -> plat: windows
#          -> arch: x64
#          -> configs: #可以配置的信息
#             -> utils: table: 0000017A6478ECB0
#             -> runtimes: MT
#             -> shared: true
#             -> pic: true
#             -> debug: false
#       -> configs: #可以配置的信息
#          -> shared: Build shared library. (default: true) (readonly)
#          -> utils: Enabled vulkan utilities. (default: table: 0000017A6478ECB0)
#       -> configs (builtin): #可以配置的信息
#          -> debug: Enable debug symbols. (default: false)
#          -> pic: Enable the position independent code. (default: true)
#          -> lto: Enable the link-time build optimization. (type: boolean)
#          -> asan: Enable the address sanitizer. (type: boolean)
# ......
版本设置
add_requires("tbox 1.6.*", "pcre 1.3.x", "libpng ^1.18")
add_requires("libpng ~1.16", "zlib 1.1.2 || >=1.2.11 <1.3.0")

在 Vulkan Tutorial 中添加如下设置,会报错。目前版本设置还没摸清楚。

add_requires("glfw > 3.27.0")
删除包

使用 xrepo remove vulkansdk

编译运行

方法 1:VSCode 中直接操作

VSCode 中直接操作

方法 2:生成 VS 工程来操作
# 配置 vs版本
xmake f --vs=2022

# 参数-a x64就是生成pc 64位架构vs项目,如果输入-a x86则生成x86架构vs项目
xmake project -k vsxmake -a x64
方法 3:命令行中操作
# 编译
xmake build 09Multisampling
# 运行
xmake run 09Multisampling

调试

方法 1:VSCode 和 VS 工程中操作
方法 2:命令行中操作
# 切换到debug模式
xmake config -m debug
# 重新编译
xmake build 09Multisampling
# 运行
xmake run 09Multisampling

Vulkan Tutorial 配置

以 Vulkan Tutorial - Development environment 为例进行说明,Vulkan Tutorial - Development environment

add_rules("mode.debug", "mode.release")

rule("vulkan_tutorial")
    print(os.projectdir())
    if is_plat("windows") then
        --add_defines("ENGINE_ROOT_DIR=\"" .. (os.projectdir():gsub("\\", "\\\\")) .. "\\\\engine\"")
        print("platform is windows")
    else
        print("platform is others")
        --add_defines("ENGINE_ROOT_DIR=\"" .. (os.projectdir():gsub("\\", "/")) .. "/engine\"")
    end

    before_run(function (target)
        print("[shader] glsl to spirv..")
        import("utils")
        local vulkan_sdk = find_package("vulkansdk") --定位到vulkansdk的路径
        local glslang_validator_dir = vulkan_sdk["bindir"].."\\glslangValidator.exe" --获取到glslangValidator.exe的路径
        -- 遍历 shader 文件
        local targetName = target:name()
        for _, shader_path in ipairs(os.files("$(projectdir)/"..targetName.."/**")) do
            if utils.StrEndWith(shader_path, ".vert") or utils.StrEndWith(shader_path, ".frag") then
                local new_shader_path = string.gsub(shader_path, ".vert", ".spv")
                new_shader_path = string.gsub(new_shader_path, ".frag", ".spv")
                os.runv(glslang_validator_dir,{"-V", shader_path,"-o", new_shader_path}) --执行系统命令
                print("[shader] done: "..shader_path)
            end
        end
    end)
rule_end()

-- add_requires("vulkansdk", {debug=true})
-- add_requires("vulkansdk > 1.3.0", {debug=true})
set_languages("c++20")
add_requires("vulkansdk")
add_requires("glm")
add_requires("glfw")
add_requires("stb")
add_requires("tinyobjloader")

local targetName = "01DevelopmentEnvironment"
target(targetName)
    set_kind("binary")
    add_files(targetName .. "/*.cpp")
    add_packages("vulkansdk", "glm", "glfw")

targetName = "02DrawATriangle"
target(targetName)
    set_kind("binary")
    add_files(targetName .. "/*.cpp")
    -- 设置 build output directory
    --set_targetdir("../build/"..targetName)
    -- 设置 run directory (也就是工作目录)
    set_rundir("$(projectdir)/"..targetName)
    add_packages("vulkansdk", "glm", "glfw")
    add_rules("vulkan_tutorial")
    set_default(true)

targetName = "09Multisampling"
target(targetName)
    set_kind("binary")
    add_files(targetName .. "/*.cpp")
    -- 设置 build output directory
    --set_targetdir("../build/"..targetName)
    -- 设置 run directory (也就是工作目录)
    set_rundir("$(projectdir)/"..targetName)
    add_packages("vulkansdk", "glm", "glfw", "stb", "tinyobjloader")
    add_rules("vulkan_tutorial")

Q&A

how can i get target name in add_files

target("kth-largest-element-in-an-array")
    set_kind("binary")
    add_files("kth-largest-element-in-an-array.cpp")

-- 下面配置和上面配置等价
local name = "kth-largest-element-in-an-array"
target(name)
    set_kind("binary")
    add_files(name .. ".cpp")

参考资料