五、Makefile条件判断、伪目标

1 条件判断

关键字功能
ifeq判断参数是否不相等,相等为true,不相等为false
ifneq判断参数是否不相等,不相等为true,相等为false
ifdef判断是否有值,有值为true,没有值为false
ifndef判断是否有值,没有值为true,有值为false

1.1 ifeq和ifneq

条件判断格式

# 或者 ifeq "ARG1" "ARG2"
ifeq(ARG1,ARG@)
[Tab][Tab]command
else
[Tab][Tab]command
endif

我在测试中发现,命令需要两个TAB键,否则会报错。

1.2 ifdef和ifndef

ifdef ARG
[Tab]conmand
else
[Tab]conmand
endif

判断是否有值,一个TAB键即可。

1.3 示例

文件结构和上一章一致。测试判断是否有值,我使用了伪目标。

libs_for_gcc:= 
normal_libs:= -lmosquitto

SRC:= $(wildcard *.c)
SRC+= $(wildcard source/*.c)
# SRC += $(shell ls source/*.c)
OBJ:= $(SRC:.c=.o)

INC:= -I./include

test:$(OBJ)
ifeq ($(CC),cc)
		$(CC) $^ -o $@ $(libs_for_gcc)
else
		$(CC) $^ -o $@ $(normal_libs)
endif
%.o:%.c
	$(CC) -c $< -o $@ $(INC)


.PHONY : testif
bar = 
foo = $(OBJ)
testif:
ifdef bar
	@echo yes
else
	@echo no
endif

.PHONY : clean
clean:
	rm -rf $(OBJ)

2 伪目标

  使用伪目标有两点原因:

  • 避免我们的Makefile中定义的只执行的命令的目标工作目录下的实际文件出现名字冲突(避免把工作目录下的文件,当成规则的目标,这样命令就不会执行)。
  • 提高执行make时的效率,特别是对于一个大型的工程来说,提高编译的效率也是我们所必需的。
.PHONY:clean
clean:
[Tab]command

使用

make clean

2.1 伪目标防止把文件当成目标

SUBDIRS:= main test1 test2
.PHONY:subdirs
subdirs:
        for dir in $(SUBDIRS);do make -C $$dir;done 

.PHONY:clean
clean:
        rm main/*.o test1/*.o test2/*.o

定义 main test1 test2文件都是伪目标

SUBDIRS:= main test1 test2
.PHONY:subdirs $(SUBDIRS)
subdirs:$(SUBDIRS)
$(SUBDIRS):
        $(MAKE) -C $@
clean:
        rm main/*.o test1/*.o test2/*.o

参考1:Makefile伪目标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值