V2.0版本


一、簡介

很高興你能看到這個開源項目,希望這個項目能幫到你。

這是一個可直接用於企業開發使用的項目,只需要簡單的配置信息就能方便管理你的工程。

1. 簡潔

核心只有一個Makefile文件。

2. 通用性強

適用於小工程項目、中等工程項目及大工程項目。

3. 跨平台

它可以自動識別所在平台,不需要配置就可以直接使用。 - 在Linux中直接拷貝Makefile文件到工程中就可以直接使用。 - 在Windows中需要工具的支持,你可以在 "./tools/windows_tools" 中找到它,在拷貝 Makefile 文件的同時把 tools 文件夾一起拷到你的工程中即可。

4. 配置簡單

在Makefile文件中你只要關心帶有前綴 "MF_CONFIGURE_" 的變量,並且增加了大量的説明及示例,這樣能非常方便的對每個工程個性化管理的需求。

5. 結合腳本使用

你可以不用修改Makefile文件,在腳本中直接配置你的個性化需求,可以在工程中查看 build.sh 腳本文件(Linux使用的) 和 build.bat 腳本文件(Windows使用的)。

6. 健壯性

在Makefile文件中增加了很多的校驗,它能增加在執行make時不容易出錯,能夠提前告知你配置的問題設置

7. 便於學習

如果近期你想了解或學習Makefile文件的知識,該項目是一個非常好的學習資料。在該項目中使用到了大部分的Makefile知識點,並且擁有大量的註釋説明。在 "./doc" 文件夾中保存了make.pdf文件,這個也是你學習之路的不可或缺的的資料文件。

二、下載

項目源碼獲取平台

項目鏈接

github

https://github.com/Yezcgithub/makefile

gitee

https://gitee.com/yezc/makefile

gitcode

https://gitcode.com/Yeccc/makefile

三、功能

  1. 支持跨平台
  2. 支持可配置交叉編譯
  3. 支持可配置只編譯C語言文件或C\C++文件混合編譯
  4. 支持可配置生成目標文件有可執行程序、動態庫、靜態庫以及同時生成動態和靜態庫
  5. 支持可配置生成 release、debug 以及同時生成 release 和 debug 版本
  6. 支持可配置生成的目標文件及生成的中間文件的保存位置
  7. 支持可配置編譯時的格式化日誌打印
  8. 支持生成預處理文件和生成彙編文件命令
  9. 支持在腳本中配置參數
  10. 支持單個Makefile管理和多.mk文件管理
  11. 更多配置 . . .

四、目錄

project
    ├── doc
    ├── example
    │    ├── example1
    │    ├── example2
    │    ├── example3
    │    └── ...
    ├── src
    │    └── ...
    ├── tools
    │    ├── script
    │    │    ├── build.bat
    │    │    └── build.sh
    │    ├── sub_makefile
    │    │    ├── add_header.mk
    │    │    ├── add_library.mk
    │    │    └── add_source.mk
    │    ├── windows_tools
    │    │    └── ...
    │    └── ...
    ├── build.bat (與 ./tools/script/build.bat 文件是一樣的)
    ├── build.sh (與 ./tools/script/build.sh 文件是一樣的)
    ├── LICENSE
    └── Makefile

五、命令

更多詳細信息可通過 make help 來獲取

The following is a detailed explanation of all the commands.

  make start_main  - Equivalent to the make build command.
  make build       - Generating the target file, It is the same as directly executing the make command.
  make rebuild     - Re-generate the target file.
  make all         - Generate all files (such as .o, .d, .i, .s and object files).
  make rebuild_all - Re-generate all files (.o, .d, .i, .s and object files), and debugging is available.
  make clean       - Delete all intermediate files and target files.
  make preprocess  - Generate preprocessing file.
  make assemble    - Generate assembly file.
  make object      - Generate object file.
  make version     - Makefile version information.
  make infoprint   - Print detailed information.
  make help        - Help Information.

六、配置

1、與腳本相關的配置

