springtboot 引用子工程的文件_xmake从入门到精通11:如何组织构建大型工程

aa19cd67760b97014f3abd0a3bf6d2e9.png

xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。

本文主要详细讲解下,如何通过配置子工程模块,来组织构建一个大规模的工程项目。

  • 项目源码
  • 官方文档

维护简单的项目结构

对于一些轻量型的小工程,通常只需要单个xmake.lua文件就能搞定,大体结构如下:

projectdir- xmake.lua- src- test- *.c- demo- *.c

源码下面层级简单,通常只需要在项目根目录维护一个xmake.lua来定义所有target就能完成构建,看上去并不是很复杂,也很清晰。

-- 在根域设置通用配置,当前所有targets都会生效
add_defines("COMMON")target("test")set_kind("static")add_files("src/test/*.c")add_defines("TEST")target("demo")set_kind("static")add_files("src/demo/*.c")add_defines("DEMO")

维护复杂的项目结构

但是对于一些大型项目,通常的组织结构层次很多也很深,需要编译的target目标也可能有十几甚至上百个,这个时候如果还是都在根xmake.lua文件中维护,就有点吃不消了。

这个时候,我们就需要通过在每个子工程模块里面,单独创建xmake.lua来维护他们,然后使用xmake提供的includes接口,将他们按层级关系包含进来,最终变成一个树状结构:

projectdir- xmake.lua- src- test- xmake.lua- test1- xmake.lua- test2- xmake.lua- test3- xmake.lua- demo- xmake.lua- demo1- xmake.lua- demo2- xmake.lua...

然后,根xmake.lua会将所有子工程的xmake.lua通过层级includes全部引用进来,那么所有定义在子工程的target配置也会完全引用进来,我们在编译的时候永远不需要单独去切到某个子工程目录下操作,只需要:

$ xmake build test1
$ xmake run test3
$ xmake install demo1

就可以编译,运行,打包以及安装指定的子工程target,所以除非特殊情况,平常不推荐来回切换目录到子工程下单独编译,非常的繁琐。

根xmake.lua文件配置

通常推荐的做法就是在根xmake.lua中仅仅配置一些对所有target都通用的设置,以及includes对子工程的引用,不放置对targets的定义,例如:

-- define project
set_project("tbox")
set_xmakever("2.3.2")
set_version("1.6.5", {build = "%Y%m%d%H%M"})-- set common flags
set_warnings("all", "error")
set_languages("c99")
add_cxflags("-Wno-error=deprecated-declarations", "-fno-strict-aliasing", "-Wno-error=expansion-to-defined")
add_mxflags("-Wno-error=deprecated-declarations", "-fno-strict-aliasing", "-Wno-error=expansion-to-defined")-- add build modes
add_rules("mode.release", "mode.debug")-- includes sub-projects
includes("test", "demo")

xmake里面所有的设置都是按tree状继承的,根xmake.lua中的root域设置会对所有includes的子xmake.lua里面的targets生效, 但反过来不会,子xmake.lua里面的root域设置仅对它下面的子xmake.lua生效,不会影响到父xmake.lua中定义的targets。

子xmake.lua文件配置

所以,我们可以在每个子工程目录中,单独配置xmake.lua,里面的所有配置不会干扰父xmake.lua,只对它下面的更细粒度的子工程生效,就这样一层层按tree状生效下去。

由于,已经在根xmake.lua配置了大部分通用配置,那么我们可以在test子工程下,专心配置只对test有用的设置,例如对于projectdir/test/xmake.lua

add_defines("TEST")target("test1")set_kind("static")add_files("test1/*.c")add_defines("TEST1")target("test2")set_kind("static")add_files("test2/*.c")add_defines("TEST2")

我们可以在这里定义test的所有target,当然也可以继续分层,在每个test1, test2目录下单独维护xmake.lua,这个看自己项目的规模来决定。

比如:

add_defines("TEST") 
includes("test1", "test2")

test1/xmake.lua

