Makefile语法
在Makefile中的命令,必须要以 Tab 键开始
通配符
make支持三个通配符: * , ? 和 ~
1. ~:~/test ,这就表示当前用户 的 $HOME 目录下的test目; ~hchen/test: 则表示用户hchen的宿主目录下的test 目录
# 1. 列出一确定文件夹中的所有 .c 文件
objects := $(wildcard *.c)
# 2. 列出(1)中所有文件对应的 .o 文件
%(patsubst %.c,%.o,$(wildcard *.c))
“wildcard”,“patsubst”是Makefile的关键字
判断语句
# 判断变量$(CC)的值是否为gcc
# 是执行$(CC) -o foo $(objects) $(libs_for_gcc)语句
# 不是执行$(CC) -o foo $(objects) $(normal_libs)语句
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
多条件的使用
- 在目标内使用if
@if [ $(ARCH) = $(LINUX) ]; \
then \
echo $(ARCH); \
elif [ $(ARCH) = $(HP-UX) ]; \
then \
echo $(ARCH); \
else \
echo "ARCH unknow"; \
fi
- 在目标外使用if
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
Makfile中有两种if语句,注意第一种的\
和;
(每个指令后都跟着;)
Makefile中打印
- $(warning “想要打印的信息\$(要打印的变量)”)
- @echo ‘想要打印的信息’
[[email protected] ~]# cat Makefile
all:
echo "make all"
clean:
echo "make clean"
echo "print none"
@echo "print @"
[[email protected] ~]# make clean
echo "make clean"
make clean
echo "print none"
print none
print @
没有@是会回显
调试Makefile/make参数
调试:
-n 或 –just-print ,那么其只是显示命令,但不会执行 命令
-s 或 –silent 或 –quiet 则是全面禁止命令的显示
其他参数:
-i 或是 –ignore-errors 参数,那么,Makefile中 所有命令都会忽略错误
-k 或是 –keep-going ,这个参数的意思是,如果某 规则中的命令出错了,那么就终止该规则的执行,但继续执行其它规则。
忽略错误
-
-
:标记为不管命令出不出错都认为是成功的 - make加上 -i 或是 –ignore-errors 参数,那么,Makefile中 所有命令都会忽略错误
- -k 或是 –keep-going ,这个参数的意思是,如果某 规则中的命令出错了,那么就终止该规则的执行,但继续执行其它规则。
函数的定义与调用
define func
command1
command2
…
endef
函数调用
$(func)
执行shell
$(shell shell代码)
在Makefile文件的目标项冒号后的另起一行的代码才是shell代码。
all:
xx=33
Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递。所以,Makefile中的shell不管多长也要写在一行。
调用shell变量:$$()
[[email protected] ~]# cat Makefile
ww=$(shell uname -a) #shell代码执行结果赋给一个变量
all:
echo "make all"
clean:
@echo $(ww)#
echo "make clean"
echo "print none"
@echo "print @"
[[email protected] ~]# make clean
Linux localhost.localdomain 3.10.0-123.el7.x86_64
echo "make clean"
make clean
echo "print none"
print none
print @
Makefile 中使用cd
cd 命令在makefile里面只对当前行有用。
比如你在/root执行makefile
如果我要tar开一个包在 /lib下
cd /opt
tar -xvf xxxx.tar
结果只会将这个tar包在执行makefile的当前目录/root下解包
正确写法是:
cd /opt && tar -xvf xxxx.tar 或者 cd /opt; tar -xvf xxxx.tar
下一条命令执行的时候任然是在/root目录下
Makefile中调用shell文件
bash $(DEBTOP)/tmp/$(_dir_frame)/pds.frame.install $(PWD) $(DEBTOP) $(_dir_frame)
$(PWD) $(DEBTOP) $(_dir_frame)
是传递的参数
上一篇: Makefile语法
下一篇: Makefile语法