# -# 僅腳本編譯方式 #
#  - 參數 = [YES]  只能由腳本來編譯, 使用make將會提示使用腳本來執行(腳本中必須設置這個變量並且值不為YES)
#  - 參數 = [NO]   可以直接使用make來編譯
MF_CONFIGURE_ONLY_STARTED_BY_SCRIPT ?= NO

2、配置子makefile文件(.mk)

#  # 配置需要使用子makefile文件(.mk), 多文件管理 #
#    當你在開發大型項目時建議使用該選項, 中小型項目可以不使用
#  - 參數 = [YES]  使用, 工程中使用一個頂層makefile文件及每個子文件夾下的.mk文件一起管理
#  - 參數 = [NO]   不使用, 工程中只使用一個頂層makefile文件管理(默認)
MF_CONFIGURE_USING_SUB_MAKEFILE ?= NO

# -# 配置需要添加子makefile文件路徑(包含該路徑下所有的子文件夾) #
#  - 説明 : 
#    -- 只有 MF_CONFIGURE_USING_SUB_MAKEFILE = YES 時才生效
#    -- 添加多個路徑以空格隔開
#    -- 它會自動添加該路徑下所有的子文件夾,不需要重複增加子文件夾
#  - 例子 : 
#    -- ?= ./src ../timer
#    -- += ./test
MF_CONFIGURE_ADD_SUB_MAKEFILE_PATHS_AND_SUBPATHS ?=

# -# 配置需要添加子makefile文件路徑 #
#  - 説明 : 
#    -- 只有 MF_CONFIGURE_USING_SUB_MAKEFILE = YES 時才生效
#    -- 添加多個路徑以空格隔開
#    -- 只添加該路徑下的子makefile文件(.mk)
#  - 例子 : 
#    -- ?= .
#    -- ?= ./src ./src/timer ./src/test
#    -- += ./test
MF_CONFIGURE_ADD_SUB_MAKEFILE_PATHS ?=

3、配置輸出目標文件信息

# -# 配置生成目標文件名稱 #
#  - 説明 : 
#    -- 該選項不能為空
#    -- 不能設置與已有的偽目標指令一樣的名稱
#  - 例子 : 
#    -- ?= main
#    -- ?= test
MF_CONFIGURE_TARGET_FILE_NAME ?= main

# -# 編譯後的目標文件輸出類型 #
#  - 參數 = [RELEASE] 刪除可執行文件中的符號表,符號表不影響程序的運行,減小程序體積
#  - 參數 = [DEBUG]   保留可執行文件中的符號表,使用gdb調試時要設置為 NO
#  - 參數 = [RELEASE_AND_DEBUG]   保留RELEASE和DEBUG可執行文件
MF_CONFIGURE_TARGET_RELEASE_OR_DEBUG ?= RELEASE_AND_DEBUG

# -# 編譯輸出文件類型 #
#  - 參數 = [EXECUTE]                    生成可執行程序
#  - 參數 = [LIBRARY_DYNAMIC]            生成(.so) 動態庫文件
#  - 參數 = [LIBRARY_STATIC]             生成(.a) 靜態庫文件
#  - 參數 = [LIBRARY_STATIC_AND_DYNAMIC] 生成(.a and .so) 動態靜態庫文件
MF_CONFIGURE_OUTPUT_TARGET_FILE_TYPE ?= LIBRARY_STATIC_AND_DYNAMIC

4、配置輸出文件夾信息

# -# 配置生成目標文件目錄 #
#  - 説明 : 
#    -- 當該選項為空時相當於 ?= .
#    -- 當該選項為 ?= . 時, 生成的目標文件會在Makefile所在文件夾中
#  - 例子 : 
#    -- ?= ./build
#    -- ?= ./output
#    -- ?= .
MF_CONFIGURE_TARGET_FILE_OUTPUT_PATH ?= ./build

# -# 配置編譯時的中間文件輸出目錄 #
#  - 説明 : 
#    -- 當該選項為空時相當於 ?= .
#    -- 當該選項為 ?= . 時, 編譯時的中間文件輸出會在源碼文件夾中
#  - 例子 : 
#    -- ?= ./build/output
#    -- ?= ./output
#    -- ?= .
MF_CONFIGURE_INTERMEDIATE_FILE_OUTPUT_PATH ?= ./build/output