target("test1")set_kind("static")add_files("test1/*.c")add_defines("TEST1")

test2/xmake.lua

target("test2")set_kind("static")add_files("test2/*.c")add_defines("TEST2")

而这里面的add_defines("TEST")在root域,会对test1/test2两个target都生效,但是对于demo目录的target不生效,因为它们是平级的,没有tree状继承关系。

跨xmake.lua间目标依赖

虽然,projectdir/test/xmake.luaprojectdir/demo/xmake.lua两个子工程目录是平级关系,配置无法相互干扰,但是targets是可以跨xmake.lua访问的,来实现目标间的依赖。

比如demo需要依赖test静态库,进行链接使用,那么demo下xmake.lua可以这么写:

target("demo1")set_kind("binary")add_files("demo1/*.c")add_deps("test1")

只要通过add_deps("test1")关联上对应其他子工程目标作为依赖即可,test1静态库会优先编译,并且demo可执行程序会自动link上它生成的libtest1.a库。

文件路径的层级关系

我们需要记住,所有跟路径相关的配置接口,比如add_files, add_includedirs等都是相对于当前子工程xmake.lua所在的目录的,所以只要添加的文件不跨模块,那么设置起来只需要考虑当前的相对路径就行了。

projectdir- test- xmake.lua- test1/*.c- test2/*.c

比如,这里添加的源文件路径,都是相对于test子工程目录的,我们不需要去设置绝对路径,这样会简化很多。

target("test1")add_files("test1/*.c")
target("test2")add_files("test2/*.c")

当然,如果我们有特殊需求,非要设置工程其他子模块下的文件路径呢?两种办法,通过../../的方式一层层绕出去,另外一种就是使用$(projectdir)内置变量,它表示项目全局根目录。

比如在demo子工程下:

target("demo1")set_kind("binary")add_files("demo1/*.c")add_files("../../test/test1/*.c")

或者:

target("demo1")set_kind("binary")add_files("demo1/*.c")add_files("$(projectdir)/test/test1/*.c")

includes接口使用进阶

错误的使用方式

includes这个接口属于全局接口,不隶属于任何target,所以请不要在target内部调用,下面是错误的用法:

target("test")set_kind("static")includes("test1", "test2")add_files("test/*.c")

正确的用法是:

includes("test1", "test2")
target("test")set_kind("static")add_files("test/*.c")

或者:

target("test")set_kind("static")add_files("test/*.c")
target_end()-- 在下面调用,需要先显式退出target作用域
includes("test1", "test2")

引用目录或文件

另外,includes既可以引用目录,也可以直接引用文件,如果test1目录下存在xmake.lua,那么可以直接includes("test1")来引用目录。

如果test1目录下是其他xxxx.lua命令的项目文件,可以通过指定文件来引用:includes("test1/xxxx.lua"),效果一样的。

模式匹配进行批量导入

includes还支持通过模式匹配的方式来批量导入多个子工程,比如:

includes("test/*/xmake.lua")

可以导入test目录下,所有test1, test2等子工程目录下的配置,如果是**还支持递归多级匹配

includes("test/**/xmake.lua")

通过模式匹配,我们只需要在test/xmake.lua一处地方进行includes,以后用户在新增其他子工程xmake.lua,就会自动导入进来,非常方便。

注意事项

另外,在使用includes的过程中,需要注意的一点是,它不是c语言的#include,因此在当前配置中includes子配置,当前配置是不会有任何影响的,比如:

includes("xxx") 
target("test")-- ...

上面includes了一些子工程,但是这些子工程的配置是不会干扰当前test目标程序的。

https://tboox.org/cn/2020/04/11/quickstart-11-subprojects/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj 1024 [SCOI2009]生日快乐——模拟

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1024 可以枚举这边放多少块、那边放多少块。 注意精度。不要每次用x*y/base算有多少块&#xff0c;传参较好。 #include<iostream> #include<cstdio> #include<cstring> #include<algo…

