Makefile中的ifeq 多條件使用

2021-08-18 22:34:42 字數 1897 閱讀 4531

makefile中的ifeq 多條件使用

網上關於makefile中ifeq的介紹已經很多了,為什麼我還要在寫這篇文章,因為他們只說了if else兩種條件的情況,並沒有講多於兩種條件情況的使用。

多於兩種情況的使用很簡單,害我嘗試很多種方法,如ifeq elifeq等等這些。其實就如同c中的if [else if] [else if]…else的使用一樣,

舉個我使用的例子,android中的ndk程式android.mk判斷當前是哪種cpu架構:

ifeq ($(target_arch), arm)

local_src_files := ...

else ifeq ($(target_arch), x86)

local_src_files := ...

else ifeq ($(target_arch), mips)

local_src_files := ...

else

local_src_files := ...

endif

很簡單有木有,但網上的資料都沒有去涉及,可能大多數**都一樣,呵呵,這是我看makefile標準文件中得到了。希望給同樣困惑的人一點幫助。

一般,在開發測試階段用debug版本,而上線發布用release版本。

使用makefile定製編譯不同版本,避免修改程式和makefile檔案,將會十分方便。

讀了一些資料,找到乙個解決方法,makefile預定義巨集與條件判斷,結合make預定義變數,進行條件編譯。

比如,有乙個test.cpp,包含這段**

#ifdef debug

//your code

#endif

你希望在debug版本要執行它,在release版本不執行。

我們可以寫這樣的乙個makefile:

1 ver = debug

23 ifeq ($(ver), debug)

4 all: test_d

5 cxxflags = -c -g -ddebug

6else

7 all: test_r

8 cxxflags = -c -o3

9 endif

1011 test_d: test.do

12 g++ -o $@

$^13

14 test_r: test.ro

15 g++ -o $@

$^16

17%.

do: %.cpp

18 g++ $(cxxflags) $< -o $@

1920

%.ro: %.cpp

21 g++ $(cxxflags) $< -o $@

簡單說一下,makefile根據ver的不同定義了不同的編譯選項cxxflags與輸出程式all,

debug版本輸出程式是test_d,release版本輸出程式是test_r

debug版本編譯選項是」-c -g -ddebug」,release版本編譯選項是」-c -o3」

debug版本object檔案字尾是」.do」,release版本object檔案字尾是」.ro」

debug版本編譯選項使用」-d」定義巨集debug,使得your code能夠執行。

不同版本的編譯選項、object檔案、輸出程式均不同,所以可以同時編譯兩個版本的程式,互不影響。

makefile執行時,首先判斷ver變數,如果ver的值是debug,編譯debug版,否則編譯release版。當然,預設情況下是編譯debug版的。

如果想編譯release版,要怎麼做?

只要在執行make時,對ver變數賦值,使得ver的值不為debug,比如

from:

Makefile中的ifeq 多條件使用

網上關於makefile中ifeq的介紹已經很多了,為什麼我還要在寫這篇文章,因為他們只說了if else兩種條件的情況,並沒有講多於兩種條件情況的使用。多於兩種情況的使用很簡單,害我嘗試很多種方法,如ifeq elifeq等等這些。其實就如同c中的if else if else if else的使...

makefile中的多target混亂依賴模式

來看個例子,makefile內容為 test1 test2 test1.cpp test2.cpp clean rm f test1 test2這是一種非常懶散的寫法,雖然可以work taoge localhost desktop make clean rm f test1 test2 taoge...

Makefile多檔案編譯

include test.h main main.c makefile makefile obj makefile src eat eat.c eat.h makefile makefile test.c test.htest.件 include includeint testprint 將test...