makefile if 使用

本文详细介绍了Makefile中如何使用if条件语句,并通过具体示例展示了在目标外及目标内使用if的不同方法。此外,还探讨了如何在Makefile中正确引用Shell变量以及如何利用Shell脚本进行条件判断。

1、在目标外使用if

#这个ifeq else endif,在target 外部,关键字前边一定要有tab
    ifeq ("aaa","bbb")
#内容前可以有空格,如果是tab时,解析为命令
#变量前可以多个空格
  LIBS= -laaa
    else
#+echo "test"
  LIBS= -lbbb
    endif

2、在目标内使用if

a、情形一:shell 方式

#make预处理时,所有以$开头的,它都不会放过。要想引用Shell自己的变量,应该以$$开头。另外要注意,Shell自己的变量是不需要括号
#make把每一行Shell脚本当作一个独立的单元,它们在单独的进程中运行。里边定义的变量,只能在局部使用
    @if [ "debug" = "debug" ]; \
    then \
TV3=test3_yes;\
echo $$TV3; \
echo $(TV3); \
    else \
TV3=test3_no;\
    fi

b、情形二:makefile方式

#这个ifeq else endif,在target 内部,关键字前边一定没有tab,否则当命令处理。可以有多个空格
#在内部时,endif后边不能执行任务语句
ifeq ("aaa","bbb")
    @echo ccccc
LIBS2= -laaa
#   @echo $(LIBS2)
  else
    @echo bbbba
LIBS2= -lbbb
#   @echo $(LIBS2)
  endif

3、测试 makefile

#是否相等
#ifeq (ARG1, ARG2)
#ifeq 'ARG1' 'ARG2'
#ifeq "ARG1" "ARG2"
#ifeq "ARG1" 'ARG2'
#ifeq 'ARG1' "ARG2"

#是否不相等
#ifneq




TV1=aaa
TV2=aaa
TV3=tv3
LIBS=
LIBS2=
#这个ifeq else endif,在target 外部,关键字前边一定要有tab
#这个ifeq else endif,在target 内部,关键字前边一定没有tab,否则当命令处理
    ifeq ("aaa","bbb")
#内容前可以有空格,如果是tab时,解析为命令
#   +echo "test"
  LIBS= -laaa
    else
#+echo "test"
  LIBS= -lbbb
    endif

KVAL=start


#makefile变量只能在target外部定义和修改
all:

#如果不添加@,结果也出出,但是语句本身也会打印出来
    echo $(KVAL)
    @echo $(LIBS)
#Shell脚本在target里才有效,其它地方都被忽略掉了。target 外可以用$(shell 语句)方式
#make把每一行Shell脚本当作一个独立的单元,它们在单独的进程中运行。里边定义的变量,只能在局部使用
    @if [ "debug" = "debug" ]; then  echo "build debug"; else echo "build release"; fi


#make预处理时,所有以$开头的,它都不会放过。要想引用Shell自己的变量,应该以$$开头。另外要注意,Shell自己的变量是不需要括号
#在Makefile中执行shell命令,一行创建一个进程来执行。这也是为什么很多Makefile中有很多行的末尾都是“;  \”,以此来保证代码是一行而不是多行,这样Makefile可以在一个进程中执行
    @for i in 1 2 3; \
    do \
    echo "building " $$i; \
    done
    @echo "finall"


#make把每一行Shell脚本当作一个独立的单元,它们在单独的进程中运行。里边定义的变量,只能在局部使用
    @if [ "debug" = "debug" ]; \
    then \
TV3=test3_yes;\
echo $$TV3; \
echo $(TV3); \
    else \
TV3=test3_no;\
    fi
    @echo $(TV3)

#这个ifeq else endif,在target 外部,关键字前边一定要有tab  
#这个ifeq else endif,在target 内部,关键字前边一定没有tab,否则当命令处理
#在内部时,endif后边不能执行任务语句
ifeq ("aaa","bbb")
    @echo ccccc
LIBS2= -laaa
#   @echo $(LIBS2)
  else
    @echo bbbba
LIBS2= -lbbb
#   @echo $(LIBS2)
  endif

  ifeq ("aaa","bbb")
#   @echo ccccc
LIBS2= -laaa
  else
#   @echo bbbb
LIBS2= -lbbbc
  endif

#   @echo "finall"
Makefile 中,`if` 条件判断用于根据某些条件动态控制构建流程。Makefile 支持多种 `if` 表达式,包括 `ifeq`, `ifneq`, `ifdef`, 和 `ifndef`。这些条件判断语句必须与 `endif` 成对出现,并且可以嵌套使用。 ### ifeq `ifeq` 用于比较两个值是否相等。其语法如下: ```make ifeq (arg1, arg2) # 如果 arg1 等于 arg2,则执行这里的代码 endif ``` 示例: ```make CC = gcc ifeq ($(CC), gcc) CFLAGS += -Wall -Wextra endif ``` 在这个例子中,如果变量 `CC` 的值是 `gcc`,则会向 `CFLAGS` 添加额外的警告选项 [^5]。 ### ifneq `ifneq` 用于比较两个值是否不相等。其语法如下: ```make ifneq (arg1, arg2) # 如果 arg1 不等于 arg2,则执行这里的代码 endif ``` 示例: ```make OS = Linux ifneq ($(OS), Windows) LDFLAGS += -lm endif ``` 如果操作系统不是 Windows,则链接数学库 `libm` [^5]。 ### ifdef `ifdef` 用于检查某个变量是否已定义(即使其值为空也视为已定义)。其语法如下: ```make ifdef VAR # 如果 VAR 已定义,则执行这里的代码 endif ``` 示例: ```make DEBUG = 1 ifdef DEBUG CFLAGS += -g endif ``` 如果定义了 `DEBUG` 变量,则启用调试信息生成 [^5]。 ### ifndef `ifndef` 用于检查某个变量是否未定义。其语法如下: ```make ifndef VAR # 如果 VAR 未定义,则执行这里的代码 endif ``` 示例: ```make ifndef CC CC = gcc endif ``` 如果没有定义编译器 `CC`,则默认使用 `gcc` [^5]。 ### 综合示例 以下是一个更复杂的 Makefile 示例,展示了如何结合多个条件判断来控制构建流程: ```make # 设置默认编译器和标志 CC = gcc CFLAGS = -O2 # 根据平台设置不同的标志 OS = $(shell uname) ifeq ($(OS), Linux) CFLAGS += -DLINUX else ifeq ($(OS), Darwin) CFLAGS += -DAPPLE else CFLAGS += -DOTHER endif # 检查是否启用调试模式 ifdef DEBUG CFLAGS += -g -DDEBUG_MODE endif # 定义目标 TARGET = myapp SRC = main.c utils.c OBJ = $(SRC:.c=.o) all: $(TARGET) $(TARGET): $(OBJ) $(CC) $(CFLAGS) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJ) $(TARGET) ``` 在这个例子中,首先根据操作系统设置特定的宏定义,然后检查是否启用了调试模式,并据此调整编译标志 [^5]。 ### 注意事项 - Makefile 中的条件判断是基于文本替换机制实现的,因此需要注意变量展开顺序。 - 条件判断块中的命令仍然需要遵循 Makefile 的缩进规则(即以 Tab 开头)。 - 多层嵌套的 `if` 语句需要合理组织逻辑,避免过于复杂导致难以维护 。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brickie-liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值