依赖项出现感叹号怎么办_SpringBoot中如何对依赖进行管理?

SpringBoot中的起步依赖(starter)是一组特定功能的依赖项集合&#xff0c;SpringBoot通过starter来进行项目的依赖管理&#xff0c;而不是直接基于单独的依赖项来进行依赖管理。starter其实就是特殊的Maven依赖项或者Gradle依赖项&#xff0c;它把常用的库组合到一起构成了一个…

5g理论速度_5G是什么?5G速度有多快?

原标题&#xff1a;5G是什么&#xff1f;5G速度有多快&#xff1f;5G到底是什么东西&#xff1f;今年5G网络会普及吗&#xff1f;5G网速到底有多快&#xff0c;背后又有哪些黑科技&#xff1f;近日&#xff0c;全球首个5G火车站在上海虹桥火车站启动建设。而根据三大运营商的时…

c++ new一个结构体_「C/C++」构造类型及应用:数组、结构体、共用体、枚举类型...

3.1数组同类型、同性质、按顺序存放的一组数据集合&#xff0c;易于批量处理。3.1.1一维数组定义int 1.数组名为常量&#xff0c;指向首地址&#xff0c;由系统指定。2.数组长度为整型常量,但不能为03.上例取值image[0]-image[255]&#xff0c;取值可以修改。初始化int 输入for…

FFT学习笔记

搬运一下之前在luogu blog写的。 参考http://picks.logdown.com/posts/177631-fast-fourier-transform 废话不写了。首先补零将多项式项数补为2的整数次幂。下标均从0开始。 DFT&#xff08;递归版&#xff09; 将系数表示转为点值表示。设项数为n&#xff0c;即求多项式将所有…

自动产生fsm代码的工具_代码自动生成工具

构建支持多种数据库类型的代码自动生成工具背景&#xff1a;一般的业务代码中写来写去&#xff0c;无外乎是先建好model&#xff0c;然后针对这个model做些CRUD的操作。(主要针对单表的业务操作)针对于数据库dao、mapper等的代码自动生成已经有了mybatisGenerator这种工具&…

gtest测试框架使用详解_测试框架TestNG使用介绍

近期接触到了一个比较全面的基于Java的接口自动化测试框架&#xff0c;作为一名Java小白&#xff0c;所以打算研究一下&#xff0c;顺带学习学习Java&#xff0c;该测试框架的逻辑控制层使用的HttpClient TestNG。在本期中&#xff0c;给大家分享一下TestNG测试框架的基础知识…

同期收治患者住院天数_(完整版)DDD值算法

有关DDD 值的计算问题根据卫生部开展的《抗菌药物临床应用专项整治活动实施方案》要求&#xff0c;抗菌药物使用强度应控制在40DDD 以下。抗菌药物使用强度&#xff0c;即限定日剂量(defined daily doses &#xff0c;DDD )&#xff0c;为药物主要适应症以成人每日常用剂量作为…

LOJ#6282. 数列分块入门 6

一个动态的插入过程&#xff0c;还需要带有查询操作。 我可以把区间先分块&#xff0c;然后每个块块用vector来维护它的插入和查询操作&#xff0c;但是如果我现在这个块里的vector太大了&#xff0c;我可能的操作会变的太大&#xff0c;所以这时候我需要把现在里面的数全部拿出…

fragment在activity中的静态和动态用法_使用Matlab修改压缩Gif动态图片制作微信表情...

脚本之家你与百万开发者在一起作者&#xff1a;theOwlAndPussyCat/焦旭光引言电脑里存了很多有意思的Gif动态图片&#xff0c;闲暇想把这些动图全导入微信表情&#xff0c;可是这些动图很多大小超过了微信表情大小1MB的限制&#xff0c;要制作成表情只能压缩图像文件大小。网上…

mysql命令_MySQL常用操作命令

MySQL常用操作命令PHP独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。欢迎大家阅读&#xff01;更多相关信息请关注相关栏目&#xff01;1、启动MySQL服务器实际上上篇已讲到如何启动MySQL。两种方法&#xff1a;一是用winmysqlad…

