1. 程式人生 > >linux下的Makefile詳解(5)

linux下的Makefile詳解(5)

使用條件判斷
——————

使用條件判斷,可以讓make根據執行時的不同情況選擇不同的執行分支。條件表示式可以是比較變數的值,或是比較變數和常量的值。

一、示例

下面的例子,判斷$(CC)變數是否“gcc”,如果是的話,則使用GNU函式編譯目標。

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif

可見,在上面示例的這個規則中,目標“foo”可以根據變數“$(CC)”值來選取不同的函式庫來編譯程式。

我們可以從上面的示例中看到三個關鍵字:ifeq、else和endif。ifeq的意思表示條件語句的開始,並指定一個條件表示式,表示式包含兩個引數,以逗號分隔,表示式以圓括號括起。else表示條件表示式為假的情況。endif表示一個條件語句的結束,任何一個條件表示式都應該以endif結束。

當我們的變數$(CC)值是“gcc”時,目標foo的規則是:

foo: $(objects)
$(CC) -o foo $(objects) $(libs_for_gcc)

而當我們的變數$(CC)值不是“gcc”時(比如“cc”),目標foo的規則是:

foo: $(objects)
$(CC) -o foo $(objects) $(normal_libs)

當然,我們還可以把上面的那個例子寫得更簡潔一些:

libs_for_gcc = -lgnu
normal_libs =

ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif

foo: $(objects)
$(CC) -o foo $(objects) $(libs)


二、語法

條件表示式的語法為:

<conditional-directive>
<text-if-true>
endif

以及:

<conditional-directive>
<text-if-true>
else
<text-if-false>
endif

其中<conditional-directive>表示條件關鍵字,如“ifeq”。這個關鍵字有四個。

第一個是我們前面所見過的“ifeq”

ifeq (<arg1>, <arg2> )
ifeq '<arg1>' '<arg2>'
ifeq "<arg1>" "<arg2>"
ifeq "<arg1>" '<arg2>'
ifeq '<arg1>' "<arg2>"

比較引數“arg1”和“arg2”的值是否相同。當然,引數中我們還可以使用make的函式。如:

ifeq ($(strip $(foo)),)
<text-if-empty>
endif

這個示例中使用了“strip”函式,如果這個函式的返回值是空(Empty),那麼<text-if-empty>就生效。

第二個條件關鍵字是“ifneq”。語法是:

ifneq (<arg1>, <arg2> )
ifneq '<arg1>' '<arg2>'
ifneq "<arg1>" "<arg2>"
ifneq "<arg1>" '<arg2>'
ifneq '<arg1>' "<arg2>"

其比較引數“arg1”和“arg2”的值是否相同,如果不同,則為真。和“ifeq”類似。

第三個條件關鍵字是“ifdef”。語法是:

ifdef <variable-name>

如果變數<variable-name>的值非空,那到表示式為真。否則,表示式為假。當然,<variable-name>同樣可以是一個函式的返回值。注意,ifdef只是測試一個變數是否有值,其並不會把變數擴充套件到當前位置。還是來看兩個例子:

示例一:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif

示例二:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif

第一個例子中,“$(frobozz)”值是“yes”,第二個則是“no”。

第四個條件關鍵字是“ifndef”。其語法是:

ifndef <variable-name>

這個我就不多說了,和“ifdef”是相反的意思。

在<conditional-directive>這一行上,多餘的空格是被允許的,但是不能以[Tab]鍵做為開始(不然就被認為是命令)。而註釋符“#”同樣也是安全的。“else”和“endif”也一樣,只要不是以[Tab]鍵開始就行了。

特別注意的是,make是在讀取Makefile時就計算條件表示式的值,並根據條件表示式的值來選擇語句,所以,你最好不要把自動化變數(如“
[email protected]
”等)放入條件表示式中,因為自動化變數是在執行時才有的。

而且,為了避免混亂,make不允許把整個條件語句分成兩部分放在不同的檔案中。

相關推薦

linuxMakefile5

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

linuxMakefile4

使用變數 ———— 在Makefile中的定義的變數,就像是C/C++語言中的巨集一樣,他代表了一個文字字串,在Makefile中執行的時候其會自動原模原樣地展開在所使用的地方。其與C/C++所不同的是,你可以在Makefile中改變其值。在Makefile中,變數可以使用在“目標”,“依賴目標”,“命令”或

linuxMakefile9完!

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

linuxMakefile2

書寫規則 ———— 規則包含兩個部分,一個是依賴關係,一個是生成目標的方法。 在Makefile中,規則的順序是很重要的,因為,Makefile中只應該有一個最終目標,其它的目標都是被這個目標所連帶出來的,所以一定要讓make知道你的最終目標是什麼。一般來說,定義在Makefile中的目標可能會有很多,但是第

linuxMakefile1