5、配置添加源碼信息

# -# 配置需要添加編譯源文件所在的路徑(包含該路徑下所有的子文件夾) #
#  - 説明 : 
#    -- 添加多個根目錄以空格隔開
#    -- 該選項會自動包含目錄下所有的子文件夾, 不需要重複增加子文件夾
#    -- 在大型項目中不建議使用該選項, 它會檢索所有的子文件夾, 當子文件夾過多時可能會影響編譯效率. 在大型項目中建議 MF_CONFIGURE_ADD_SOURCE_CODE_PATHS 選項.
#    -- 默認為空
#  - 例子 : 
#    -- ?= ./src ../timer
#    -- += ./testd
MF_CONFIGURE_ADD_SOURCE_CODE_PATHS_AND_SUBPATHS ?= ../makefile1/src

# -# 配置需要添加編譯源文件所在的路徑 #
#  - 説明 : 
#    -- 添加多個目錄以空格隔開
#    -- 該選項只會生效添加的目錄
#  - 例子 : 
#    -- ?= .
#    -- ?= ./src ./src/timer
#    -- += ./test
MF_CONFIGURE_ADD_SOURCE_CODE_PATHS ?=

# -# 配置需要添加的編譯源碼文件 #
#  - 説明 : 
#    -- 添加多個編譯源碼文件以空格隔開
#  - 例子 : 
#    -- ?= ./test.c
#    -- ?= ./src/main.c ./lib/test.c ./lib/timer/test.c
#    -- += ./src/test.c
MF_CONFIGURE_ADD_SOURCE_CODE_FILES ?=

6、配置刪除(排除)源碼信息

# -# 配置需要刪除(排除)的編譯源文件所在的路徑(包含該路徑下所有的子文件夾) #
#  - 説明 : 
#    -- 添加多個根目錄以空格隔開
#    -- 該選項會自動包含目錄下所有的子文件夾, 不需要重複增加子文件夾
#    -- 在大型項目中不建議使用該選項, 它會檢索所有的子文件夾, 當子文件夾過多時可能會影響編譯效率. 在大型項目中建議 MF_CONFIGURE_DELETE_SOURCE_CODE_PATHS 選項.
#    -- 默認為空
#  - 例子 : 
#    -- ?= ./lib
#    -- ?= ./clib ./lib
#    -- += ./libtest
MF_CONFIGURE_DELETE_SOURCE_CODE_PATHS_AND_SUBPATHS ?=

# -# 配置需要刪除(排除)的編譯源文件所在的路徑 #
#  - 説明 : 
#    -- 添加多個根目錄以空格隔開
#    -- 該選項只會生效添加的目錄
#  - 例子 : 
#    -- ?= ./lib
#    -- ?= ./lib ./lib/test ./lib/timer
#    -- += ./libtest
MF_CONFIGURE_DELETE_SOURCE_CODE_PATHS ?=

# -# 配置需要刪除(排除)的編譯源碼文件 #
#  - 説明 : 
#    -- 添加多個文件以空格隔開
#  - 例子 : 
#    -- ?= ./test.c
#    -- ?= ./src/main.c ./lib/test.c ./lib/timer/test.c
#    -- += ./src/test.c
MF_CONFIGURE_DELETE_SOURCE_CODE_FILES ?=

7、配置頭文件

# -# 配置頭文件路徑包含範圍 # 
#  - 參數 = [ONLY_CONFIGURE_PATHS]    只包含通過 MF_CONFIGURE_ADD_HEADER_FILE_PATHS_AND_SUBPATHS 或 MF_CONFIGURE_ADD_HEADER_FILE_PATHS 變量配置的路徑
#  - 參數 = [BUILD_SOURCE_CODE_PATHS] 在 ONLY_CONFIGURE_PATHS 的基礎上還包含沒有被刪除(排除)掉的源文件路徑(編譯源碼路徑)
#  - 參數 = [ALL_SOURCE_CODE_PATHS]   在 ONLY_CONFIGURE_PATHS 的基礎上還包含所有的源文件路徑
#  - 參數 = [ALL_PATHS]               在 ALL_SOURCE_CODE_PATHS 的基礎上還包含被刪除(排除)的路徑及庫路徑
MF_CONFIGURE_HEADER_FILE_PATH_INCLUDE_RANGE ?= ALL_SOURCE_CODE_PATHS

