1. 程式人生 > >make條件判斷ifeq,ifneq,ifdef,ifndef

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

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

相關推薦

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

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

makefile中的條件判斷ifeqifneqifdef

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

make--變量 條件判斷 函數定義及調用

UNC end bsp 註意 vpd 定義函數 包含 blog str 一.變量的高級主題 A.變量值的替換1.使用指定字符(串)替換變量中的後綴字符(串)2.語法格式:$(var:a=b) (將a替換成b)a.替換表達式中不能有任何的空格b.make中支持使用${}對變量

條件判斷

mod 條件 出了 並不是 all 整數比較 否則 php 錯誤 條件判斷 計算機之所以能做很多自動化的任務,因為它可以自己做條件判斷。 比如,輸入用戶年齡,根據年齡打印不同的內容,在Python程序中,用if語句實現: age = 20 if age >= 18:

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

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

python 之條件判斷

als 空字符串 tee 執行 odi oat 自己 數字 ... 條件判斷 計算機之所以能做很多自動化的任務,因為它可以自己做條件判斷。 比如,輸入用戶年齡,根據年齡打印不同的內容,在Python程序中,用if語句實現: age = 20 if age >

Python之條件判斷和循環

height ont 腳本 混合 sse 根據 pan fail width 1、if條件判斷語句 1 score = 80 2 if score >= 60: 3 print ‘Passed‘ 4 else: 5 print ‘Failed‘ 註

shell 編程 -- 條件判斷

如果 -s size 裏的 字符串 ron -o 普通 修改 1.按照文件類型進行判斷(常用的)-b 判斷該文件是否存在-d 判斷是否存在,並且是否為目錄(是目錄就為真)-e 判斷該文件是否存在(存在為真)-f 判斷文件是否存在,並且是否為普通文件(是普通文件為真)-L 判

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

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

MYSQL數據類型和where條件判斷

where條件 var 否則 float 由於 是否為空 size 邏輯運算 查詢 MySQL中常見的數據類型 一、字符型 ① CHAR(N):固定N個字符長度的字符串,如果長度不夠自動空格補齊; N的範圍 0~255 ② VARCHAR(N): 存儲可變長度的字符串

(6)javascript的程序控制結構及語句-----(1)條件判斷

江湖 too 分支語句 copy 表達 demo oct alt javascrip 程序控制結構及語句 編程就是將現實應用,轉換為程序能夠讀得懂的語法語句。Javascript編程中對程序流程控制主要是通過條件判斷語句、循環控制語句及continue、break來完成的

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

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

linux--shell編程(三)條件判斷及算術運算

寫一個腳本 head bsp 如何 cut inittab 引用 有用 color 練習:寫一個腳本判斷當前系統上是否有用戶的默認shell為bash; 如果有,就顯示有多少個這類用戶;否則,就顯示沒有這類用戶; #!/bin/bash # grep ‘\<ba

Python中的條件判斷

python if 條件判斷# 條件判斷 # 1 print("#1") age = 20 if age >= 18: print(‘your age is‘, age) print(‘adult‘) print("---------------------") # 2 print(

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

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

python-FIrst1--變量賦值-註釋-用戶交互-條件判斷與縮進

代碼 blog 本質 else error: 錯誤 div 固定 code 變量與賦值 name=‘mike‘ #這裏一定要註意,如果右邊的值不是數字,就一定要加引號,否則系統會認為右邊也是一個變量,而右邊我們希望是一個值,所以這時候我們就需要給右邊加上單

hell腳本編寫 之 條件選擇,條件判斷,循環語句

if case for while until1 概述編寫shell腳本,一般離不開條件選擇,條件判斷以及循環語句。掌握這三個語法,將大大提高腳本的編寫效率,使得腳本編寫更加靈活,完成X相對復雜的工作2 條件選擇if語句if語句選擇執行,逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而後結束整個if語

Javascript利用與或運算符優先級實現if else條件判斷表達式

與或 等於 規則 alert 判斷表達式 三目運算 返回值 res 兩個 <script type="text/javascript"> /*************************************************************

Javascript 籬式條件判斷

sna scrip 對象 ... javascrip 條件判斷 define ava 錯誤 null 沒有任何的屬性值,並且無法獲取其實體(existence)值。所以 null.property 返回的是錯誤(error)而不是 undefined 。 考慮下面的代碼 i

shell 編程if條件判斷與if 真假判斷

if 真假 與 條件判斷if條件判斷與if真假判斷 目錄: 1.正確寫法 2.錯誤寫法 3.總結一、正確寫法 在編寫shell腳本時,為簡化代碼的行號及結構的簡約型,通常將命令執行結果和判斷通過一條語句進行編寫(在C語言編寫程序時,經常遇到此種寫法),如:[[email protected]