The 2018 ACM-ICPC上海大都会赛 J Beautiful Numbers (数位DP)

题意&#xff1a;求小于等于N且能被自己所有位上数之和整除的数的个数。 分析&#xff1a;裸的数位dp。用一个三位数组dp[i][j][k]记录&#xff1a;第i位&#xff0c;之前数位之和为j&#xff0c;对某个mod余数为k的状态下满足条件的个数。这里mod的值就是小于等于N的数中&…

mysql定时增量备份_Mysql日常自动备份和增量备份脚本

序你是否在寻找一个MySQL备份脚本?适合对象本文是在Linux下,mysql 4.1.14版本下测试的,经过适当修改可能适合mysql 4.0,5.0及其其他版本.本文适合于没有启动复制功能的mysql,如果启动了复制,可能不需要采取这种备份策略或者需要修改相关参数.每个人的备份策略都可能不同,所以请…

frontcon函数用不了_C++复制构造函数与析构函数

想用机器人赋能未来&#xff0c;少不了扎实的编程的基本功&#xff0c;让我们跟着清华大学的C语言程序设计课程一起过一遍C的语法知识吧&#xff01;当定义基本类型的变量时&#xff0c;经常会用已有的变量去初始化新定义的变量&#xff0c;当定义对象的时候也有类似的需求&…

在京东上买的手机然后申请退货的经历

在京东上买的手机&#xff0c;是支持7天无理由退货的类型的。试用了一下感觉不是太喜欢&#xff0c;就选择退货了。 具体情况如下&#xff1a;先在网上填申请&#xff0c;然后等电话通知什么时候把手机给负责人&#xff0c;给过负责人之后&#xff0c;负责人先检查外观等是否符…

mysql tungsten_使用tungsten将mysql的数据同步到hadoop

背景线上有很多的数据库在运行&#xff0c;后台需要一个分析用户行为的数据仓库。目前比较流行的是mysql和hadoop平台。现在的问题是&#xff0c;如何将线上的mysql数据实时的同步到hadoop中&#xff0c;以供分析。这篇文章就是利用tungsten-replicator来实现。环境由于tungste…

软件项目立项书_2019年度上海市软件和集成电路产业发展专项资金项目立项

上海艾瑞德生物科技有限公司荣获2019年上海市软件和集成电路产业发展专项资金(集成电路和电子信息制造领域)项目立项&#xff01;上海艾瑞德生物科技有限公司的【医用体外诊断动态光场图像采集电子模块的研发及产业化】喜获2019年上海市软件和集成电路产业发展专项资金(集成电路…

line-height:1.5和line-height:150%的区别

1. 给你个数&#xff0c;孩子自己算吧 line-height:1.5 父元素设置line-height:1.5会直接继承给子元素&#xff0c;子元素根据自己的font-size再去计算子元素自己的line-height。 2.老子说多大就是多大 line-height:150% 父元素设置line-height:150%是计算好了line-height值&…

mysql提供了表示日期和时间的数据类型_MySQL数据类型 - 日期和时间类型(1)

1.日期和时间数据类型语法用于表示时间值的日期和时间数据类型是DATE, TIME, DATETIME, TIMESTAMP和 YEAR。对于TIME, DATETIME和 TIMESTAMP值&#xff0c;MySQL支持小数秒&#xff0c;精度可达微秒(6位数)。要定义包含小数秒部分的列&#xff0c;请使用语法type_name(fsp)&…

软件质量保证计划_CMMI V2.0 精讲之“过程质量保证”

过程质量保证(PROCESS QUALITY ASSURANCE, PQA)目的&#xff1a;验证并改进已执行的过程和所产生的工作产品的质量。价值&#xff1a;增强过程使用和改进的一致性&#xff0c;以最大限度地提高业务效益和客户满意度。实践概述第1级PQA 1.1识别并解决过程和工作产品问题。第2级P…