1. 程式人生 > >makefile詳解 函式 字串 檔名 二十一

makefile詳解 函式 字串 檔名 二十一

在Makefile中可以使用函式來處理變數,從而讓我們的命令或是規則更為的靈活和具有智慧。make所支援的函式也不算很多,不過已經足夠我們的操作了。函式呼叫後,函式的返回值可以當做變數來使用。


一、函式的呼叫語法

函式呼叫,很像變數的使用,也是以“$”來標識的,其語法如下:

    $(<function>; <arguments>;)

或是

    ${<function>; <arguments>;}

這裡,<function>;就是函式名,make支援的函式不多。<arguments>;是函式的引數,引數間以逗號“,”分隔,而函式名和引數之間以“空格”分隔。函式呼叫以“$”開頭,以圓括號或花括號把函式名和引數括起。感覺很像一個變數,是不是?函式中的引數可以使用變數,為了風格的統一,函式和變數的括號最好一樣,如使用“$(subst a,b,$(x))”這樣的形式,而不是“$(subst a,b,${x})”的形式。因為統一會更清楚,也會減少一些不必要的麻煩。

還是來看一個示例:

    comma:= ,
    empty:=
    space:= $(empty) $(empty)
    foo:= a b c
    bar:= $(subst $(space),$(comma),$(foo))

在這個示例中,$(comma)的值是一個逗號。$(space)使用了$(empty)定義了一個空格,$(foo)的值是“a b c”,$(bar)的定義用,呼叫了函式“subst”,這是一個替換函式,這個函式有三個引數,第一個引數是被替換字串,第二個引數是替換字串,第三個引數是替換操作作用的字串。這個函式也就是把$(foo)中的空格替換成逗號,所以$(bar)的值是“a,b,c”。


二、字串處理函式

$(subst <from>;,<to>;,<text>;) 

    名稱:字串替換函式——subst。
    功能:把字串<text>;中的<from>;字串替換成<to>;。
    返回:函式返回被替換過後的字串。

    示例:
        
        $(subst ee,EE,feet on the street),
        
        把“feet on the street”中的“ee”替換成“EE”,返回結果是“fEEt on the strEEt”。


$(patsubst <pattern>;,<replacement>;,<text>;) 

    名稱:模式字串替換函式——patsubst。
    功能:查詢<text>;中的單詞(單詞以“空格”、“Tab”或“回車”“換行”分隔)是否符合模式<pattern>;,如果匹配的話,則以<replacement>;替換。這裡,<pattern>;可以包括萬用字元“%”,表示任意長度的字串。如果<replacement>;中也包含“%”,那麼,<replacement>;中的這個“%”將是<pattern>;中的那個“%”所代表的字串。(可以用“\”來轉義,以“\%”來表示真實含義的“%”字元)
    返回:函式返回被替換過後的字串。

    示例:

        $(patsubst %.c,%.o,x.c.c bar.c)

        把字串“x.c.c bar.c”符合模式[%.c]的單詞替換成[%.o],返回結果是“x.c.o bar.o”

    備註:

        這和我們前面“變數章節”說過的相關知識有點相似。如:

        “$(var:<pattern>;=<replacement>;)”
         相當於
        “$(patsubst <pattern>;,<replacement>;,$(var))”,

         而“$(var: <suffix>;=<replacement>;)”
         則相當於
         “$(patsubst %<suffix>;,%<replacement>;,$(var))”。

         例如有:objects = foo.o bar.o baz.o,
         那麼,“$(objects:.o=.c)”和“$(patsubst %.o,%.c,$(objects))”是一樣的。

$(strip <string>;)

    名稱:去空格函式——strip。
    功能:去掉<string>;字串中開頭和結尾的空字元。
    返回:返回被去掉空格的字串值。
    示例:
        
        $(strip a b c )

        把字串“a b c ”去到開頭和結尾的空格,結果是“a b c”。

$(findstring <find>;,<in>;)

    名稱:查詢字串函式——findstring。
    功能:在字串<in>;中查詢<find>;字串。
    返回:如果找到,那麼返回<find>;,否則返回空字串。
    示例:

        $(findstring a,a b c)
        $(findstring a,b c)

        第一個函式返回“a”字串,第二個返回“”字串(空字串)

