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") thenadd_files("src/xxx/*.c")
end--如果当前平台是macosx或者iphoneos
if is_plat("macosx", "iphoneos") thenadd_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") thenadd_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") thenadd_files("src/xxx/*.m")
end

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

is_kind

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

一般用于如下场景:


target("test")-- 通过配置设置目标的kindset_kind("$(kind)")add_files("src/*c")-- 如果当前编译的是静态库,那么添加指定文件if is_kind("static") thenadd_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

  • XMake项目主页

  • XMake项目详情

  • XMake项目源码

  • XMake项目文档

  • TBOOX项目主页

  • 原文出处:http://tboox.org/cn/2016/07/23/condition-and-select-compile/

[转]:xmake工程描述编写之选择性编译相关推荐

  1. AndroidNDK工程FFmpeg(一)-- Android使用FFmpeg--Shell脚本编写与执行编译FFmpeg库

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计 算机程序.FFmpeg 是一个多媒体视频处理工具,有非常强大的功能包括视频采集功能. 视频格式转换.视频抓图.给视频加水印 ...

  2. 使用Quartus13进行VHDL工程的编写与仿真

    使用Quartus13进行VHDL工程的编写与仿真 四川师范大学工学院·徐浩宇 2021.4.19 编写代码 点击新建一个工程 选择工程保存的路径,填写工程名称,注意,三个圈起来的应该相同 与上一步的 ...

  3. weblogic自带的jdk是在工程的包部署后编译使用

    weblogic自带的jdk是在工程的包部署后编译使用的.当用户把项目打包部署到weblogic上面,运行该项目的java环境jdk就是用的weblogic自带的jdk了,工程中的jdk和编译时的jd ...

  4. STM32F407VG uCOS-II2.91 IAR工程 以及uCOS使用库编译的方法

    在使用正点原子的STM32资料时,工程是用MDK来编译的,而我对于IAR还是比较习惯和喜欢的,因为喜欢它的编译速度和效率,编辑界面虽然没有MDK那么好看,但是编辑起来还是不错的. IAR我的版本是6. ...

  5. Java多线程之多线程工程代码编写思维方式

    Java之多线程的工程代码编写思维方式 题目:三个售票员卖出30张票,用线程模拟. 前言: 本文涉及synchronized.Lock和拉姆达表达式(Lambda Expressions),前两知识点 ...

  6. 深入理解C语言系列之内存和地址的故事(虚拟内存分区、全局变量与静态变量、外部函数内部函数、选择性编译)

    文章目录 一.内存的分区 二.虚拟内存分区 三.变量作用域与静态变量 四.外部函数与内部函数 五.include与define选择性编译 一.内存的分区 1.内存分为:物理内存和虚拟内存. 物理内存︰ ...

  7. java应用程序如何编译运作_开发Java应用程序的基本步骤是: 1 编写源文件, 2.编译源文件, 3.运行程序。_学小易找答案...

    [判断题]Java源文件中只能有一个类. [简答题]任务32:开关电源PCB 设计.docx [多选题]企业的收入具体表现为一定期间: [简答题]任务33:CPLD逻辑电路自制元件与封装.docx [ ...

  8. 自学java编译老是出错_编写HelloWorld程序编译时提示写入HelloWorld时出错是什么意思...

    编写HelloWorld程序编译时提示写入HelloWorld时出错是什么意思 这个能出错的地方就难说了,能给出代码或者错误提示吗 为什么javac编译后说写入错误呢HelloWorld.java : ...

  9. Xcode创建的工程使用xcodebuild命令行编译

    Xcode创建的工程使用xcodebuild命令行编译 1.确保xcodebuild能够正常运行 如果使用xcodebuild命令出现如下错误: could not stat active Xcode ...

最新文章

  1. DOS命令行操作MySQL常用命令
  2. 让开发变得更简单 | 阿里云中间件推出全新开发者服务
  3. 动态表单实现客户端二次过滤及字段汇总统计
  4. PJSIP UA分析(1)--PJSUA主函数
  5. 洛谷 P2384 最短路题解
  6. 2016年5月26日晚上(妙味课堂js基础-2笔记二(DOM))
  7. 浙江独立学院计算机专业排名2015,2014-2015年中国独立学院排名
  8. 自动驾驶中车辆的如何使用点云定位?
  9. 基于zigbee的智能家用空气监测系统
  10. java缓存Ehcache的使用
  11. 机器学习实战——决策树
  12. 微信小程序之自定义计时器
  13. 计算机指令执行过程详解
  14. Gnome3 快捷键
  15. 基于django的轻量级CMS Mezzanine搭建笔记
  16. 摄像机的内参数和外参数
  17. Docker基础篇 - (六)Docker 网络Spring Boot微服务打包Docker镜像
  18. 手机扫描行驶证识别应用
  19. 扫雷游戏(java实现)java小程序
  20. centos6.8 安装docker并配置阿里云镜像加速器

热门文章

  1. [Web Chart系列之五] 图形布局-Circle Layout 之实现
  2. Activiti中的流程存储服务(RepositoryService)
  3. mysql的dockerfile_dockerfile构建mysql镜像
  4. 快速查找文件的工具Everything
  5. 数据库无响应(hang住)故障处理思路和方法
  6. Oracle触发器1-介绍
  7. Java中proc是什么意思,Java PatientProcedureVo.setSignifProc方法代码示例
  8. excel清空sheet内容 poi_java – 从POI中的WorkBook中删除工作表
  9. python访问多个网页_如何使用python请求登录具有多个页面的CAS?
  10. 联想x100e linux,进化之道!ThinkPad X100e全球首发测试