# -# 配置需要添加頭文件路徑(包含該路徑下所有的子文件夾) #
#  - 説明 : 
#    -- 需要看 MF_CONFIGURE_HEADER_FILE_PATH_INCLUDE_RANGE 變量配置的區域
#    -- 添加多個路徑以空格隔開
#    -- 該選項會自動包含目錄下所有的子文件夾, 不需要重複增加子文件夾
#    -- 在大型項目中不建議使用該選項, 它會檢索所有的子文件夾, 當子文件夾過多時可能會影響編譯效率. 在大型項目中建議 MF_CONFIGURE_ADD_HEADER_FILE_PATHS 選項.
#    -- 默認為空
#  - 例子 : 
#    -- ?= ../src/inc ./lib
#    -- += ../lib/inc
MF_CONFIGURE_ADD_HEADER_FILE_PATHS_AND_SUBPATHS ?= 

# -# 配置需要添加頭文件路徑 #
#  - 説明 : 
#    -- 需要看 MF_CONFIGURE_HEADER_FILE_PATH_INCLUDE_RANGE 變量配置的區域
#    -- 添加多個路徑以空格隔開
#    -- 該選項只會生效添加的目錄
#    -- 默認為空
#  - 例子 : 
#    -- ?= .
#    -- ?= ../src/inc ./lib ./lib/test/inc
#    -- += ../lib/inc
MF_CONFIGURE_ADD_HEADER_FILE_PATHS ?=

8、配置庫信息

# -# 配置需要添加標準的庫名稱 #
#  - 説明 : 
#    -- 添加標準的庫名稱
#    -- 添加多個庫以空格隔開
#  - 例子 : 
#    -- ?= pthread rt m dl
#    -- += dl
#    -- += m
MF_CONFIGURE_ADD_STD_LIBRARY_NAME ?=

# -# 配置需要添加自己寫的庫或第三方庫路徑(包含該路徑下所有的子文件夾) #
#  - 説明 : 
#    -- 添加多個根目錄以空格隔開
#    -- 該選項會自動包含目錄下所有的子文件夾, 不需要重複增加子文件夾
#    -- 在大型項目中不建議使用該選項, 它會檢索所有的子文件夾, 當子文件夾過多時可能會影響編譯效率. 在大型項目中建議 MF_CONFIGURE_ADD_USER_LIBRARY_PATHS 選項.
#  - 例子 : 
#    -- ?= ./lib/timer
#    -- ?= ./src/lib
#    -- += ../lib
MF_CONFIGURE_ADD_USER_LIBRARY_PATHS_AND_SUBPATHS ?= 

# -# 配置需要添加自己寫的庫或第三方庫路徑 #
#  - 説明 : 
#    -- 添加多個根目錄以空格隔開
#    -- 該選項只會生效添加的目錄
#  - 例子 : 
#    -- ?= ./lib/timer ./lib ./lib/test
#    -- ?= ./src/lib
#    -- += ../lib
MF_CONFIGURE_ADD_USER_LIBRARY_PATHS ?=

# -# 配置需要添加自己寫的庫或第三方庫名稱 #
#  - 説明 : 
#    -- 添加自己寫的庫或第三方庫名稱
#    -- 在linux中 libtimer.so = timer
#    -- 在linux中 libtest.a   = test
#    -- 在windows中 media.lib = media
#    -- 添加多個庫以空格隔開
#  - 例子 : 
#    -- ?= timer media test
#    -- += timer
#    -- += test
MF_CONFIGURE_ADD_USER_LIBRARY_NAME ?=

9、配置用户宏信息

