編譯器有關的Makefile語法

lethe1203發表於2024-03-17
在 Makefile 中,與編譯器相關的語法通常用於定義編譯規則和連結規則,以及設定編譯器選項等。

編譯器相關的 Makefile 語法

  • 定義變數
CFLAGS = -Wall -O2
  • 編譯規則
%.o: %.c $(CC) $(CFLAGS) -c $< -o $@
  • 連結規則
program: file1.o file2.o $(CC) $^ -o $@
  • 使用編譯器變數和選項
$(CC) $(CFLAGS) -c source.c -o object.o
  • 指定標頭檔案搜尋路徑
CPPFLAGS = -I/path/to/include
  • 指定庫檔案搜尋路徑
LDFLAGS = -L/path/to/lib LDLIBS = -lmylib
  • 指定交叉編譯器
CROSS_COMPILE=aarch64-linux-gnu- 
CROSS_COMPILE=$CROSS_COMPILETOOL
  • 指定生成目錄
O=build
  • 指定架構
ARCH=arm64

CCFLAGS和CFLAGS的概念

在 Makefile 中,CCFLAGS 和 CFLAGS 變數都可以用來指定編譯器選項。它們的區別在於用途和命名習慣。
  • CFLAGS:通常用來指定 C 語言的編譯器選項,如警告級別、最佳化級別等。它是一個常見的約定俗成的變數名,用於儲存與 C 語言編譯相關的選項。
  • CCFLAGS:是一個更通用的變數名,可以用來指定任何編譯器(包括 C、C++、Objective-C 等)的選項。它不限於特定語言,可以包含更廣泛的編譯器選項。
實際上,CCFLAGS 變數在某些 Makefile 中可能被用作 C 編譯器選項的別名。這樣做的目的是為了與其他語言的編譯器選項變數保持一致,或者為了方便將同一組選項同時應用於多個編譯器。
總而言之,CFLAGS 更常見且特定於 C 語言的編譯器選項,而 CCFLAGS 則更通用、更靈活,可以適用於其他編譯器。

CFLAGS可選項

CFLAGS 是在 Makefile 中用來儲存 C 編譯器選項的變數,可以包含一系列用於編譯 C 程式碼的選項。以下是一些常見的 C 編譯器選項,可以新增到 CFLAGS 中:
  • -Wall:啟用大多數警告資訊。
  • -Werror:將警告視為錯誤。
  • -g:生成除錯資訊。
  • -O2 或 -O3:開啟最佳化級別 2 或 3。
  • -std=c11:指定使用 C11 標準進行編譯。
  • -I:新增標頭檔案搜尋路徑。
  • -L:新增庫檔案搜尋路徑。
  • -l:連結指定的庫。
  • -D:定義預處理宏。
  • -c:只編譯不連結,生成目標檔案。
  • -o :指定輸出檔名。
這些選項可以根據具體需求進行組合和調整,以滿足不同的編譯需求。透過合理設定 CFLAGS 變數,可以簡化 Makefile 中的編譯規則,並確保程式碼按照預期方式進行編譯

CCFLAGS-y

CCFLAGS-y 是一個自定義的編譯器選項,它在 Makefile 中可能被用來指示特定的條件編譯。
在 Makefile 中,CCFLAGS-y 的約定通常是用於條件編譯的情況。條件編譯可以根據某些條件來選擇性地包含或排除程式碼的一部分。 CCFLAGS-y 可能會被用作一個標誌,用於啟用或禁用特定的編譯器選項。
具體來說,當某個條件滿足時,CCFLAGS-y 變數中的選項會被新增到編譯器選項中。而當該條件不滿足時,這些選項則不會被包含在編譯器選項中。
舉個例子:
ccflags-y += -D__CCFLAGS_TEST__
__CCFLAGS_TEST__:=1
export __CCFLAGS_TEST__            // 匯出了__CCFLAGS_TEST__宏,使得在 Makefile 中定義的宏可以在子程序中使用
透過以上的程式碼,編譯過程中會將 __CCFLAGS_TEST__宏定義為1,從而在程式碼中可以根據這個宏的取值進行條件編譯,實現不同的編譯選項和行為。

ccflags-$(CONFIG_DEBUG_TEST) := -DDEBUG

ccflags-$(CONFIG_DEBUG_TEST) := -DDEBUG 的含義是根據名為 CONFIG_DEBUG_TEST 的配置選項來設定編譯器選項。
  • 如果 CONFIG_DEBUG_TEST 配置選項被定義了(即非空),那麼 ccflags-$(CONFIG_DEBUG_TEST) 將被設定為 -DDEBUG。-DDEBUG 是一個 C 編譯器選項,用於在預處理階段定義名為 DEBUG 的宏。
  • 如果 CONFIG_DEBUG_TEST 配置選項未定義或為空,那麼 ccflags-$(CONFIG_DEBUG_TEST) 將為空,不會設定任何額外的編譯器選項。
還需要在Kconfig中新增CONFIG_DEBUG_TEST 的配置選項

make clean

在Makefile中有以下定義:

clean: archclean bootclean

這行程式碼片段實際上定義了一個規則,說明了當執行 make clean 命令時,需要先執行 archclean 和 bootclean 這兩個目標。這樣做的目的是確保在執行清理操作時,先執行與特定架構相關的清理操作(archclean),然後再執行清除boot啟動相關的檔案(bootclean)

CRYPTO=yes

表示開啟某種加密模組

相關文章