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