makefile詳解 條件判斷 二十
——————
使用條件判斷,可以讓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時就計算條件表示式的值,並根據條件表示式的值來選擇語句,所以,你最好不要把自動化變數(如“
而且,為了避免混亂,make不允許把整個條件語句分成兩部分放在不同的檔案中。
相關推薦
makefile詳解 條件判斷 二十
使用條件判斷 —————— 使用條件判斷,可以讓make根據執行時的不同情況選擇不同的執行分支。條件表示式可以是比較變數的值,或是比較變數和常量的值。 一、示例 下面的例子,判斷$(CC)變數是否“gcc”,如果是的話,則使用GNU函式編譯目標。 libs_for_gcc = -lgnu no
makefile詳解 隱含規則 二十四
隱含規則 ———— 在我們使用Makefile時,有一些我們會經常使用,而且使用頻率非常高的東西,比如,我們編譯C/C++的源程式為中間目標檔案(Unix下是[.o]檔案,Windows下是[.obj]檔案)。本章講述的就是一些在Makefile中的“隱含的”,早先約定了的,不需要我們再寫出來的規則。 “隱含
makefile詳解 使用make更新函式庫檔案(結束) 二十六
使用make更新函式庫檔案 ——————————— 函式庫檔案也就是對Object檔案(程式編譯的中間檔案)的打包檔案。在Unix下,一般是由命令"ar"來完成打包工作。 一、函式庫檔案的成員 一個函式庫檔案由多個檔案組成。你可以以如下格式指定函式庫檔案及其組成: archive(member) 這個
makefile詳解 函式 foreach if call origin shell 控制make函式 二十二
四、foreach 函式 foreach函式和別的函式非常的不一樣。因為這個函式是用來做迴圈用的,Makefile中的foreach函式幾乎是仿照於Unix標準Shell(/bin/sh)中的for語句,或是C-Shell(/bin/csh)中的foreach語句而構建的。它的語法是: $(f
makefile詳解 定義模式規則 二十五
五、定義模式規則 你可以使用模式規則來定義一個隱含規則。一個模式規則就好像一個一般的規則,只是在規則中,目標的定義需要有"%"字元。"%"的意思是表示一個或多個任意字元。在依賴目標中同樣可以使用"%",只是依賴目標中的"%"的取值,取決於其目標。 有一點需要注意的是,"%"的展開發生在變數和函式的展開之後,變
makefile詳解 函式 字串 檔名 二十一
在Makefile中可以使用函式來處理變數,從而讓我們的命令或是規則更為的靈活和具有智慧。make所支援的函式也不算很多,不過已經足夠我們的操作了。函式呼叫後,函式的返回值可以當做變數來使用。 一、函式的呼叫語法 函式呼叫,很像變數的使用,也是以“$”來標識的,其語法如下: $(<functio
makefile詳解 make 的執行 二十三
make 的執行 —————— 一般來說,最簡單的就是直接在命令列下輸入make命令,make命令會找當前目錄的makefile來執行,一切都是自動的。但也有時你也許只想讓make重編譯某些檔案,而不是整個工程,而又有的時候你有幾套編譯規則,你想在不同的時候使用不同的編譯規則,等等。本章節就是講述如何使用ma
makefile詳解 多行變數 環境變數 目標變數 模式變數 十九
六、多行變數 還有一種設定變數值的方法是使用define關鍵字。使用define關鍵字設定變數的值可以有換行,這有利於定義一系列的命令(前面我們講過“命令包”的技術就是利用這個關鍵字)。 define指示符後面跟的是變數的名字,而重起一行定義變數的值,定義是以endef關鍵字結束。其工作方式和“=”操作符
PyQt5基本控制元件詳解之QDialog(十二)
QDialog 前言 為了更好的實現人機互動,比如window和linux等系統均會提供一系列的標準對話方塊來完成特定場景下的功能,比如選擇字號大小。字型顏色等,在PyQt5中定義了一系列的標準對話方塊類,讓使用者能夠方便快捷地通過各個類完成字號大
Puppet 條件判斷語句(十六)
puppet 條件判斷語句目前puppet2.7以上版本都支持if...elif ...else...、selecter和case語句.它們的條件判斷分為兩類:一類為條件執行(if...elif ...else...、selecter)通過邏輯判斷來選擇要執行的特定代碼或加載代碼;另一類(case)是循環執行
微信和支付寶支付模式詳解及實現二
配置 其余 logs https 朋友 一個 target 多租戶 對比 繼上篇《微信和支付寶支付模式詳解及實現》到現在已經有半年時間了,這期間不少朋友在公號留言支付相關的問題,最近正好也在處理公司支付相關的對接,打算寫這篇來做一個更進一步的介紹,同時根據主要的幾個支付
tomcat中server.xml配置詳解(轉載)(二)
lin power servlet容器 secure redirect tar 屬性 限制 man 轉載自:https://www.cnblogs.com/starhu/p/5599773.html 一:<Connector>元素 由Connector接口定義.
JDBC詳解系列(二)之加載驅動
red mar mys ons try path 替換 host man ---[來自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- ??在JDBC詳解系列(一)之流程中
TCP/IP詳解 卷1 第二十章 TCP的成塊數據流
互聯 媒體 即將 它的 提交數據 技術分享 超時重傳 red 更多 先補充一個知識: 1.停止等待協議:是tcp保證傳輸可靠的重要途徑,“停止等待”就是指發送完一個分組就停止發送,等待對方確認之後,才能繼續發送下一個分組 停止等待協議的優點是簡單,缺點就是信道的利用率太低,
Zookeeper詳解-基礎(二)
ima con 下一個序列 新的 簡單的 pos 列表 之前 集中 在深入了解ZooKeeper的運作之前,讓我們來看看ZooKeeper的基本概念。我們將在本章中討論以下主題: Architecture(架構) Hierarchical namespace(層次命名空間
makefile詳解
makefile原文鏈接:https://blog.csdn.net/qq_38646470/article/details/79917494專欄鏈接:https://blog.csdn.net/column/details/20028.html 或許很多Wino
JAVA常用集合框架用法詳解基礎篇二之Colletion子介面List
接著上一篇,接著講講集合的知識。上一篇講了Collection介面。它可以說是集合的祖先了,我們這一篇就說說它的子孫們。 一、Collection的子介面 List:有序(存入和取出的順序一致),元素都有索引(即角標),元素可以重複。 Set:元素不能重複,無序的。 首先講講L
sip協議詳解 系列(二)
Sip的核心請求訊息 INVITE、ACK、OPTIONS、BYE、CANCEL 和 REGISTER INVITE • INVITE可以在郵件正文中包含主叫方的媒體資訊。 • 如果INVITE已經接收到成功響應(2xx)或已經發送ACK,則會話被認為是建立的。 • 成功的INVIT
Linux下多資料夾編寫Makefile詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
跟我一起寫 Makefile - 6. 使用條件判斷
跟我一起寫 Makefile - 6. 使用條件判斷 http://wiki.ubuntu.org.cn 6. 使用條件判斷 使用條件判斷,可以讓 make 根據執行時的不同情況選擇不同的執行分支。條件表示式可以是比較變數的值,或是比較變數和常量的值。 6.1 示例 下面