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