# -# 配置需要添加用户宏定義 #
#  - 説明 : 
#    -- 可在應用程序中使用宏
#    -- = __YE         相當於C語言 #define __YE
#    -- = __YE=1       相當於C語言 #define __YE 1
#    -- __YE=\"hello\" 相當於C語言 #define __YE "hello"
#  - 例子 : 
#    -- ?= __YE __CC __VERSION=\"1.0.0\"
#    -- += __YECC=\"hello\"
#    -- += __YECC_NUM=1
#    -- += APP_VERSION=\"1.0.0\"
MF_CONFIGURE_ADD_USER_DEFINE ?=

10、編譯配置

# -# 編譯原文件類型 #
#  - 參數 = [CPP_TYPE] 使用c++編譯器,編譯包括C和CPP文件
#  - 參數 = [C_TYPE]   使用c編譯器,只編譯包括C文件
MF_CONFIGURE_COMPILE_ORIGINAL_FILE_TYPE ?= C_TYPE

# -# 是否使用靜態編譯(僅作用於生成可執行程序) #
#  - 參數 = [YES] 使用靜態編譯, 編譯時會將所有的依賴文件都打包進來.對運行環境的依賴性較小,兼容性強;生成的程序比較大.
#  - 參數 = [NO]  使用動態編譯, 編譯後有着較小的程序體積,依賴動態庫,不能獨立運行.
MF_CONFIGURE_USING_STATIC_COMPILATION ?= NO

# -# 編譯後是否刪除中間文件(.d, .o, .i, .ii, .s) #
#  - 參數 = [YES] 刪除中間文件,每一次編譯都將是全編譯
#  - 參數 = [NO]  保留中間文件
MF_CONFIGURE_DELETING_INTERMEDIATE_FILES ?= NO

# -# 是否在執行編譯前先創建顯式聲明 #
#  - 參數 = [YES] 使用顯式聲明, 不建議使用,源文件過多時編譯前需要創建顯式規則會拖慢編譯時間, 需要make版本V3.81及以上可用否則不生效
#  - 參數 = [NO]  不使用顯式聲明, 建議使用
MF_CONFIGURE_USE_EXPLICIT_DECLARATION ?= NO

11、日誌配置

# -# 編譯過程控制枱日誌使用格式化顯示 #
#  - 參數 = [YES] 使用格式化顯示,能整齊的打印正在編譯的文件名
#  - 參數 = [NO]  打印編譯日誌
MF_CONFIGURE_USING_FORMATTEND_LOG ?= YES

# -# 編譯日誌使用格式化顯示字符串(.c -> .o) #
#  - 説明 : 
#    -- MF_CONFIGURE_USING_FORMATTEND_LOG = YES 時才生效
#  - 例子 : 
#    -- ?= CC
#    -- ?= [CC]
#    -- ?= Building
#    -- ?= Compiling
MF_CONFIGURE_FORMATTEND_LOG_CC_OBJECT_SHOW_STRING ?= CC

# -# 編譯日誌使用格式化顯示字符串(.cpp -> .o) #
#  - 説明 : 
#    -- MF_CONFIGURE_USING_FORMATTEND_LOG = YES 時才生效
#  - 例子 : 
#    -- ?= CPP
#    -- ?= [CPP]
#    -- ?= Building
#    -- ?= Compiling
MF_CONFIGURE_FORMATTEND_LOG_CPP_OBJECT_SHOW_STRING ?= CPP

# -# 編譯日誌使用格式化顯示字符串(.c -> .s) 或(.cpp -> .s) #
#  - 説明 : 
#    -- MF_CONFIGURE_USING_FORMATTEND_LOG = YES 時才生效
#  - 例子 : 
#    -- ?= AS
#    -- ?= [AS]
#    -- ?= [ASSEMBLY]
#    -- ?= Building
#    -- ?= Compiling
MF_CONFIGURE_FORMATTEND_LOG_ASSEMBLE_SHOW_STRING ?= AS

