当前位置:   article > 正文

Makefile学习笔记3_kaldi-io-for-python makefile

kaldi-io-for-python makefile

Makefile学习笔记3

为规则书写命令

规则命令通常就是由一些shell命令组成,他们被一条一条执行.规则中除了第一条紧跟在依赖列表之后使用分好隔开的命令之外,其他的每一条命令行必须以[Tab]字符开始.

命令回显

make执行命令前会把命令回显到标准输出.如果规则以”@”字符开始,make执行这个命令的时候就不会回显这个要执行的命令.

all:test
    echo "开始编译all"
test:
    @echo "开始编译test"

//执行结果
$ make 
开始编译test    //规则命令前加了'@'字符,命令没有回显
echo "开始编译all"
开始编译all
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

make加了’-n’选项执行时,会回显所有的的命令
make加’-s’选项执行时,禁止所有执行的命令显示,就好像所有的命令前面都加了’@’字符一样.

命令的执行

命令的每一行将在一个独立的shell中执行.因此多个命令之间的执行是相互独立的,相互之间不存在依赖关系,make中同一行的多个命令属于一个完整的shell命令行。
因此,命令行“cd”改变目录不会对气候的命令的执行产生影响。就是说气候的命令执行的工作目录不会是之前使用“cd”进入的那个目录。如果要实现这个目的,就不能吧“cd”和其后的命令放在两行来书写。而应该把这两条命令写在一行上,用分号分隔。这样它们才是一个完整的shell命令行。

foo : bar/lose
    cd bar; gobble lose > ../foo
  • 1
  • 2

如果命令要卸载多行上,需要使用饭斜杠(\)来对处于多行命令进行连接,表示它们是一个完整的shell命令行。例如上面我们可以这么写:

foo: bar/lose
    cd bar; \
    gobble lose > ../foo
  • 1
  • 2
  • 3

并发执行命令

make的’-j’选项用来实现并发执行。

make的递归执行

make递归执行是只,在makefile的规则命令中使用make来执行另一个makefile文件,比如在多级目录的项目中。例如一个目录存在一个子目录”subdir”。在这个子目录中有描述此目录编译规则的makefile文件,在执行make时需要从上层目录开始并完成他的所有子目录的编译。

subsystem:
    cd subdir && $(MAKE)

等价于:

subsystem:
    $(MAKE) -C subdir
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

变量 MAKE
变量 CURDIR //这个每递归进入子目录中时会变化,值为当前目录的完整路径
变量 MAKEFLAGS

变量和递归

export 上层变量导入到下层makefile中
取消导入,用unexport命令

不带参数的export,表示导入所有变量

定义命令包

define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endif
  • 1
  • 2
  • 3
  • 4

命令包跟变量的行为相同,可以当作变量来使用。

foo.c: foo.y
    $(run-yacc)
  • 1
  • 2

空命令

target:;

为来防止查找隐含规则陷入死循环

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/98979
推荐阅读
相关标签
  

闽ICP备14008679号