1. 程式人生 > >MakeFile中的變數定義

MakeFile中的變數定義

   一般在我們書寫Makefile時,各部分變數引用的格式我們建議如下:
1. make變數(Makefile中定義的或者是make的環境變數)的引用使用“$(VAR)”格式。

2. 出現在規則命令列中shell變數(一般為執行命令過程中的臨時變數,它不屬於Makefile變數,而是一個shell變數)引用使用shell的“$tmp”格式。
3. 對出現在命令列中的make變數我們同樣使用“$(CMDVAR)” 格式來引用。

       MakeFile中給變數賦值有以下兩種方式

1.遞迴展開式,使用=直接定義,例子如下:

               foo = $(bar)
               bar = $(ugh)
               ugh = Huh?
               all:;echo $(foo)
  執行“make”將會打印出“Huh?”。整個變數的替換過程時這樣的:首先“$(foo)”被替換為“$(bar)”,接下來 “$(bar)”被替換為“$(ugh)”,最後“$(ugh)”被替換為“Hug?”。整個替換的過程是在執行“echo $(foo)”是進行的。

  這種方式的缺點是

           缺點1:使用此風格的變數定義,可能會由於出現變數遞迴定義而導致make陷入到無限的變數展開過程中,最終使make執行失敗.
           缺點2:這種風格的變數定義中如果使用了函式,那麼包含在變數值中的函式總會在變數被引用的地方執行(變數被展開時)。

2.直接展開式

這種風格的變數使用“:=”來定義變數。在使用“:=”定義變數時,變數值中對另外變數的引用或者函式的引用在定義時被展開(對變數進行替換)。


x := foo
y := $(x) bar
x := later
就等價於:
y := foo bar
x := later
需要CFLAGS := $(include_dirs) -O
include_dirs := -Ifoo -Ibar
由於在變數“include_dirs”的定義出現在“CFLAGS”定義之後。因此在“CFLAGS”的定義中,“include_dirs”的值為空。“CFLAGS”的值為“-O”而不是“-Ifoo -Ibar -O”。注意的是:此風格變數在定義時就完成了對所引用的變數的展開,因此它不能實現對其後定義變數的引用。

變數的替換引用,格式為“$(VAR:A=B)”(或者“${VAR:A=B}”),
 意思是,替換變數“VAR”中所有“A”字元結尾的字為“B”結尾的字。
 “結尾”的含義是空格之前(變數值多個字之間使用空格分開)。
 而對於變數其它部分的“A”字元不進行替換。

     自動化變數

[email protected]
代表規則中的目標檔名。如果目標是一個文件(Linux中,一般稱.a檔案為文件),那麼它代表這個文件的檔名。在多目標的模式規則中,它代表的是哪個觸發規則被執行的目標檔名。
$%
規則的目標檔案是一個靜態庫檔案時,代表靜態庫的一個成員名。例如,規則的目標是“foo.a(bar.o)”,那麼,“$%”的值就為“bar.o”,“

[email protected]”的值為“foo.a”。如果目標不是函式庫檔案,其值為空。
$<
規則的第一個依賴檔名。如果是隱含規則,則它代表通過目標指定的第一個依賴檔案。
$?
所有比目標檔案更新的依賴檔案列表,空格分割。如果目標是靜態庫檔名,代表的是庫成

員(.o檔案)的更新情況。
$^
規則的所有依賴檔案列表,使用空格分隔。如果目標是靜態庫檔名,它所代表的只能是所有庫成員(.o檔案)名。一個檔案可重複的出現在目標的依賴中,變數“$^”只記錄它的一次引用情況。就是說變數“$^”會去掉重複的依賴檔案。
$+
類似“$^”,但是它保留了依賴檔案中重複出現的檔案。主要用在程式連結時,庫的交叉引用場合。

$(@D)
代表目標檔案的目錄部分(去掉目錄部分的最後一個斜槓)。如果“[email protected]”是“dir/foo.o”,那麼“$(@D)”的值為“dir”。如果“[email protected]”不存在斜槓,其值就是“.”(當前目錄)。注意它和函式“dir”的區別!
$(@F)
目標檔案的完整檔名中除目錄以外的部分(實際檔名)。如果“[email protected]”為“dir/foo.o”,那麼“$(@F)”只就是“foo.o”。“$(@F)”等價於函式“$(notdir [email protected])”。
$(%D)
$(%F)

當以如“archive(member)”形式靜態庫為目標時,分別表示庫檔案成員“member”名中的目錄部分和檔名部分。它僅對這種形式的規則目標有效。
$(<D)
$(<F)

分別表示規則中第一個依賴檔案的目錄部分和檔名部分。
$(^D)
$(^F)

分別表示所有依賴檔案的目錄部分和檔案部分(不存在同一檔案)。
$(+D)
$(+F)

分別表示所有依賴檔案的目錄部分和檔案部分(可存在重複檔案)。
$(?D)
$(?F)

分別表示被更新的依賴檔案的目錄部分和檔案部分。

相關推薦

makefile變數定義的空格

comma:= , empty:= # space變數用兩個空變數作為識別符號,當中是一個空格 space:= $(empty) $(empty) foo:= a b c bar:= $(subst $(space),$(comma),$(foo)) haha :@echo

uboot的主Makefile變數MKCONFIG建立符號連結相關問題

在uboot的主Makefile中,定義了一個變數:MKCONFIG    := $(SRCTREE)/mkconfig。 該MKCONFIG 變數即為源程式目錄下的mkconfig指令碼檔案,該檔案在uboot的前期配置操作時會用到。 x210_sd_conf

uboot的主Makefile變數MKCONFIG功能介紹

