Makefile中利用shell的方式来给变量赋值的两种方法

最近的任务要求利用Makefile来实现某些功能,其中涉及到使用shell的结果给变量赋值,下面提供两种自己使用的方法:

一:
export filename=boot.bin
export filesize=$(shell du -b $(filename)|cut -f1)
export file_value=$(shell expr $(filesize) \/ 1024)
export remainder=$(shell expr $(filesize) \% 1024)
export skip_value=$(shell expr $(filesize) \- $(remainder))

二:
export filesize=`du -b $(filename)|cut -f1`
export file_value=`expr $(filesize) \/ 1024`
export remainder=`expr $(filesize) \% 1024`
export skip_value=`expr $(filesize) \- $(remainder)`

可以看到第一种是 AA = $(shell pwd)
第二种是:AA = `pwd`

一般来说两种都可以,但是当有嵌套使用的命令时候,第二种就会出现弊端。
例如上面的第二种方法:
Makefile中利用shell的方式来给变量赋值的两种方法_第1张图片
执行Makefile,输出结果如下:
ll@team:~/test$ make
echo boot.bin
boot.bin
echo du -b boot.bin|cut -f1
74808
#前面两个echo命令输出都正常
#但是第三个开始便会出错
echo exprdu -b boot.bin|cut -f1\% 1024
/bin/sh: line 0: fg: no job control
expr: missing operand
Try ‘expr --help’ for more information.
du -b boot.bin
echo exprdu -b boot.bin|cut -f1\-expr du -b boot.bin|cut -f1 % 1024``
/bin/sh: -: command not found
expr: missing operand
Try ‘expr --help’ for more information.
cut: invalid byte, character or field list
Try ‘cut --help’ for more information.
make: *** [all] Error 1

原因分析:使用`expr`·这种方式赋值的时候,后面其实是直接把整个命令都替换掉再执行,而不是执行完的结果再去替换,如下面这两个语句:
export filesize=`du -b $(filename)|cut -f1` #这个命令结果是74808
export file_value=`expr $(filesize) / 1024`

#但是执行echo $(file_value)的时候,命令是这样被执行的:
echo `expr `du -b boot.bin|cut -f1` \/ 1024`
#file_value取到的值不是数值而是原始命令,
#但是我们期望的实际是下面这样的
echo `74808 \/ 1024`    #74808除以1024

这就是为什么会报错,因为命令的嵌套导致shell的语法出错了

Makefile支持shell的写法,但和shell又有不同。
使用第一种方法就不会出错,如下:
Makefile中利用shell的方式来给变量赋值的两种方法_第2张图片
执行make,信息输出:
ll@team:~/test$ make
echo boot.bin #打印名字
boot.bin
echo 74808 #打印大小
74808
echo 56 #取余结果
56
echo 74752 #相减结果
74752
=================================
一、 AA = $(shell pwd)
二、AA = `pwd`
第一种方法赋值是先执行shell命令,将命令运行的结果赋值
第二种方法赋值是先赋值(整个shell命令都当作字符来赋值),再执行命令

你可能感兴趣的:(Makefile)