欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Makefile语法

程序员文章站 2022-07-12 11:28:13
...

在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

多条件的使用

  1. 在目标内使用if
@if [ $(ARCH) = $(LINUX) ]; \
    then \
        echo $(ARCH); \
    elif [ $(ARCH) = $(HP-UX) ]; \
    then \
        echo $(ARCH); \
    else \
        echo "ARCH unknow"; \
    fi
  1. 在目标外使用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中打印

  1. $(warning “想要打印的信息\$(要打印的变量)”)
  2. @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 ,这个参数的意思是,如果某 规则中的命令出错了,那么就终止该规则的执行,但继续执行其它规则。

忽略错误

  1. -:标记为不管命令出不出错都认为是成功的
  2. make加上 -i 或是 –ignore-errors 参数,那么,Makefile中 所有命令都会忽略错误
  3. -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语法