# -# 編譯日誌使用格式化顯示字符串(.c -> .i) 或 (.cpp -> .ii) #
#  - 説明 : 
#    -- MF_CONFIGURE_USING_FORMATTEND_LOG = YES 時才生效
#  - 例子 : 
#    -- ?= PR
#    -- ?= [PR]
#    -- ?= [PREPROCESS]
#    -- ?= Building
#    -- ?= Compiling
MF_CONFIGURE_FORMATTEND_LOG_PREPROCESS_SHOW_STRING ?= PR

# -# 鏈接打包生成靜態庫日誌使用格式化顯示字符串 #
#  - 説明 : 
#    -- MF_CONFIGURE_USING_FORMATTEND_LOG = YES 時才生效
#  - 例子 : 
#    -- ?= AR
#    -- ?= [AR]
#    -- ?= linking
#    -- ?= package
MF_CONFIGURE_FORMATTEND_LOG_LIBRARY_STATIC_SHOW_STRING ?= AR

# -# 鏈接打包生成動態庫日誌使用格式化顯示字符串 #
#  - 説明 : 
#    -- MF_CONFIGURE_USING_FORMATTEND_LOG = YES 時才生效
#  - 例子 : 
#    -- ?= LD
#    -- ?= [LD]
#    -- ?= linking
#    -- ?= package
MF_CONFIGURE_FORMATTEND_LOG_LIBRARY_DYNAMIC_SHOW_STRING ?= LD

# -# 鏈接打包生成可執行程序日誌使用格式化顯示字符串 #
#  - 説明 : 
#    -- MF_CONFIGURE_USING_FORMATTEND_LOG = YES 時才生效
#  - 例子 : 
#    -- ?= LD
#    -- ?= [LD]
#    -- ?= linking
#    -- ?= package
MF_CONFIGURE_FORMATTEND_LOG_EXECUTE_SHOW_STRING ?= LD

12、調試選項

#  - 説明 : 
#    -- 當 MF_CONFIGURE_COMPILE_ORIGINAL_FILE_TYPE = C_TYPE 時使用 MF_CONFIGURE_C_FLAGS, 否則使用 MF_CONFIGURE_CPP_FLAGS
#    -- += -g        在編譯的時候,產生調試信息
#    -- += -gstabs   此選項以stabs格式聲稱調試信息,但是不包括gdb調試信息. 
#    -- += -gstabs+  此選項以stabs格式聲稱調試信息,並且包含僅供gdb使用的額外調試信息.
#    -- += -ggdb     此選項將盡可能的生成gdb的可以使用的調試信息.
#    -- += -glevel   請求生成調試信息,同時用level指出需要多少信息,默認的level值是2
#    -- += ...
#  - 例子 : 
#    -- += -g
#    -- += -ggdb
MF_CONFIGURE_C_FLAGS   ?= -g
MF_CONFIGURE_CPP_FLAGS ?= -g

13、錯誤與告警選項

#  - 説明 : 
#    -- 當 MF_CONFIGURE_COMPILE_ORIGINAL_FILE_TYPE = C_TYPE 時使用 MF_CONFIGURE_C_FLAGS, 否則使用 MF_CONFIGURE_CPP_FLAGS
#    -- += -w 關閉所有編譯警告
#    -- += -Wall 啓用所有常用警告(未使用變量、未初始化變量、函數未聲明等)
#    -- += -Wextra 在-Wall基礎上增加額外警告(如空參數、類型轉換隱式丟失等)
#    -- += -Wunused-function 檢測聲明但未使用的靜態函數
#    -- += -Wunused-label 檢測未使用的標籤(如goto跳轉標籤被刪除後殘留)
#    -- += -Wshadow 當一個局部變量遮蓋住了另一個局部變量,或者全局變量時,給出警告
#    -- += -Wunreachable-code 如果編譯器探測到永遠不會執行到的代碼,就給出警告
#    -- += -Wundef 當一個沒有定義的符號出現在 #if 中時,給出警告。
#    -- += -Werror   把所有警告轉換為錯誤,以在警告發生時中止編譯過程
#    -- += -Wfatal-errors 遇到第一個錯誤就停止
#    -- += -Wconversion 警告隱式類型轉換(如int轉short可能丟失精度)
#    -- += -Wstrict-prototypes 要求函數聲明明確參數類型(禁用int foo()形式)
#    -- += -pedantic 允許發出ANSI/ISO C標準所列出的所有警告
#    -- += -pedantic-errors 允許發出ANSI/ISO C標準所列出的錯誤
#    -- += -Wno-conversion 禁止警告隱式類型轉換
#    -- += -Wno-unused-variable  禁止警告未使用的變量
#    -- += -Wno-unused-label  禁止警告未使用的標籤
#    -- += -Wno-unused-variable  禁止警告未使用的變量
#    -- += -Wno-unused-label  禁止警告未使用的標籤
#    -- += -Wno-unused-function  禁止警告未使用的函數
#    -- += ...
#  - 例子 : 
#    -- += -Wall -Werror -Wfatal-errors -Wunused-function -Wunused-label -Wconversion
#    -- += -Wall -Wfatal-errors -Wunused-function -Wunused-label -Wconversion
#    -- += -Wall -Werror
#    -- += -Wall
MF_CONFIGURE_C_FLAGS   += -Wall -Wfatal-errors -Wunused-function -Wunused-label -Wconversion
MF_CONFIGURE_CPP_FLAGS += -Wall -Wfatal-errors -Wunused-function -Wunused-label -Wconversion

