1. 程式人生 > >MAKEFILE詳解 多目標 靜態模式 十三

MAKEFILE詳解 多目標 靜態模式 十三

六、多目標 

Makefile的規則中的目標可以不止一個,其支援多目標,有可能我們的多個目標同時依賴於一個檔案,並且其生成的命令大體類似。於是我們就能把其合併起來。當然,多個目標的生成規則的執行命令是同一個,這可能會可我們帶來麻煩,不過好在我們的可以使用一個自動化變數“[email protected]”(關於自動化變數,將在後面講述),這個變量表示著目前規則中所有的目標的集合,這樣說可能很抽象,還是看一個例子吧。 

    bigoutput littleoutput : text.g 
            generate text.g -$(subst output,,[email protected]
) >; [email protected] 

    上述規則等價於: 

    bigoutput : text.g 
            generate text.g -big >; bigoutput 
    littleoutput : text.g 
            generate text.g -little >; littleoutput 

    其中,-$(subst output,,[email protected])中的“$”表示執行一個Makefile的函式,函式名為subst,後面的為引數。關於函式,將在後面講述。這裡的這個函式是擷取字串的意思,“
[email protected]
”表示目標的集合,就像一個數組,“[email protected]”依次取出目標,並執於命令。 
   (注:make中函式subst, $(subst FROM, TO, TEXT),即將字串TEXT中的子串FROM變為TO。)

七、靜態模式 

靜態模式可以更加容易地定義多目標的規則,可以讓我們的規則變得更加的有彈性和靈活。我們還是先來看一下語法: 

    <targets ...>;: <target-pattern>;: <prereq-patterns ...>; 
            <commands>; 
            ... 


    targets定義了一系列的目標檔案,可以有萬用字元。是目標的一個集合。 

    target-parrtern是指明瞭targets的模式,也就是的目標集模式。 

    prereq-parrterns是目標的依賴模式,它對target-parrtern形成的模式再進行一次依賴目標的定義。 

這樣描述這三個東西,可能還是沒有說清楚,還是舉個例子來說明一下吧。如果我們的<target-parrtern>;定義成“%.o”,意思是我們的<target>;集合中都是以“.o”結尾的,而如果我們的<prereq-parrterns>;定義成“%.c”,意思是對<target-parrtern>;所形成的目標集進行二次定義,其計算方法是,取<target-parrtern>;模式中的“%”(也就是去掉了[.o]這個結尾),併為其加上[.c]這個結尾,形成的新集合。 

所以,我們的“目標模式”或是“依賴模式”中都應該有“%”這個字元,如果你的檔名中有“%”那麼你可以使用反斜槓“\”進行轉義,來標明真實的“%”字元。 

看一個例子: 

    objects = foo.o bar.o 

    all: $(objects) 

    $(objects): %.o: %.c 
            $(CC) -c $(CFLAGS) $< -o 
[email protected]
 


上面的例子中,指明瞭我們的目標從$object中獲取,“%.o”表明要所有以“.o”結尾的目標,也就是“foo.o bar.o”,也就是變數$object集合的模式,而依賴模式“%.c”則取模式“%.o”的“%”,也就是“foo bar”,併為其加下“.c”的字尾,於是,我們的依賴目標就是“foo.c bar.c”。而命令中的“$<”和“[email protected]”則是自動化變數,“$<”表示所有的依賴目標集(也就是“foo.c bar.c”),“[email protected]”表示目標集(也就是“foo.o bar.o”)。於是,上面的規則展開後等價於下面的規則: 

    foo.o : foo.c 
            $(CC) -c $(CFLAGS) foo.c -o foo.o 
    bar.o : bar.c 
            $(CC) -c $(CFLAGS) bar.c -o bar.o 

試想,如果我們的“%.o”有幾百個,那種我們只要用這種很簡單的“靜態模式規則”就可以寫完一堆規則,實在是太有效率了。“靜態模式規則”的用法很靈活,如果用得好,那會一個很強大的功能。再看一個例子: 


    files = foo.elc bar.o lose.o 

    $(filter %.o,$(files)): %.o: %.c 
            $(CC) -c $(CFLAGS) $< -o [email protected] 
    $(filter %.elc,$(files)): %.elc: %.el 
            emacs -f batch-byte-compile $< 