七、清空目標檔案的規則 每個Makefile中都應該寫一個清空目標檔案(.o和執行檔案)的規則,這不僅便於重編譯,也很利於保持檔案的清潔。這是一個“修養”(呵呵,還記得我的《程式設計修養》嗎)。一般的風格都是: clean: rm edit $(objects) 更為穩健的做法是: .PHONY : clea

AngularJs自定義指令5 - link

演示 hang cursor off drag font 雙向 事件 date 在指令中操作DOM,我們需要link參數,這參數要求聲明一個函數,稱之為鏈接函數。 寫法: link: function(scope, element, attrs) {  // 在這裏操作DO

Linux防火墻

iptales filter 1.從協議角度,看數據包流程: ######################### # #資源子網:一層 # 用戶空間 # #####

Linux防火墻

iptables netfilter linux防火墻詳解 nat dnat 一、iptables命令基本語法 二、iptables語法進階 三、iptables顯示擴展 四、iptables簡單案例 五、iptables之forward 六、iptables之NAT一、iptables命

指標5-- 布林線指標BOLL

tar 線下 pan evel 隨著 向上 log link bsp 一、定義:布林線指標,即BOLL指標,其英文全稱是“Bollinger Bands”,布林線(BOLL)由約翰·布林先生創造,其利用統計原理,求出股價的標準差及其信賴區間,從而確定股價的波動範圍及未來走勢

04-Linux中DNS

訪問 舉例 dynamic linux下 目錄 col ofo 圖片 nslookup 零、關於配置Linux下的DNS中一些名詞的解釋請參見文章“03-關於配置Linux下的DNS中一些名詞的解釋(轉自網絡)”自行學習一、關於DNS配置文件查看DNS配置文件: rpm -

05-Linux中DNS

相關 proc gen lin 四種方法 .... rate 我的網站 四種 接“04-Linux中DNS詳解(一)” 六、在Linux上測試域名解析1、先檢查DNS是否設置正確 cat /etc/resolv.conf [resolv.conf] # Generate

07-Linux中DNS

用戶 mail all 驗證 src 更改 條目 http nslookup 接“06-Linux中DNS詳解(三)” 九、配置主從DNS服務器實現域名解析容錯 1、實驗環境zhangyujia.com(192.168.80.100)為主區域,com(192.168.8

git 使用5—— get log 查看提交歷史

校驗和 看到了 有一個 基本 detached pack 有意思 lin mls git log 查看 提交歷史 在提交了若幹更新之後,又或者克隆了某個項目,想回顧下提交歷史,可以使用 git log 命令查看。 接下來的例子會用我專門用於演示的 simplegit 項目,

linux free命令

一. 作用     free命令可以顯示當前系統未使用的和已使用的記憶體數目,還可以顯示被核心使用的記憶體緩衝區。 二. 語法  free [選項] 三. 選項       預設情況下,即在沒有選項的情況下,"free"命令顯示記憶體的使用資訊。預設

EasyPR--開發5顏色定位與偏斜扭轉

  本篇文章介紹EasyPR裡新的定位功能:顏色定位與偏斜扭正。希望這篇文件可以幫助開發者與使用者更好的理解EasyPR的設計思想。   讓我們先看一下示例圖片,這幅圖片中的車牌通過顏色的定位法進行定位並從偏斜的視角中扭正為正視角(請看右圖的左上角)。 圖1 新版本的定位效果     下

深度學習優化函式5-- Nesterov accelerated gradient (NAG)

深度學習優化函式詳解系列目錄 上一篇文章講解了猶如小球自動滾動下山的動量法(momentum)這篇文章將介紹一種更加“聰明”的滾動下山的方式。動量法每下降一步都是由前面下降方向的一個累積和當前點的梯度方向組合而成。於是一位大神(Nesterov)就開始思考,

XILINX_zynq_5

下面做一個從uart列印hello world的實驗,只用PS,不用PL部分,程式從SD卡啟動,跑在PS的內部RAM. zynq 7000的PS雖然也是CPU,但是開發方法不像普通的CPU只需要一個SDK就可以了,它還需要vivado硬體設計軟體. 所以ZYNQ 7000的PS開發需要兩個工具,一個是vi

第四章 Controller介面控制器5

4.16、資料型別轉換和資料驗證 流程: 1、首先建立資料繫結器,在此此會建立ServletRequestDataBinder類的物件,並設定messageCodesResolver(錯誤碼解析器); 2、提供第一個擴充套件點,初始化資料繫結器,在此處我們可以覆蓋該方法註

Linux常用命令--技術流ken

  本節內容   基礎命令:lsmanpwdcdmkdirechotouchcpmvrmrmdircatmorelessheadtailclearpoweroffreboot進階命令(下一章節):aliasunaliasunamesuhostnamehistorywhichwcwwh

linux awk命令 awk語法 awk運算 awk陣列

如何把一行豎排的資料轉換成橫排? awk '{printf("%s,",$1)}' filename awk中使用NR和FNR的一些例子 http://blog.sina.com.cn/s/blog_5a3640220100b7c8.html http://www.linuxidc.com/Linux