文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>常用命令之 make常见规则解析

常用命令之 make常见规则解析

时间:2006-06-09  来源:guozheng2003

这是一段在Makefile中常见的规则

clean:
  rm -r core *.o *.a tmp_make
  for i in *.c; do rm -f `basename $$i .c`.s; done
  (cd chr_drv; make clean)
  (cd blk_drv; make clean)
  (cd math; make clean)

  第一句的 rm -f core *. *.a tmp_make 作用只是删除文件,意思直白,没什么好说的。
  第二句 for 循环遍历目录下所有的文件,将所有后缀名为.c文件名依次赋给i。然后执行do语句,当符合循环结束是执行done。可以说这里的for和shell里for语法是如此貌似。

我们可以来做个实验来验证一下:
  $ mkdir test   #建立个实验用的目录
  $ cd test
  $ touch a.x   #建几个实验用的文件
  $ touch b.x
  $ touch yy.x
  $ vi Makefile   #写个实验脚本
在文件中写入:

clean:
  for i in *.x; do echo $$i; done

  写好后,保存退出。运行命令:
  $ make
 
  随后可看到输出的结果:
  for i in *.x;do echo $i;done
  a.x
  b.x
  yy.x
 
  看到结果,for语句实现的功能就很清楚了。
  对于结果,有一个怪异的就是,原来脚本中的$$i,在输出是就变成了$i。这时的for是不是就是一样了。现在可以先做个结论,make处理脚本可shell处理脚本几乎雷同,只是个别情况下要做变通。make会对$x进行扩展。比如:
  ec=echo
test:
  $(ec) 'ddd'

就可以在屏幕上看到输出:
  echo 'ddd'
  ddd
 
  所以应该是make对Makefile进行处理,将其变成shell可执行的脚本,最后由shell解释器来执行有make翻译过的脚本。并且是翻译一句然后shell执行一句,对于这个可以再做个验证。
 
  e =echo
  prt=ls
clean:
    $(prt)
    for i in *.x;do $e $$i;done

  其输出为:
  ls
  a.sh a.x b.x Makefile yy.x
  for i in *.x;do echo $i;done
  a.x
  b.x
  yy.x
  可以看到,$(prt)被扩展后就立即执行了。后面的for也是这样。

  到这里开篇的那个例子算是解析完毕了。下面在看看Makefile中的规则定义,在make中的规则分为两种,一种是显示规则,另一种无可争议的就是隐含规则了。

  显示规则,定义如下

目标文件 : 依赖文件
  生成目标文件的规则
 

  隐含规则
.源文件扩展名.目标文件扩展名:
  生成目标文件的规则

  在使用隐含规则时要使用一些内定宏来指定文件名:
  $@   全路径的目标文件
  $*   去除扩张名的全路径的目标文件
  $?   所有源文件名
  $<   源文件名
相关阅读 更多 +
排行榜 更多 +
冒名顶替者战争

冒名顶替者战争

策略塔防 下载
SUPERSTAR STARSHIP

SUPERSTAR STARSHIP

音乐节奏 下载
炮弹比赛

炮弹比赛

飞行射击 下载