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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章