$(filter %.o,$(files))表示呼叫Makefile的filter函式,過濾“$filter”集,只要其中模式為“%.o”的內容。其的它內容,我就不用多說了吧。這個例字展示了Makefile中更大的彈性。 

相關推薦

MAKEFILE 目標 靜態模式 十三

六、多目標 Makefile的規則中的目標可以不止一個,其支援多目標,有可能我們的多個目標同時依賴於一個檔案,並且其生成的命令大體類似。於是我們就能把其合併起來。當然,多個目標的生成規則的執行命令是同一個,這可能會可我們帶來麻煩,不過好在我們的可以使用一個自動化變數“[email protected

makefile 行變數 環境變數 目標變數 模式變數 十九

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

makefile make 的執行 二十三

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

Linux下資料夾編寫Makefile

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

makefile 定義模式規則 二十五

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

makefile

makefile原文鏈接:https://blog.csdn.net/qq_38646470/article/details/79917494專欄鏈接:https://blog.csdn.net/column/details/20028.html    或許很多Wino

LVS 負載均衡群集、地址轉換模式(LVS-NAT)案例

8.4 功能 block x86_64 ati local linu 它的 har 前言 · Linux Virtual Server (LVS)是針對 Linux 內核開發的一個負載均衡項目,是由我國章文嵩博士在 98 年 5月創建。· LVS 實際上相當於基於 IP

HikariCP配置+資料來源

                        SpringBo

Spark中的Spark Shuffle(看幾遍)

Shuffle簡介 Shuffle描述著資料從map task輸出到reduce task輸入的這段過程。shuffle是連線Map和Reduce之間的橋樑,Map的輸出要用到Reduce中必須經過shuffle這個環節,shuffle的效能高低直接影響了整個程式的效能和吞吐量。因為在分散式情況

Java中的volatile關鍵字及單例模式雙檢鎖問題分析

【參考文獻】http://www.cnblogs.com/dolphin0520/p/3920373.html 看了好多關於volatile關鍵字的文章,這篇應該是講得最清楚的了吧,從Java記憶體模型出發,結合併發程式設計中的原子性、可見性、有序性三個角度分析了volatile所起的作用,並從

ArrayBlockingQueue - 執行緒安全性進階

1.介紹 ArrayBlockingQueue是一個阻塞式的佇列,繼承自AbstractBlockingQueue,間接的實現了Queue介面和Collection介面。底層以陣列的形式儲存資料(實際上可看作一個迴圈陣列)。常用的操作包括 add ,offer,put,remove,poll,t

新手做無貨源店鋪淘客不會做,店淘操作模式和新手常陷入的誤區

隨著現代社會的發展,網際網路電商已成為越來越多關注的話題。淘寶一點一點的走進大家的視線,讓大家對她產生了一種依賴,越來越多的人開始進行網購。在網上買東西很方便,不僅可以節約時間,還可以節省體力。也是這個原因,現在好多的兼職創業朋友選擇了加入淘寶大家庭。 很多人看

java動態代理模式

引言:java框架中很多設計都是基於動態代理模式的,所謂動態代理模式,就是動態的產生目標物件的代理類,並規定一個方法,可以執行目標物件的方法,也可以在目標物件方法的基礎上新增其他必要的方法。這裡,詳細介紹一下java中實現動態代理模式的兩種方式 在java中,

KConfig、Makefile以及ARM平臺Linux核心的編譯

下面講解一個綜合例項,假設我們要在核心原始碼drivers目錄下為ARM體系結 構新增如下用於test driver 的樹型目錄: |--test |-- cpu | -- cpu.c |-- test.c |-- test_client.c |-- test_ioctl.c |-- test_proc.c

維陣列與指標之間的關係

先介紹一下簡單的一維陣列:列如:int a[3] = {0,1,2};[3]和型別int則明確表示編譯器應該為這個棧分配多大的記憶體,也就是三個int大小!在記憶體中示意圖是:在CPU看來記憶體是一組連續的地址空間,所以當我們對一維陣列進行操作時只需要知道陣列首地址,就可以通

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

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

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

makefile 函式 字串 檔名 二十一

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