Makefile 基本知识
?
最常見的書寫方式: CC = gcc LD = ld STRIP = strip CFLAGS := -Os -static -DEZ_OS_LINUX CLFLAGS := -Os -static all: mainEXEC = main OBJS = main.o mytool1.o mytool2.o INCS = mytool1.h mytool2.hall: $(EXEC) $(EXEC): $(OBJS)$(CC) $(CFLAGS) -o $@ $(OBJS)$(STRIP) $@ clean:-rm -f $(EXEC) *.elf *.gdb *.o %.o: %.c $(INCS)$(CC) $(CFLAGS) -c $< -o $@?
Makefile中允許使用簡單的宏來指代源文件以及相關編譯選項,引用宏時,必須在變量名稱前加美元$,同時,使用圓括號括起來(變量名為兩個字母以上時)
下面都是有效的宏引用:
??? $(CFLAGS)
??? $2
??? $Z
??? $(Z)?
其中最后兩個引用是完全一致的。
??? $@????? --? 目標文件,??
??? $^????? --? 所有的依賴文件,
??? $<????? --? 第一個依賴文件。
# 這是簡化后的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^??????????? //$@ 就是main, $^就是main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c $<?????????????? //$<就是main.c
mytool1.o:mytool1.c mytool1.h
gcc -c $<?????????????? //$<就是mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c $<?????????????? //$<就是mytool2.c
?
常用字符串處理函數
1.$(subst FROM,TO,TEXT)
函數名稱:字符串替換函數—subst。
函數功能:把字串“TEXT”中的“FROM”字符替換為“TO”。
返回值:替換后的新字符串。
2.$(patsubst PATTERN,REPLACEMENT,TEXT)
函數名稱:模式替換函數—patsubst。
函數功能:搜索“TEXT”中以空格分開的單詞,將否符合模式“TATTERN”替換為“REPLACEMENT”。參數“PATTERN”中可以使用模式通配符“%”來代表一個單詞中的若干字符。
返回值:替換后的新字符串。
函數說明:參數“TEXT”單詞之間的多個空格在處理時被合并為一個空格,但前導和結尾空格忽略。
3.$(strip STRINT)
函數名稱:去空格函數—strip。
函數功能:去掉字串(若干單詞,使用若干空字符分割)“STRINT”開頭和結尾的空字符,并將其中多個連續空字符合并為一個空字符。
返回值:無前導和結尾空字符、使用單一空格分割的多單詞字符串。
函數說明:空字符包括空格、[Tab]等不可顯示字符。
4.$(sort LIST)
函數名稱:排序函數—sort。
函數功能:給字串“LIST”中的單詞以首字母為準進行排序(升序),并取掉重復的單詞
返回值:空格分割的沒有重復單詞的字串。
函數說明:兩個功能,排序和去字串中的重復單詞。可以單獨使用其中一個功能。
?
二、文件名處理函數
1.$(dir NAMES…)
函數名稱:取目錄函數—dir。
函數功能:從文件名序列“NAMES…”中取出各個文件名目錄部分。文件名的目錄部分就是包含在文件名中的最后一個斜線(“/”)(包括斜線)之前的部分。
返回值:空格分割的文件名序列“NAMES…”中每一個文件的目錄部分。
函數說明:如果文件名中沒有斜線,認為此文件為當前目錄(“./”)下的文件。
2.$(notdir NAMES…)
函數名稱:取文件名函數——notdir。
函數功能:從文件名序列“NAMES…”中取出非目錄部分。目錄部分是指最后一個斜線(“/”)(包括斜線)之前的部分。刪除所有文件名中的目錄部分,只保留非目錄部分
返回值:文件名序列“NAMES…”中每一個文件的非目錄部分。
3.$(addprefix PREFIX,NAMES…)
函數名稱:加前綴函數—addprefix。
函數功能:為“NAMES…”中的每一個文件名添加前綴“PREFIX”。參數“NAMES…”是空格分割的文件名序列,將“SUFFIX”添加到此序列的每一個文件名之前。
返回值:以單空格分割的添加了前綴“PREFIX”的文件名序列。
4.$(wildcard PATTERN)
函數名稱:獲取匹配模式文件名函數—wildcard
函數功能:列出當前目錄下所有符合模式“PATTERN”格式的文件名。
返回值:空格分割的、存在當前目錄下的所有符合模式“PATTERN”的文件名。
函數說明:“PATTERN”使用shell可識別的通配符,包括“?”(單字符)、“*”(多字符)等。
?
三、其它函數
1.$(foreach VAR,LIST,TEXT)
函數功能:函數“foreach”不同于其它函數。它是一個循環函數。類似于Linux的shell中的循環(for語句)。這個函數的工作過程是這樣的:如果必要(存在變量或者函數的引用),首先展開變量“VAR”和“LIST”;而表達式“TEXT”中的變量引用不被展開。執行時把“LIST”中使用空格分割的單詞依次取出賦值給變量“VAR”,然后執行“TEXT”表達式。重復直到“LIST”的最后一個單詞(為空時結束)。“TEXT”中的變量或者函數引用在執行時才被展開,因此如果在“TEXT”中存在對“VAR”的引用,那么“VAR”的值在每一次展開式將會到的不同的值。
返回值:空格分割的多次表達式“TEXT”的計算的結果。
2.$(if CONDITION,THEN-PART[,ELSE-PART])
函數功能:函數“if”提供了一個在函數上下文中實現條件判斷的功能。就像make所支持的條件語句—ifeq。第一個參數“CONDITION”,在函數執行時忽略其前導和結尾空字符并展開。“CONDITION”的展開結果非空,則條件為真,就將第二個參數“THEN_PATR”作為函數的計算表達式,函數的返回值就是第二表達式的計算結果;“CONDITION”的展開結果為空,將第三個參數“ELSE-PART”作為函數的表達式,返回結果為第三個表達式的計算結果。
返回值:根據條件決定函數的返回值是第一個或者第二個參數表達式的計算結果。當不存在第三個參數“ELSE-PART”,并且“CONDITION”展開為空,函數返回空。
函數說明:函數的條件表達式“CONDITION”決定了,函數的返回值只能是“THEN-PART”或者“ELSE-PART”兩個之一的計算結果。
3.$(shell command arguments)
函數功能:函數“shell”所實現的功能和shell中的引用(``)相同。實現了命令的擴展。意味著需要一個shell命令作為它的參數,而返回的結果是此命令在shell中的執行結果。make僅僅對它的回返結果進行處理;make將函數的返回結果中的所有換行符(“\n”)或者一對“\n\r”替換為單空格;并去掉末尾的回車符號(“\n”)或者“\n\r”。函數展開式時,它所調用的命令(它的參數)得到執行。除了對它的引用出現在規則的命令行中和遞歸的變量定義引用以外,其它決大多數情況下,make在讀取Makefile時函數shell就被擴展。
返回值:函數“shell”的參數在shell中的執行結果。
函數說明:函數本身的返回值是其參數的執行結果,沒有進行任何處理。對結果的處理是由make進行的。當對函數的引用出現在規則的命令行中,命令行在執行時函數引用才被展開。展開過程函數參數的執行時在另外一個shell進程中完成的,因此對于出現在規則命令行的多級“shell”函數引用需要謹慎處理,否則會影響效率(每一級的“shell”函數的參數都會有各自的shell進程)。
轉載于:https://www.cnblogs.com/cherishui/p/4313965.html
總結
以上是生活随笔為你收集整理的Makefile 基本知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux tcp 压力测试工具,技术|
- 下一篇: 瞬间“友尽”的五大整蛊代码,快去安排你的