14、動態庫導出符號

#  - 説明 : 
#    -- 當 MF_CONFIGURE_COMPILE_ORIGINAL_FILE_TYPE = C_TYPE 時使用 MF_CONFIGURE_C_FLAGS, 否則使用 MF_CONFIGURE_CPP_FLAGS
#    -- 建議在RELEASE版本中關閉
#    -- += -rdynamic 動態庫導出符號
#  - 例子 : 
#    -- += -rdynamic
#    -- +=
#MF_CONFIGURE_C_FLAGS   += -rdynamic
#MF_CONFIGURE_CPP_FLAGS += -rdynamic

15、指定編譯器

#  - 説明 : 
#    -- 當 MF_CONFIGURE_COMPILE_ORIGINAL_FILE_TYPE = C_TYPE 時使用 MF_CONFIGURE_C_FLAGS, 否則使用 MF_CONFIGURE_CPP_FLAGS
#    -- += -std=c99
#    -- += -std=c++11
#  - 例子 : 
#    -- += -std=c99
#    -- += -std=c++11
#    -- +=

#MF_CONFIGURE_C_FLAGS   += -std=c99
#MF_CONFIGURE_CPP_FLAGS += -std=c++11

16、編譯器優化級別

#  - 説明 : 
#    -- 當 MF_CONFIGURE_COMPILE_ORIGINAL_FILE_TYPE = C_TYPE 時使用 MF_CONFIGURE_C_FLAGS, 否則使用 MF_CONFIGURE_CPP_FLAGS
#    -- += -O0 無優化,保留完整調試信息,代碼執行最慢,開發調試階段
#    -- += -O1 基礎優化,輕微提升性能,不影響調試,對性能要求不高的調試版本
#    -- += -O2 中等優化,全面啓用安全優化,顯著提升性能,編譯時間可控,發佈版本的默認選擇
#    -- += -O3 高度優化,可能增加代碼體積和編譯時間,偶有兼容性問題,代碼執行速度快,高性能計算等特定場景
#  - 例子 : 
#    -- += -O2
#    -- += -O1
#    -- += -O0
#MF_CONFIGURE_C_FLAGS   += -O2
#MF_CONFIGURE_CPP_FLAGS += -O2

17、其他選項

#  - 説明 : 
#    -- 當 MF_CONFIGURE_COMPILE_ORIGINAL_FILE_TYPE = C_TYPE 時使用 MF_CONFIGURE_C_FLAGS, 否則使用 MF_CONFIGURE_CPP_FLAGS
#    -- +=
#  - 例子 : 
#    -- +=
#MF_CONFIGURE_C_FLAGS   +=
#MF_CONFIGURE_CPP_FLAGS +=

18、作用於生成.o文件編譯選項

