Makefile之大型工程專案子目錄Makefile的一種通用寫法
管理Linux環境下的大型專案,能夠有一個智慧的Build子系統會起到事半功倍的效果,本文描述Linux環境下大型工程專案子目錄Makefile的一種通用寫法,使用該方法,當該子目錄內的檔案有增刪時無需對Makefile進行改動,可以說相當的智慧。下面先貼程式碼(為了減少篇幅,一些非關鍵的程式碼被去掉):
- ROOTDIR = .
- EXE_DIR = ./bin
- CFLAGS = -I$(INCLUDE_DIR) -I$(LIB_INC) -Wall
- LFLAGS = -L$(LIB_DIR)
- objects := $(patsubst %.c,%.o,$(wildcard *.c))
- executables := $(patsubst %.c,%,$(wildcard *.c))
- $(objects) : %.o: %.c
- $(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
- all : $(executables)
- $(executables) : $(objects)
- @mkdir -p ./bin$
- (CROSS_COMPILE)gcc $(CFLAGS) $< -o $(EXE_DIR)/$@ $(LFLAGS) $(LIBS)
- clean:
- @rm -f *.o rm -f ./bin/*
- @rm -rf ./bin
- distclean: clean
假如當前目錄裡面有a.c b.c兩個檔案
Makefile裡的函式跟它的變數很相似——使用的時候,你用一個 $ 符號跟開括號,函式名,空格後跟一列由逗號分隔的引數,最後 用關括號結束。例如,在 GNU Make裡有一個叫'wildcard'的函式,它有一個引數,功能是展開成一列所有符合由其引數描述的檔名,檔案間以空格間隔。像這個命令:
objects= $(wildcard *.c)
會產生一個所有以'.c' 結尾的檔案的列表(本例a.c b.c),然後存入變數 objects裡。
另一個有用的函式是 patsubst ( patten substitude,匹配替換的縮寫)函式。它需要3個引數——第一個是一個需要匹配的式樣,第二個表示用什麼來替換它,第三個是一個需要被處理的由空格分隔的字列。例如,處理那個經過上面定義後的變數:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
會被處理為:
objects := a.o b.o
同理:
executables := $(patsubst %.c,%,$(wildcard *.c))
會被處理為:
executables := a b
%o:所有以“.o”結尾的目標,也就是a.o b.o
依賴模式“%.c”:取模式“%.o”的%,也就是foo bar,併為其加上.c字尾,即a.c,b.c
$<:表示所有依賴集,也就是a.c b.c
$@:表示目標集,也就是a.o b.o
命令前加@,表示在終端中不列印,如@mkdir -p ./bin
$(objects) : %.o: %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
即可翻譯為:
a.o b.o : a.c b.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) (a.c b.c) -o (a.o b.o)
明白了這些,這種Makefile的寫法就可以完全掌握了。
相關文章
- 把object放到同一個目錄的Makefile寫法,目標檔案同一目錄Object
- [zz]makefile寫法簡單示例
- C/C++ 通用 Makefile(轉)C++
- qmake、.pro(Qt工程檔案)、make、MakefileQT
- 一個C++專案的Makefile編寫-Tony與Alex的對話系列C++
- makefile中的shell語法
- 適用於 Go 專案的 Makefile 指南Go
- Linux下的makefile編寫 ——陳皓《跟我一起寫Makefile》學習筆記(二)Linux筆記
- 新建一個最小的Makefile工程(C語言)C語言
- Linux平臺Makefile檔案的編寫Linux
- makefile之overrideIDE
- 一文學完makefile語法
- makefile檔案案例
- Android OTA升級(一)之Makefile檔案分析Android
- Makefile中幾種賦值(= := ?= +=)賦值
- Makefile-4-書寫命令
- 一、靜態庫和動態庫,Makefile專案管理專案管理
- [linux]一個通用驅動Makefile-V2-支援編譯多目錄Linux編譯
- Makefile學習(一)
- Makefile
- 【Makefile】5-Makefile變數的基礎變數
- 用eclipse開啟已有makefile的c專案Eclipse
- 編寫一個 Makefile 檔案,對階段專案一的程式碼進行自動化編譯編譯
- golang 構建工具之 MakefileGolang
- Makefile檔案是什麼?
- QT子目錄的專案刪除不了QT
- 編譯器有關的Makefile語法編譯
- android編譯系統makefile(Android.mk)寫法Android編譯
- Makefile書寫命令相關內容
- 淺談 Linux 下 Makefile 編寫Linux
- GNU工程管理器make與Makefile教程
- Makefile筆記筆記
- makefile 詳解
- makefile 簡明教程 —— 助你更好理解 C 專案組織
- Makefile 專案構建最佳化原理與應用
- Makefile學習之路(2) — Makefile的變數和萬用字元變數字元
- makefile =和:=的區別
- Makefile 一步入門