在uboot的主Makefile中,定義了一個變數:MKCONFIG    := $(SRCTREE)/mkconfig。 該MKCONFIG 變數即為源程式目錄下的mkconfig指令碼檔案,該檔案在uboot的前期配置操作時會用到。 x210_sd_config : 

Makefile變數讀取與生效時間

現在我在A Makefile中include B Makefile,在B Makefile中有變數OBJS和VPATH的賦值 來看看B Makefile (libmad/Makefile) VPATH += $(ROOT_DIR)/libmad OBJS +

Makefile定義巨集進行條件編譯

c c++源程式生成可執行檔案的過程一般經過編譯和連結的過程。編譯就是把源程式編譯生成中間檔案,也就是.obj(Win)。這個過程中檢查語法是否正確,函式和變數是否正確宣告(對於後者,要制定路徑正確的標頭檔案)。所以如果函式只在標頭檔案中正確宣告而不在原始檔中實現的話是可以

Makefile變數$var與$$var的區別詳談

很多人對$var與$$var東西不理解,總是區分不開Makefile中的變數與shell中的變數,我來解釋一下吧。希望對你有用。 首先make精神就是實現自動化編譯,是按照Makefile的規則來進行的,啥子規則呢,目標與依賴檔案的規則。 凡是目標後面有依賴,並根據依賴產生

對於程式變數定義的注意事項

最近在學習32位微控制器的時候,編譯時遇到如下問題: drivers\src\mains.c(10): error:  #77-D: this declaration has no storage class or type specifier drivers\src\ma

Makefile的偽目標和變數定義格式

本節我們討論一個Makefile中的一個重要的特殊目標:偽目標。 偽目標是這樣一個目標:它不代表一個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們也可以將一個偽目標稱為標籤。使用偽目標有兩點原因:1. 避免在我們的Makefile中定義的

MakeFile變數定義

   一般在我們書寫Makefile時,各部分變數引用的格式我們建議如下:1. make變數(Makefile中定義的或者是make的環境變數)的引用使用“$(VAR)”格式。 2. 出現在規則命令列中shell變數(一般為執行命令過程中的臨時變數,它不屬於Makefile變

有關C++類資料成員變數定義的一些想法

最近開始學習C++,以前是學C的,對C++新生的類不是很懂,最近在看一些教程,發現有的教程只是簡單的告訴你什麼是類,還有怎麼使用類,但對於類的標準啥的並沒有進行標準化的介紹。 關於C++類中成員變數的定義,一般都是推薦這樣定義: 1.類中的屬性(不是函式)最好定義標準化,並且取名字能讓其

在 Vue.js專案如何定義全域性變數&全域性函式

在專案中,經常有些函式和變數是需要複用,比如說網站伺服器地址,從後臺拿到的:使用者的登入 token, 使用者的地址資訊等,這時候就需要設定一波全域性變數和全域性函式。 目錄           定義全域性變數 定義全

【三】makefile變數

一、變數賦值 直接展開式 := 特點:在定義時立即展開應用的變數 示例: value1 := 5 value2 := $(value1) #value2會立即被賦值成5 value1 :=6 var-test: @echo "value2", $(value2)

vue如何定義全域性變數 和全域性函式

定義全域性變數 原理: 設定一個專用的的全域性變數模組檔案,模組裡面定義一些變數初始狀態,用export default 暴露出去,在main.js裡面使用Vue.prototype掛載到vue例項上面或者在其它地方需要使用時,引入該模組便可。 全域性變數模組檔案: Global.v

MFC如何定義全域性變數

轉載;來自http://blog.csdn.net/bill_ming/article/details/7407848 MFC中如何定義全域性變數 3種方法:1、在一個cpp檔案中用extern宣告,然後在其他檔案中定義就可以用 2、在**APP類中做公有變數,其他類中用AfxGe

在Vuejs 專案如何定義全域性變數 全域性函式

目錄 正文 在 Vuejs 專案中如何定義全域性變數 全域性函式 在專案中,經常有些函式和變數是需要複用,比如說網站伺服器地址,從後臺拿到的:使用者的登入 token, 使用者的地址資訊等,這時候就需要設定一波全域性變數和全域性函式. 回到頂部 定義全域性變

MySQL變數定義變數的賦值使用(轉)

說明:現在市面上定義變數的教程和書籍基本都放在儲存過程上說明,但是儲存過程上變數只能作用於begin...end塊中,而普通的變數定義和使用都說的比較少,針對此類問題只能在官方文件中才能找到講解。 前言 MySQL儲存過程中,定義變數有兩種方式:  1、使用set或select直接賦值,變數名以@開頭 例如:

vue專案定義並使用 全域性變數,全域性函式

一、定義變數,並全域性使用 原理: 1. 單獨新建一個全域性變數模組檔案,模組中定義一些變數初始狀態,用export default 暴露出去。 2. 在main.js中引入,並通過Vue.prototype掛載到vue例項上面

例項學習ansible系列(16)playbook定義環境變數的使用

在前面的文章中我們使用過環境變數, 但是使用者自定義或者隨時export出來的環境變數卻無法直接引用,而這種方式卻是實際工作中用到的最多的情況,使用ansible提供的lookup便可解決這個問題. 定義一個環境變數並export:# export MESSAGE="hello wor

CityEngine規則變數定義和顯示

  規則檔案可以自定義變數值,而且還可以定義變數的分組、排序、值域等顯示方式。以下就列舉幾個常用的關鍵字: 1.   1.@Group("level_1-group", ..., "level_n-group") 控制變數的分組,可以將變數在屬性視窗中分組顯示,並且可

linux定義變數

一 定義 1)所有使用者的配置(最好別改) # vi /etc/profile export JAVA_HOME=/Data/apps/jdk 2)定義本使用者 # vi ~/.bashrc expo