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

Posted 嵌入式Max

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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


以上是关于Newbie-X之个人代码仓库介绍的主要内容,如果未能解决你的问题,请参考以下文章

Github介绍

hexo+GitHub搭建个人博客之创建仓库

iOS 开发之向自己公司git服务器提交代码

Hadoop计算框架之MapReduce

云原生之Docker实战使用docker部署Ghost个人博客系统

git仓库类型介绍