1. 程式人生 > >makefile中的條件判斷ifeq、ifneq、ifdef

makefile中的條件判斷ifeq、ifneq、ifdef

使用條件判斷,可以讓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不允許把整個條件語句分成兩部分放在不同的檔案中。

相關推薦

makefile條件判斷ifeqifneqifdef

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

make條件判斷ifeq,ifneq,ifdef,ifndef

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

Shell條件判斷語法與判斷條件

expression 表達式 字符串 linux 影響 一,簡介Shell各種判斷結構和運算符的用法是shell編程的基礎,了解shell的判斷、運算符和一些退出狀態對後面的學習有很重要的影響。shell有一個內部命令test經常用於對判斷語句進行測試一種或幾種狀態的條件是否成立二. 判斷

跟我一起寫Makefile:使用條件判斷

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

makefile如何判斷一個檔案是否存在

                轉載:http://blog.csdn.net/qiaoliang328/article/details/7568141makefile判斷檔案存在如下的兩種方法:1. 呼叫shell的函式進行判斷exist = $(shell if [ -f $(FILE) ]; then

makefile(五):makefile條件判斷與迴圈

如果說任何程式都可以由順序,分支,迴圈來組成的話,前面介紹的相當於順序部分,本部分介紹分支和迴圈 makefile的條件判斷和迴圈非常簡單。 一.條件判斷 條件判斷的語法如下: ifeq (條件表示式) 執行體 endif ifeq (條

從頭開始寫專案Makefile(六):引數傳遞條件判斷include

在多個Makefile巢狀呼叫時,有時我們需要傳遞一些引數給下一層Makefile。比如我們在頂層Makefile裡面定義的開啟除錯資訊變數DEBUG_SYMBOLS,我們希望在進入子目錄執行子Makefile時該變數仍然有效,這是需要將該變數傳遞給子Makefile,那怎麼傳遞呢?這裡有兩種方法:

Python條件判斷迴圈以及迴圈的終止

條件判斷 條件語句是用來判斷給定條件是否滿足,並根據判斷所得結果從而決定所要執行的操作,通常的邏輯思路如下圖; 單次判斷 形式 if <判斷條件>: <執行> els

C/C++的結束輸入條件判斷 (scanfEOFgetchar()cin.get()getline)

本教程主要適用於一些程式比賽或大公司機試中的輸入資料的處理,總的來說,可以分為以下三種情況: 情況一:輸入的測試樣例有多組,每組需要相同邏輯的處理; 處理方案:在C語言中可利用scanf("%d",&n)!=EOF,在C++中可以使用while(cin>&g

15自學——Linux的學習進度與任務【bash編程之條件判斷

腳本執行 命令替換 返回 引用 任務 邏輯 與運算 腳本編程 num bash編程之條件判斷 bash編程之條件判斷:判定後續操作的前提條件是否滿足           1、條件判斷的常用判斷類型(bash內生的):               整數測試        

MVC構建Linq條件排序Selector字段過濾

ssi mvc bsp 分別是 fun clas div lin con 代碼: System.Linq.Expressions.Expression<Func<Domain.S_ROLE, bool>> expressWhere1 = (c =&

46求1+2+3+...+n,要求不能使用乘除法forwhileifelseswitchcase等關鍵字及條件判斷語句(A?B:C)。

closed else while spl 判斷語句 stat 條件 執行 ret 思路:循環或者遞歸都有個結束條件和執行條件。用&&短路與代替。 //短路與&&;就是只有前一個條件滿足才可以去判斷第二個條件。 //遞歸的出口

Java關於條件判斷練習--統計一個src文件下的所有.java文件內的代碼行數(註釋行空白行不統計在內)

stat 註釋 string 字符 條目 pub isf exc system 要求:統計一個src文件下的所有.java文件內的代碼行數(註釋行、空白行不統計在內)   分析:先封裝一個靜態方法用於統計確定的.java文件的有效代碼行數。使用字符緩沖流讀取文件,首先判斷是

makefile=:=和+=的區別

有感 分析 eight c語言 區別 all ont 總結 mil 經常有人分不清= 、:=和+=的區別 這裏我總結下做下詳細的分析: 首先你得清楚makefile的運行環境,因為我是linux系統,那麽我得運行環境是shell 在Linux的shell裏,shell

hive數據類型轉換字符串函數條件判斷

string decimal tails clas sele 我們 浮點 ngs ble http://blog.csdn.net/yimingsilence/article/details/70057638 數據類型轉換 同Java語言一樣,Hive也包括 隱式

vue根據手機類型判斷是安卓微信或IOS跳轉相應下載頁面

nload tor js代碼 roi agen 按鈕 path his cati 按鈕:<div class="download" @click="downApp">立即下載</div> 遮罩層:<div class="dark" v-show

Python基礎---循環--條件判斷(while-for-if-elif-else)

Python基礎---循環--條件判斷!!!語句!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1.代碼實例: #if語句#!/usr/bin/python3#_*_coding:utf-8_*_num = 10if num == 10: pri

條件判斷語句:文件數值字符串

shell 條件 測試 可以用test或者[]測試一個條件是否成立,如果測試結果為真,則該命令退出狀態為0,如果為假,狀態為1文件測試格式:test option file 或者[ option file ]-b file 塊文件-c file 字符文件-d file 目錄-e fi

shell(1)介紹腳本結構和執行date命令腳本的變量腳本邏輯判斷文件目錄屬性判斷

shell語法 一、shell腳本介紹我自定的shell腳本基本是放在/usr/local/sbin/目錄下。 二、Shell腳本結構和執行腳本命令:bash +腳本文件路徑sh +腳本文件路徑查看腳本執行過程-x :bash -x 1.sh查看腳本是否語法

復習python(條件判斷循環字符串格式化)

語句塊 有一種 str 條件 字符串格式化 %s 循環 color username 1、條件判斷: 只有一種 if: *** elif:#多個條件加elif,想加幾個加幾個 **** else: **** python裏靠縮進來表示表示語句塊,見到