文档章节

xmake工程描述编写之选择性编译

ruki
 ruki
发布于 2016/07/23 22:17
字数 1255
阅读 18
收藏 0

xmake 提供了一些内置的条件判断api,用于在选择性编译时,获取到一些工程状态的相关信息,来调整编译逻辑。。

例如:is_os, is_plat, is_arch, is_kind, is_mode, is_option

is_mode

我们先拿最常用的is_mode来讲讲如何使用,这个api主要用来判断当前的编译模式,例如平常编译配置的时候,会执行:

$ xmake f -m debug
$ xmake

来编译debug版本,那么模式就是debug,那么release版本,也就是release

$ xmake f -m release
$ xmake

但是如果仅仅只是这么配置,xmake还是不知道如果为debug进行编译,如何编译release版本,因为这些模式的值不是内置的

我们可以随便设置,例如:profile, checking等等,用来编译性能模式,检测模式,这些就看咱们项目实际的需求了。。

一般情况下只需要debugrelease就行了,那如何区分呢,这就需要在xmake.lua进行配置了,一般可参考如下配置:

-- 如果当前编译模式是debug
if is_mode("debug") then

    -- 添加DEBUG编译宏
    add_defines("DEBUG")

    -- 启用调试符号
    set_symbols("debug")

    -- 禁用优化
    set_optimize("none")

-- 如果是release模式
elseif is_mode("release") then

    -- 隐藏符号
    set_symbols("hidden")

    -- strip所有符号
    set_strip("all")

    -- 开启优化为:最快速度模式
    set_optimize("fastest")

    -- 忽略帧指针
    add_cxflags("-fomit-frame-pointer")
    add_mxflags("-fomit-frame-pointer")
end

通过判断是否在编译debug版本,来启用和禁用调试符号信息,并且判断是否禁用和启用优化。

当然,如果我们的项目还设置了其他模式,例如性能分析模式:profile,那么还可以通过这个来判断是否需要添加一些分析分析上的编译选项。

is_plat

接下来我们讲讲这个编译平台的判断,这个也非常实用哦,虽然我们的工具是为了跨平台开发,通常的配置肯定都是通用的

但是毕竟项目成千上万,需求各不相同,总归会有些项目需要针对不同的平台做些编译上的特殊处理

这个时候,我们就需要这个api了,例如:

-- 如果当前平台是android
if is_plat("android") then
    add_files("src/xxx/*.c")
end

--如果当前平台是macosx或者iphoneos
if is_plat("macosx", "iphoneos") then
    add_mxflags("-framework Foundation")
    add_ldflags("-framework Foundation")
end

这里针对android平台,增加了一些特殊代码的编译,针对macosx和iphoneos平台,增加了Foundation框架的链接。

这里还有个比较实用的小技巧,is_xxx系列接口,都是可以同时传递多个参数的,逻辑上是or的关系

我们可以像上面那么写法:

if is_plat("macosx", "iphoneos", "android", "linux") then
end

否则如果用lua的原生语法的话,虽然也可以,但是会很臃肿,例如:

if is_plat("macosx") or is_plat("iphoneos") or is_plat("android") or is_plat("linux") then
end

除了is_xxx系列,像:add_xxxs 这种后缀有s的复数api,都是可以传递多个参数的哦,例如add_files

add_files("src/*.c", "test.c", "hello.cpp")

等等,这里就不一一介绍了。。。

is_arch

这个跟is_plat类似,不过是用来判断当前编译的目标架构的,也就是:

xmake f --arch=x86_64

然后,我们在工程描述中,进行判断:

-- 如果当前架构是x86_64或者i386
if is_arch("x86_64", "i386") then
    add_files("src/xxx/*.c")
end

--如果当前平台是armv7, arm64, armv7s, armv7-a
if is_arch("armv7", "arm64", "armv7s", "armv7-a") then
    -- ...
end

如果像上面那样一个个去判断所有arm架构,也许会很繁琐,毕竟每个平台的架构类型很多,xmake提供了类似add_files中的通配符匹配模式,来更加简洁的进行判断:

--如果当前平台是arm平台
if is_arch("arm*") then
    -- ...
end

用*就可以匹配所有了。。

is_os

这个很简单,用来判断当前编译目标,例如:

-- 如果当前操作系统是ios
if is_os("ios") then
    add_files("src/xxx/*.m")
end

目前支持的操作系统有:windows、linux、android、macosx、ios

is_kind

用来判断当前是否编译的是动态库还是静态库

一般用于如下场景:


target("test")
    -- 通过配置设置目标的kind
    set_kind("$(kind)")
    add_files("src/*c")
    
    -- 如果当前编译的是静态库,那么添加指定文件
    if is_kind("static") then
        add_files("src/xxx.c")
    end

编译配置的时候,可手动切换,编译类型:


-- 编译静态库
xmake f -k static
xmake

-- 编译动态库
xmake f -k shared
xmake

is_option

如果某个自动检测选项、手动设置选项被启用,那么可以通过is_option接口来判断,例如:


-- 如果手动启用了xmake f --demo=y 选项
if is_option("demo") then
   
    -- 编译demo目录下的代码
    add_subdirs("src/demo")
end

本文转载自:http://tboox.org/cn/2016/07/23/condition-and-select-compile/

共有 人打赏支持
ruki

ruki

粉丝 62
博文 103
码字总数 23669
作品 7
松江
高级程序员
私信 提问
XMake v2.1.3 版本更新,修复安全和稳定性问题

XMake v2.1.3 发布了。此次更新主要修复xmake的一些稳定性问题,并且对安装和卸载提供更加安全的权限处理,相关更新细节见:改进权限问题,提升操作安全性 并且此版本还对用户使用上的体验进...

ruki
2017/04/05
558
10
基于 Lua 的跨平台构建工具 - XMake

简介 XMake是一个基于Lua的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目 xmake的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得一次编写...

ruki
2015/07/16
0
7
xmake v2.2.2, 让C/C++拥有包依赖自动构建

历经四个多月,[xmake](https://github.com/tboox/xmake)终于更新了新版本v2.2.2,并且上线了重量级功能:原生支持的远程依赖包管理。 而这个特性,其实我陆陆续续写了将近一年的时间,才初步...

ruki
2018/10/17
0
0
XMake v2.1.4 发布,增加交互式命令执行(REPL)

概述 此次更新,主要增强xmake lua插件,支持交互式命令执行(read-eval-print, REPL)以及一些稳定性问题修复。 有时候在交互模式下,运行命令更方便测试和验证一些模块和api,也更加的灵活,...

ruki
2017/05/10
1K
4
xmake v2.0.5,基于 Lua 的跨平台自动构建工具

新特性 为解释器作用域增加一些内建模块支持 针对windows x64平台,支持ml64汇编器 改进 增强ipairs和pairs接口,支持过滤器模式,简化脚本代码 为vs201x工程生成增加文件filter 移除core/to...

ruki
2016/10/31
1K
8

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
59分钟前
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部