Makefile學習筆記(六)

2021-10-17 10:22:37 字數 4472 閱讀 9030

foreach函式是用來做迴圈的,語法規則是:

$(foreach ,,

)

函式的功能就是把引數list中的單詞逐個取出放在引數var所指定的變數中,然後執行text所包含的表示式。每一次text會返回乙個字串,迴圈過程中,text所返回的每個字串以空格分隔,最後當整個迴圈結束時,text所放回的每個字串所組成的整個字串將會是該函式的返回值。

舉例:

names :

= a b c d

files :

= $(foreach n,$(names)

,$(n)

.o)

$(names)中的單詞會挨個取出,並存在變數n中,

$(n)

.o每次根據$(n)計算出乙個值,這些值會以空格分隔,

最後作為foreach函式的返回值,所以$(files)的值是a.o b.o c.o d.o

if函式的語法:

$(if,

)

或是

$(if,

,<

else

-part>

)

如果condition為真,那then-part的執行結果會是整個函式的返回值,如果condition為假,那else-part的執行結果會是整個函式的返回值。

call函式可以給表示式傳遞引數。其語法是:

$(call ,,

,...)

當make執行這個函式時,expression引數中的變數會被parm1、parm2、parm3所取代。parm引數的個數會根據expression中的變數來決定。

舉例:

reverse =  $(

1) $(2)

foo = $(call reverse,a,b)

所以上面**的功能就是reverse中的變數會被a,b所取代。並且foo的值也是a,b

origin函式的功能就是告訴某個引數是**來的。語法規則如下:

$(origin 

)

variable是變數的名字,不應該是引用。所以最好不要用$這個字元,origin函式會以返回值的形式來告訴這個變數的出生情況。

下面是這個函式的一些返回值情況:

undefined

如果variable從未定義過,那麼返回undefined。

default

如果variable是乙個預設的變數,比如"cc"這個變數

environment

如果variable是乙個環境變數,並且當makefile被執行時,「-e」引數沒有被開啟的情況下。

file

如果variable這個變數被定義到makefile中。

command line

如果variable這個變數是被命令列定義的。

override

如果variable這個變數是被override指示符重新定義的。

automatic

如果variable這個變數是乙個在命令中執行中的自動化變數。

它的引數應該就是該作業系統shell的命令,shell函式把執行作業系統命令後的輸出作為函式的返回值。

contents :

= $(shell cat foo)

files :

= $(shell echo *

.c)

使用shell函式要注意它是否影響執行效能,如果makefile中的規則很複雜,並且大量使用了這個函式,那麼對於系統效能是有害的。

make提供了一些函式來控制make的執行。通常,我們會根據makefile的執行資訊來判斷make是否繼續執行。

$(error >

)

text是錯誤資訊。error函式不會再一被使用就產生錯誤資訊,所以如果把其定義在乙個變數中,並在後序的指令碼裡面使用這個變數,那也是行的通的。

舉例:

ifdef error_001

$(error error is $(error_001)

) endif

還有這個警告函式。

$(warning >

)

這個函式和error函式很像,只是它不會讓make退出,只是輸出一些警告資訊,而繼續執行make。

接下來講述怎樣使用make命令。

make命令執行後有三個退出碼:

0 — 表示成功執行

1 — 如果make執行時出現任何錯誤,其返回1

2 — 如果你使用了make的「-q」選項,並且make使得一些目標不需要更新,那麼返回2

make找尋預設的makefile時,首先是在當前目錄下面找「makefile」、「makefile」、「gnumakefile」。先查詢這三個檔案看存不存在,一旦找到,就開始讀取這個檔案並執行。

當前,我們也可以給make命令指定乙個特殊名字的makefile。但是要使用make命令的-f引數或者–file引數。例如我們自己定義乙個檔案名叫makefiletome,那麼我們就要這樣執行我們的makefile:

make   -f   makefiletome
如果在make命令列中,我們不止一次使用-f引數,那麼所有指定的makefile將會一起傳遞給make執行。

一般來說,make的最終目標是makefile中的第乙個目標,而其他的目標一般是被這個第乙個目標連帶出來的。但是,一般情況下,我們的makefile中的第乙個目標會由許多目標組成,你可以指示make,讓其完成所指定的目標,要實現這一功能很簡單,直接在make後面跟乙個目標名字就可以了。

我們可以參照這種規則來書寫我們的makefile中的目標。

「all」

這個偽目標是所有目標的目標,其功能一般是編譯所有的目標。

「clean」

這個偽目標功能是刪除所有被make建立的檔案。

「install」

這個偽目標功能是安裝已編譯好的程式,其實就是把目標執行檔案拷貝到指定的目標中去。

「print」

這個偽目標的功能是例出改變過的原始檔。

「tar」

這個偽目標功能是把源程式打包備份。也就是乙個tar檔案。

「dist」

這個偽目標功能是建立乙個壓縮檔案,一般是把tar檔案壓成z檔案。或是gz檔案。

「tags」

這個偽目標功能是更新所有的目標,以備完整地重編譯使用。

「check」和「test」

這兩個偽目標一般用來測試makefile的流程。

這些不是硬要求,名字是可以自定義的,只不過這些名字規範些。

有時,我們只是想讓我們的makefile中的規則執行起來,我們只想檢查一些我們的命令,或是執行的序列。於是我們可以使用make命令的下述引數

「-n」

「--just-print」

「--dry-run」

「--recon」

不執行引數,這些引數只是列印命令,不管目標是否更新,把規則和連帶規則下的命令列印出來,但不執行,這些引數對於我們除錯makefile很有用處。

「-t」

「--touch」

這個引數的意思就是把目標檔案的時間更新,但不更改目標檔案。也就是說,make假裝編譯目標,但不是真正的編譯目標,只是把目標程式設計以編譯過的狀態。

「-q」

「--question」

這個引數的行為就是找目標的意思,也就是說,如果目標存在,那麼其什麼也不會輸出,當然也不會執行編譯,如果目標不存在,那麼將會列印一條錯誤資訊。

「-w 」

「--what-if=

」「--assume-new=

」「--new-file=

這個引數需要指定乙個檔案,一般是原始檔(或依賴檔案),make會根據規則推導來執行依賴於這個檔案的命令,一般來說,可以和-n引數一同使用,來檢視這個依賴檔案所發生的的規則命令。

「-b」

「--always-make」

認為所有的目標都需要更新(重編譯)。

「-c 」

「--directory=

指定讀取makefile的目錄。如果有多個「-c」引數,make的解釋是後面的路徑以前面的作為相對路徑,並以最後的目錄作為被指定目錄。如:「make –c ~hchen/test –c prog」等價於「make –c ~hchen/test/prog」。

makefile學習筆記 makefile概述

20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...

Makefile學習筆記

makefile for boot asm nasm 定義變數 asmflags i include run qemu system i386 hdd boot.img boot.img boot.asm asm boot.asm f bin o boot.img install run clean...

Makefile學習筆記

本文為學習筆記,僅供參考,如有好的建議歡迎指出!makefile規則 目標檔案 依賴檔案 tab 命令 命令前必須有乙個tab exp test main.c gcc main.c o test 隱式規則 o c 同名匹配 變數 類似於c中的巨集,引用方式 arg 變數名 值 引用變數可在之後定義 ...