Makefile中的ifeq 多条件使用

转载 2018年04月17日 20:51:36

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
 2 
 3 ifeq ($(ver), debug)
 4 ALL: test_d
 5 CXXFLAGS = -c -g -Ddebug
 6 else
 7 ALL: test_r
 8 CXXFLAGS = -c -O3 
 9 endif
10 
11 test_d: test.do
12     g++ -o $@ $^
13 
14 test_r: test.ro
15     g++ -o $@ $^
16 
17 %.do: %.cpp
18     g++ $(CXXFLAGS) $< -o $@
19 
20 %.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:
https://www.cnblogs.com/caosiyang/archive/2012/06/13/2548051.html

Makefile工程实践

介绍Linux环境下,开发软件编译Makefile的基础知识、一步一步从零开始写一个模拟MP3项目的Makefile。
  • 2017年01月02日 13:06

Linux Makefile ifeq正确使用

今晚和昨晚捣鼓了很久ifeq,按照书山所写的的
  • pk124729136
  • pk124729136
  • 2014-07-23 23:08:26
  • 10847

学习笔记:Makefile的ifeq逻辑或,逻辑与的变通实现

(1)ifeq的用法          ifeq ($(变量名), 变量值 )            ........          else ifeq ($(..), ..)      ...
  • u010312436
  • u010312436
  • 2016-09-07 15:33:42
  • 12471

Makefile ifeq 或 判断

FLAG1 := B FLAG2 := B FLAG3 := B FLAG4 := B $(warning filter a b,c== $(filter $(FLAG2) $(FLA...
  • ermuzhi
  • ermuzhi
  • 2015-06-15 22:48:15
  • 4338

makefile中的条件判断ifeq、ifneq、ifdef

使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。  一、示例  下面的例子,判断$(CC)变量是否“gcc”,如果...
  • nyist327
  • nyist327
  • 2015-01-09 11:24:32
  • 3077

makefile 的 ifdef, ifeq 使用及辨析

#可以用命令行传递变量 RELEASE = abc #ifdef 变量名称不能加$() ifdef RELEASE $(warning RELEASE defined) else $(warning...
  • hejinjing_tom_com
  • hejinjing_tom_com
  • 2014-11-27 17:45:38
  • 6018

跟我一起写makefile-6(使用条件判断)

使用条件判断 —————— 使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。 一、示例 下面的例子,判断$(CC)变量是否“g...
  • higoalhwl
  • higoalhwl
  • 2007-09-21 10:33:00
  • 2372

Makefile容易犯错的语法

1.引言 最近学习android的Build系统,接触最多的自然就是Makefile语法,发现很多容易出错的地方,不避开这些错误语法没法真正了解Makefile的内涵,下面就介绍遇到的一些让人困惑的...
  • GetNextWindow
  • GetNextWindow
  • 2015-08-24 17:31:14
  • 1420

Makefile学习笔记<条件判断>

1.判断是否相等ifeq 条件语句 条件成立时要做的事情 endif 或者 ifeq 条件语句 条件成立时要做的事情 else 条件不成立时要做的事情 endif其中“条件语句...
  • LGibsion
  • LGibsion
  • 2017-04-28 10:59:30
  • 785

Makefile 中的 ifeq 的缩进导致的错误

转自:http://stackoverflow.com/questions/4483313/make-error-for-ifeq-syntax-error-near-unexpected-token...
  • yasi_xi
  • yasi_xi
  • 2014-09-09 14:14:49
  • 4305
收藏助手
不良信息举报
您举报文章:Makefile中的ifeq 多条件使用
举报原因:
原因补充:

(最多只允许输入30个字)