#  - 説明 : 
#    -- 當 MF_CONFIGURE_COMPILE_ORIGINAL_FILE_TYPE = C_TYPE 時使用 MF_CONFIGURE_C_OBJECTS_FLAGS, 否則使用 MF_CONFIGURE_CPP_OBJECTS_FLAGS
#    -- ?= -MMD  : 生成依賴文件, 自動生成 .d 依賴文件, 如 main.c → main.d
#    -- ?= -MP   : 在生成的 .d 文件中為每個頭文件添加一個無依賴的偽目標, 當頭文件被刪除時,避免make報錯)
#    -- ?= -fPIC : 生成位置無關代碼, 用於編譯動態鏈接庫, 但這裏一般不用
#  - 例子 : 
#    -- ?= -MMD -MP
#    -- ?= -MMD
#    -- ?= -MP
MF_CONFIGURE_C_OBJECTS_FLAGS   ?= -MMD -MP
MF_CONFIGURE_CPP_OBJECTS_FLAGS ?= -MMD -MP

19、編譯工具配置

# -# 指定使用的編譯工具路徑前綴 #
#  - 説明 : 
#    -- 默認為空
#    -- 交叉編譯時必須寫上編譯工具路徑前綴
#    -- 當為空時編譯出來的程序為當前系統可執行程序
#  - 例子 : 
#    -- ?= .
#    -- ?= arm-linux-
#    -- ?= arm-linux-gnueabi-
#    -- ?= arm-linux-gnueabihf-
#    -- ?= ./tools/compile_tools/arm-linux-gnueabihf-
MF_CONFIGURE_COMPILE_PATH_PREFIX ?=

20、平台配置

# -# 配置makefile使用的平台 #
#  - 説明 : 
#    -- 這個決定了makefile是在哪個平台下使用的
#    -- 默認情況下為 ?= $(OS) 它可以自動識別是否在windows系統, 當然也可以直接手動指定
#    -- auto    :$(OS)
#    -- windows :?= WINDOWS or ?= Windows_NT
#    -- linux   :?= LINUX   or ?=
#  - 例子 : 
#    -- ?= $(OS)
#    -- ?= WINDOWS
#    -- ?= LINUX
MF_CONFIGURE_PLATFORM_OS ?= $(OS)

21、配置工具

# -# 配置Windows工具路徑 #
#  - 説明 : 
#    -- 這項主要是針對windows中使用makefile的情況
#    -- 在linux中這項可以不配置,如 ?=
#    -- 在windows中使用makefile時,必須配置Windows工具路徑
#    -- 你可以在./tools/目錄下找到工具
#  - 例子 : 
#    -- ?= ./tools/windows_tools_x86/usr/bin/
#    -- ?= ./tools/windows_tools_arm/usr/bin/
#    -- ?= ./tools/windows_tools/usr/bin/
#    -- ?= ./tools
MF_CONFIGURE_WINDOWS_TOOLS ?= ./tools/windows_tools/usr/bin/

# -# 配置Linux工具路徑 #
#  - 説明 : 
#    -- 這項主要是針對linux中使用makefile的情況
#    -- 在windows中這項可以不配置,如 ?=
#    -- 在linux中使用makefile時,正常情況下是不需要配置該選項的,如 ?= ,只有當你使用的系統版本過低時,一些工具指令功能不完善時才需要配置該工具路徑
#    -- 你可以在./tools/目錄下找到工具
#  - 例子 : 
#    -- ?= ./tools/linux_tools/usr/bin/
#    -- ?= ./tools
MF_CONFIGURE_LINUX_TOOLS ?=

# -# 配置使用的shell工具 #
#  - 説明 : 
#    -- 這個決定了makefile在執行shell命令時使用的工具
#    -- 默認情況下為 ?= SH
#  - 參數 = [SH]   使用sh來執行shell命令工具
#  - 參數 = [BASH] 使用bash來執行shell命令工具
MF_CONFIGURE_USE_SHELL_TOOLS ?= BASH

七、許可證

The MIT License (MIT)

https://mit-license.org/

Copyright © 2025 <Yezc/Makefile>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.