$(filter <pattern...>;,<text>;)

    名稱:過濾函式——filter。
    功能:以<pattern>;模式過濾<text>;字串中的單詞,保留符合模式<pattern>;的單詞。可以有多個模式。
    返回:返回符合模式<pattern>;的字串。
    示例:

        sources := foo.c bar.c baz.s ugh.h
        foo: $(sources)
                cc $(filter %.c %.s,$(sources)) -o foo

        $(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”。

$(filter-out <pattern...>;,<text>;)

    名稱:反過濾函式——filter-out。
    功能:以<pattern>;模式過濾<text>;字串中的單詞,去除符合模式<pattern>;的單詞。可以有多個模式。
    返回:返回不符合模式<pattern>;的字串。
    示例:

        objects=main1.o foo.o main2.o bar.o
        mains=main1.o main2.o
        
        $(filter-out $(mains),$(objects)) 返回值是“foo.o bar.o”。
        
$(sort <list>;)

    名稱:排序函式——sort。
    功能:給字串<list>;中的單詞排序(升序)。
    返回:返回排序後的字串。
    示例:$(sort foo bar lose)返回“bar foo lose” 。
    備註:sort函式會去掉<list>;中相同的單詞。

$(word <n>;,<text>;)

    名稱:取單詞函式——word。
    功能:取字串<text>;中第<n>;個單詞。(從一開始)
    返回:返回字串<text>;中第<n>;個單詞。如果<n>;比<text>;中的單詞數要大,那麼返回空字串。
    示例:$(word 2, foo bar baz)返回值是“bar”。

$(wordlist <s>;,<e>;,<text>;)  

    名稱:取單詞串函式——wordlist。
    功能:從字串<text>;中取從<s>;開始到<e>;的單詞串。<s>;和<e>;是一個數字。
    返回:返回字串<text>;中從<s>;到<e>;的單詞字串。如果<s>;比<text>;中的單詞數要大,那麼返回空字串。如果<e>;大於<text>;的單詞數,那麼返回從<s>;開始,到<text>;結束的單詞串。
    示例: $(wordlist 2, 3, foo bar baz)返回值是“bar baz”。

$(words <text>;)

    名稱:單詞個數統計函式——words。
    功能:統計<text>;中字串中的單詞個數。
    返回:返回<text>;中的單詞數。
    示例:$(words, foo bar baz)返回值是“3”。
    備註:如果我們要取<text>;中最後的一個單詞,我們可以這樣:$(word $(words <text>;),<text>;)。

$(firstword <text>;)

    名稱:首單詞函式——firstword。
    功能:取字串<text>;中的第一個單詞。
    返回:返回字串<text>;的第一個單詞。
    示例:$(firstword foo bar)返回值是“foo”。
    備註:這個函式可以用word函式來實現:$(word 1,<text>;)。

以上,是所有的字串操作函式,如果搭配混合使用,可以完成比較複雜的功能。這裡,舉一個現實中應用的例子。我們知道,make使用“VPATH”變數來指定“依賴檔案”的搜尋路徑。於是,我們可以利用這個搜尋路徑來指定編譯器對標頭檔案的搜尋路徑引數CFLAGS,如:

    override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

    如果我們的“$(VPATH)”值是“src:../headers”,那麼“$(patsubst %,-I%,$(subst :, ,$(VPATH)))”將返回“-Isrc -I../headers”,這正是cc或gcc搜尋標頭檔案路徑的引數。


三、檔名操作函式

下面我們要介紹的函式主要是處理檔名的。每個函式的引數字串都會被當做一個或是一系列的檔名來對待。

$(dir <names...>;) 

    名稱:取目錄函式——dir。
    功能:從檔名序列<names>;中取出目錄部分。目錄部分是指最後一個反斜槓(“/”)之前的部分。如果沒有反斜槓,那麼返回“./”。
    返回:返回檔名序列<names>;的目錄部分。
    示例: $(dir src/foo.c hacks)返回值是“src/ ./”。

$(notdir <names...>;) 

    名稱:取檔案函式——notdir。
    功能:從檔名序列<names>;中取出非目錄部分。非目錄部分是指最後一個反斜槓(“/”)之後的部分。
    返回:返回檔名序列<names>;的非目錄部分。
    示例: $(notdir src/foo.c hacks)返回值是“foo.c hacks”。
 
$(suffix <names...>;) 
    
    名稱:取字尾函式——suffix。
    功能:從檔名序列<names>;中取出各個檔名的字尾。
    返回:返回檔名序列<names>;的字尾序列,如果檔案沒有後綴,則返回空字串。
    示例:$(suffix src/foo.c src-1.0/bar.c hacks)返回值是“.c .c”。

$(basename <names...>;)

    名稱:取字首函式——basename。
    功能:從檔名序列<names>;中取出各個檔名的字首部分。
    返回:返回檔名序列<names>;的字首序列,如果檔案沒有字首,則返回空字串。
    示例:$(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/bar hacks”。

$(addsuffix <suffix>;,<names...>;) 

    名稱:加字尾函式——addsuffix。
    功能:把字尾<suffix>;加到<names>;中的每個單詞後面。
    返回:返回加過後綴的檔名序列。
    示例:$(addsuffix .c,foo bar)返回值是“foo.c bar.c”。

$(addprefix <prefix>;,<names...>;) 

    名稱:加字首函式——addprefix。
    功能:把字首<prefix>;加到<names>;中的每個單詞後面。
    返回:返回加過字首的檔名序列。
    示例:$(addprefix src/,foo bar)返回值是“src/foo src/bar”。

$(join <list1>;,<list2>;)

    名稱:連線函式——join。
    功能:把<list2>;中的單詞對應地加到<list1>;的單詞後面。如果<list1>;的單詞個數要比<list2>;的多,那麼,<list1>;中的多出來的單詞將保持原樣。如果<list2>;的單詞個數要比<list1>;多,那麼,<list2>;多出來的單詞將被複制到<list2>;中。
    返回:返回連線過後的字串。
    示例:$(join aaa bbb , 111 222 333)返回值是“aaa111 bbb222 333”。

相關推薦

makefile 函式 字串 檔名

在Makefile中可以使用函式來處理變數,從而讓我們的命令或是規則更為的靈活和具有智慧。make所支援的函式也不算很多,不過已經足夠我們的操作了。函式呼叫後,函式的返回值可以當做變數來使用。 一、函式的呼叫語法 函式呼叫,很像變數的使用,也是以“$”來標識的,其語法如下:     $(<functio

makefile 定義模式規則

五、定義模式規則 你可以使用模式規則來定義一個隱含規則。一個模式規則就好像一個一般的規則,只是在規則中,目標的定義需要有"%"字元。"%"的意思是表示一個或多個任意字元。在依賴目標中同樣可以使用"%",只是依賴目標中的"%"的取值,取決於其目標。 有一點需要注意的是,"%"的展開發生在變數和函式的展開之後,變

makefile 函式 foreach if call origin shell 控制make函式

四、foreach 函式   foreach函式和別的函式非常的不一樣。因為這個函式是用來做迴圈用的,Makefile中的foreach函式幾乎是仿照於Unix標準Shell(/bin/sh)中的for語句,或是C-Shell(/bin/csh)中的foreach語句而構建的。它的語法是:       $(f

makefile make 的執行 十三

make 的執行 —————— 一般來說,最簡單的就是直接在命令列下輸入make命令,make命令會找當前目錄的makefile來執行,一切都是自動的。但也有時你也許只想讓make重編譯某些檔案,而不是整個工程,而又有的時候你有幾套編譯規則,你想在不同的時候使用不同的編譯規則,等等。本章節就是講述如何使用ma

makefile 使用make更新函式庫檔案(結束)

使用make更新函式庫檔案 ——————————— 函式庫檔案也就是對Object檔案(程式編譯的中間檔案)的打包檔案。在Unix下,一般是由命令"ar"來完成打包工作。 一、函式庫檔案的成員 一個函式庫檔案由多個檔案組成。你可以以如下格式指定函式庫檔案及其組成:     archive(member) 這個

makefile 隱含規則

隱含規則 ———— 在我們使用Makefile時,有一些我們會經常使用,而且使用頻率非常高的東西,比如,我們編譯C/C++的源程式為中間目標檔案(Unix下是[.o]檔案,Windows下是[.obj]檔案)。本章講述的就是一些在Makefile中的“隱含的”,早先約定了的,不需要我們再寫出來的規則。 “隱含

makefile 條件判斷

使用條件判斷 —————— 使用條件判斷,可以讓make根據執行時的不同情況選擇不同的執行分支。條件表示式可以是比較變數的值,或是比較變數和常量的值。 一、示例 下面的例子,判斷$(CC)變數是否“gcc”,如果是的話,則使用GNU函式編譯目標。     libs_for_gcc = -lgnu     no

)狀態模式(DOTA版)

作者:zuoxiaolong8810(左瀟龍),轉載請註明出處,特別說明:本博文來自博主原部落格,為保證新部落格中博文的完整性,特複製到此留存,如需轉載請註明新部落格地址即可。                本次LZ

Linux程序上下文切換過程context_switch--Linux程序的管理與排程(

1 前景回顧 1.1 Linux的排程器組成 2個排程器 可以用兩種方法來啟用排程 一種是直接的, 比如程序打算睡眠或出於其他原因放棄CPU 另一種是通過週期性的機制, 以固定的頻率執行, 不時的檢測是否有必要 因此當前linux的排程程式由兩個排程器組成:主排程器,週期性排程器(兩者

Android 學習之《第一行程式碼》第二版 筆記(廣播機制(

廣播的最佳實踐——實現強制下線功能 思路:在介面上彈出一個對話方塊,讓使用者無法進行任何操作,必須點選對話方塊中的確定按鈕,然後回到登入介面即可。 一、效果圖 1. 登入介面並輸入賬號密碼 2. 登陸後的介面 3. 強制下線 4. 退回登陸的介面

osgEarth的Rex引擎原理分析()建立瓦片模型過程

目標:(十七)中問題47 osgEarth/TerrainTileModelFactory.cpp TerrainTileModel* TerrainTileModelFactory::createTileModel(const MapFrame& fr

Swift 學習之:?和 !(

新更新的內容請移步閱讀: Swift語言使用var定義變數,但和別的語言不同,Swift裡不會自動給變數賦初始值, 也就是說變數不會有預設值,所以要求使用變數之前必須要對其初始化 。如果在使用變數之前不進行初始化就會報錯: var stringValue : Stri

[] java8 函式式介面 函式介面 lambda表示式 匿名函式 方法引用使用含義 函式式介面例項 如何定義函式式介面

package java.lang; import java.lang.annotation.*; /** * An informative annotation type used to indicate that an interface * type declaration is inten

makefile 多行變數 環境變數 目標變數 模式變數

六、多行變數   還有一種設定變數值的方法是使用define關鍵字。使用define關鍵字設定變數的值可以有換行,這有利於定義一系列的命令(前面我們講過“命令包”的技術就是利用這個關鍵字)。 define指示符後面跟的是變數的名字,而重起一行定義變數的值,定義是以endef關鍵字結束。其工作方式和“=”操作符

劍指offer()包含min函式的棧,字串的排列,陣列中出現超過一半的數字

20:包含min函式的棧 題目描述 定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。 感覺題目很無聊。。。我大js做這題就是方便,也讓我深刻意識到相對其他語言js繼承的強大性和靈活性。。。 var stack = []; function push(node) { stack

Java學習系列()Java面向物件之註解

一、前言 Java中的註解Annotation運用到很多方面,比如之前講的單元測試中的@Test、Spring、SpringMVC還有其他框架等等。Java本身自帶的註解也有一些,比如:@Override(子類要重寫/覆寫父類的對應方法)、@Deprecated(表

【python資料探勘課程】.樸素貝葉斯分類器及中文文字輿情分析

這是《Python資料探勘課程》系列文章,也是我上課內容及書籍中的一個案例。本文主要講述樸素貝葉斯分類演算法並實現中文資料集的輿情分析案例,希望這篇文章對大家有所幫助,提供些思路。內容包括:1.樸素貝葉斯數學原理知識    2.naive_bayes用法及簡單案例    3.

【走馬觀花】SQL SERVER 2012 新增函式-01.字串函式CONCAT

SQLSERVER 2012新增了兩個字串函式CONCAT和FORMAT。首先介紹一下CONCAT,CONCAT函式的作用是可以返回多個字串拼接後的結果。簡單示例:select CONCAT('a','b') as R1 /* R1 ---- ab */ select 'a'

程序間通訊之-IPCS/IPCRM命令--linux核心剖析(

SystemV的IPC通訊 System V IPC共有三種類型: * System V訊息佇列 System V 訊號量 System V 共享記憶體區。 ipcs命令 用於報告Linux中程序間通訊設施的狀態,顯示的資訊包括訊息列

Nginx:Nginx深度學習篇之配置蘋果要求的openssl後臺HTTPS服務

9.png 升級 ssl 版本升級 org tex 技術 就是 加密 配置蘋果要求的證書: 1、服務器所有的連接使用TLS1.2以上的版本(openssl 1.0.2) 2、HTTPS證書必須使用SHA256以上哈希算法簽名 3、HTTPS證書必須使用RSA20