Newbie-X之个人代码仓库介绍

前不久,记得是一年多之前吧,自己建了一个 github 小代码仓库来存放自己用来练习的 C/C++ 代码,名字就随便起了个名字叫做 Newbie-X,X 呢在很多意义上都是神秘的代名词,没有什么具体的意义,很多项目都喜欢用 X 作为一个后缀什么的,这里就效仿一波拿来取了个名字。很久一段时间没有再去更新过这个仓库了,但是后面觉得练习 C++ 的时候多多少少还能再用到,于是就更新了下整个的文件编译模式,重新翻修了下,记录一波。

放一个代码仓库的链接:https://github.com/YellowMax2001/Newbie-X ,本文主要重点记录下文件编译系统的用法与设计。

代码模块

里面已经有了之前练习数据结构与算法时候积累下来的 C 代码,在 MaxCLib 目录下面就是,主要是一些排序算法之类的:

// MaxCLib 里面的目录结构如下图所示
├── algorithm    //包含大部分排序算法,还有二分搜索、双线性插值算法示例
├── data_structs //数据结构,里面有 list 和 fifo 的简单实现与练习
├── include      //基本的通用头文件
├── main.c
├── streams
├── targets
├── test.c
└── unity_tools  //基本通用工具与头文件

里面的文件组织方式都是懒散的,比较稀碎,但是能够编译就得了,戈登弗里曼觉得很 OK。

文件编译系统

为了方便编译,并且不至于手动一个个文件去编,于是小小的做了一个文件编译模块,现在还只做完了可执行文件的编译部分,还没有做动态库与静态库的编译,但是框架已经有了,只是还没有实现验证,有需要再往里面添加吧。这个简单的编译模块有下面几个功能:

  1. 一次设置(执行一个初始化脚本),后面就可以全部编译了。
  2. 目前仅支持两级编译,就是一个文件汇总需要编译的模块顶层文件夹一级,模块子文件夹里面放置模块文件相关的 Compile.mk 文件来指明模块所需的文件和要编译的类型(可执行文件、动态库、静态库)。
  3. 一个文件夹里面可以有多个目标,会编译编译生成,比如两个完整的可执行文件,一个动态库同时在一个 Compile.mk 文件里面指定编译。
  4. 可以自定义设置需要拷贝生成的编译目标到某个文件夹里面去。
  5. 可以编译全部指定目标,也可以在某一个子目录下编译单个指定目标文件。

整个仓库的根目录下面有一个 build_tools 文件夹,里面包含了主要 make 系统的实现,比如 Compile_functions.mk 文件就定义了一些常用的脚本函数,用于 make 过程中调用,比如 copy,rm,显示当前文件夹路径等。如果需要使用这个编译模块的话就需要在仓库的根目录下面执行:source ./build_tools/newbie_build.src 来初始化当前的整个编译环境,用于后续具体目标编译,下面是根目录下面一个模块列表手机文件 Compile_list.mk 文件,里面内容如下:

#cat Compile_list.mk

# If we have some **build dependency**,
# **must put the dependency items in the top position**.
CompileTargetLists += $(TOP_DIR)/MaxCLib/algorithm/search
CompileTargetLists += $(TOP_DIR)/MaxCLib/algorithm/sort
CompileTargetLists += $(TOP_DIR)/MaxCLib/algorithm/graphics

这个是指明整个项目都需要编译哪些个模块,如果模块之间有相互依赖的话就需要把被依赖项放在前面先编译出来,目前没办法处理互相依赖的模块,而一个 Compile.mk 文件示例如下:

# cat MaxCLib/algorithm/sort/Compile.mk
include $(ENV_CLEAN_SCRIPT)

CompileHeaderFiles += $(addprefix $(call my_dir)/, $(wildcard *.h))

# 用于添加需要编译的源文件,如果这些源文件对应同一个目标的话就可以使用这个变量进行设置。
CompileSrcFiles +=

# 用于添加需要分别生成单个目标的源文件,这个变量列表里面所有的文件都会单独编译出来独立的对应的可执行文件或者是库文件
SplittedCompileSrcFiles += $(addprefix $(call my_dir)/, $(wildcard *.c))

CompileCCFlags +=

CompileCCLinkFlags += -lm

CompileTarget :=

include $(ENV_BIN_TARGET_SCRIPT)

distclean::
        $(call rm_files, \
                $(addprefix $(TOP_DIR)/MaxCLib/targets/bin/, \
                $(patsubst %.c, %, $(notdir ${SplittedCompileSrcFiles}))))

# 这个变量用于整个上面编译过程完成之后的自定义命令,这里就是拷贝该文件下面无后缀名的文件(可执行文件)到目录 `$(TOP_DIR)/MaxCLib/targets/bin` 里面去。
CompilePhonyAdditionalTarget:
        $(info \
        $(call copy_to_dir,\
                $(TOP_DIR)/MaxCLib/targets/bin,\
                $(patsubst %.c, %, ${SplittedCompileSrcFiles})))

编译的时候可以调用 mMake.sh 脚本,这个脚本的路径在 source 命令初始化编译环境的时候已经设置到系统路径里面去了,可以在根目录下面直接执行,会编译整个 Compile_list.mk 文件里面所有的模块目标,也可以在某一个包含了 Compile.mk 的文件夹下面执行,这个时候只会编译 Compile.mk 文件指定的模块目标。

这个玩意设计的过程中就参考了以前公司用的编译系统模式,Android 的 mk 超低配版,够用就行了。之前有做过一版递归调用的 make 系统,但是维护起来不好玩,过段时间自己去看已经看不懂了,于是就改了一个相对没那么递归的玩意儿,这个维护起来好多了,怎么看都明白,不会造成时间长了忘掉的尴尬情况。

End

排序算法系列:https://blog.csdn.net/u013904227/category_9285894.html


MySQL数据库从入门实战课

12-31
限时福利1:购课进答疑群专享柳峰(刘运强)老师答疑服务。 限时福利2:购课后添加学习助手(微信号:csdn590),按消息提示即可领取编程大礼包! 注意:原价129的课程,最后2天限时秒杀仅需49元!! 为什么说每一个程序员都应该学习MySQL? 根据《2019-2020年中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。 使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能! 【课程设计】 在本课程中,刘运强老师会结合自己十多年来对MySQL的心得体会,通过课程给你分享一条高效的MySQL入门捷径,让学员少走弯路,彻底搞懂MySQL。 本课程包含3大模块:  一、基础篇: 主要以最新的MySQL8.0安装为例帮助学员解决安装与配置MySQL的问题,并对MySQL8.0的新特性做一定介绍,为后续的课程展开做好环境部署。 二、SQL语言篇: 本篇主要讲解SQL语言的四大部分数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL,学会熟练对库表进行增删改查等必备技能。 三、MySQL进阶篇: 本篇可以帮助学员更加高效的管理线上的MySQL数据库;具备MySQL的日常运维能力,语句调优、备份恢复等思路。  
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值