注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

make中禁止回显及其它  

2013-03-13 21:41:47|  分类: make源代码分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、make禁止回显
为啥会有这么一种需求呢?事情是这样滴:因为想在make加一个目标,然后打印一些信息,打印信息把咱们随后就抄起echo了啊,但是这个echo太屌丝了。所以我就不用?错,而是尽量掩盖我在用。办法也很简单直观,那就是禁止显示这个屌丝的echo命令的执行,只显示结果。然后不记得有没有使用google,就知道make有一个命令行选项来禁止回显所有的命令,因为make --help里是有显示的,具体来说就是
-s, --silent, --quiet       Don't echo commands.
在make 里加上一个 -s 就好了,所有命令都不显示,于是这个世界清静了。
但是这个make内部的回显功能是给别人使用的,所以你总不能说这个工具使用的时候要加上一个-s选项,这样比直接暴露使用了echo更加下流。而且这样太霸道了,这么一搞,所有的命令都不能显示了,不顺手也没有个性化。
后来google到了make里有一个.SILENT未目标,就好像大家都比较熟悉的。PHONY一样,把一个目标作为这个目标的依赖,这些依赖就不再显示了。具体来说就是酱紫滴:
[root@Harry readdevlog]# cat makefile 
#.SILENT: default
default:
echo hello world

[root@Harry readdevlog]# make 
echo hello world
hello world
[root@Harry readdevlog]# vi makefile 
[root@Harry readdevlog]# cat makefile 
.SILENT: default
default:
echo hello world

[root@Harry readdevlog]# make
hello world
[root@Harry readdevlog]# 
二、看看内核的实现
突然想起了非常上流的内核构建,如果我没有记错的话,内核的构建的时候也是没有显示任何命令的,虽然内核的构建中定义了大量的宏来迷惑大家并看起来很上流的样子,但是它终归还是和我们使用的相同的make和make语法,就像内核的代码也是我们用来printf("hello world\n");一样的C语言一样,它是肿么实现的呢?
打开内核的主makefile,一下查不到就搜到了,因为我想它是通过.SILENT未目标来实现的,所以在里面搜索了一下这个单词,一下就发现了它,但是它不是出现在makefile的代码里,而是在注释里。
  248 # A simple variant is to prefix commands with $(Q) - that's useful
    249 # for commands that shall be hidden in non-verbose mode.
    250 #
    251 #       $(Q)ln $@ :<
    252 #
    253 # If KBUILD_VERBOSE equals 0 then the above command will be hidden.
    254 # If KBUILD_VERBOSE equals 1 then the above command is displayed.
    255 
    256 ifeq ($(KBUILD_VERBOSE),1)
    257   quiet =
    258   Q =
    259 else
    260   quiet=quiet_
    261   Q = @
    262 endif

这也就是说,定义了一个变量Q,如果不要回显,就在命令前面加上一个@,这个@就是不显示执行的命令,这一点在简陋的windows下cmd中同样适用。
再看一下我开始说明的例子,在内核的makefile中是支持make help的,里面显示的内容为
  1094 help:
   1095         @echo  'Cleaning targets:'
   1096         @echo  '  clean           - Remove most generated files but keep         the config and'
   1097         @echo  '                    enough build support to build extern        al modules'
   1098         @echo  '  mrproper        - Remove all generated files + config         + various backup files'
   1099         @echo  '  distclean       - mrproper + remove editor backup and         patch files'
   1100         @echo  ''
   1101         @echo  'Configuration targets:'
这个禁止回显是无条件的。
突然想到,这个方法在我刚毕业的时候就知道,而且一年前还在用的很欢乐,现在竟然一点都没有想起来,好像重新发现了新大陆,哎……。
当然我遇到的应用场景不是这么贴心的给你提示一个help,而是要打印一些信息,而这些信息可以用来给另外一个文件作为输入,所以一定不能显示命令。
三、附带一些其它的“心得”
在sourceinsight中,不知道为什么,经常会发现系统默认的快捷键  ctrl+shift+S 不能弹出“另存为”功能,我使用另存为并不是为了真正保存,而是为了拷贝对话框中的当前编辑文件名。此时就很麻烦,要换手操作鼠标,然后再重新敲键盘,很不连贯。这个问题长久以来一直困扰着我,很是无奈。今天突然灵机一动就想到了一个方法,那就是分两步走来逼近这个问题,方法就是先用快捷键选择到File下拉菜单,然后在找到选项 另存为 的热键 A,这样也是三个按键,只是两个时序,可以准确的完成需求的功能。具体来说就是先 Alt+F ,然后再按A,搞定。这个同样也解决了我之前一直拷贝文件名中那个project-->>project setting对话框没有快捷键的问题,快哉快哉!
有些同学可能会说,你自己定义快捷键,或者写个脚本都行,但是这种东西还是太不通用了。比方说,让你用C语言写个正则表达式的匹配算法,你说,在perl里,我操作正则表达式就一条语句,不再一个星球好不好。
然后我看看了这个 project下菜单的"Project setting"的热键是‘J’,为什么这么不友好呢,不是开始的P呢?看了看,前面的P已经被用了,在Project reporting中,R Remove project,O open project,所以只能排到下一个未被用到的J了,另一个比较何时的S被synchronize占用。
还有一些比较有意思的选项,虽然这些东西没啥太大意义,但是还是挺有意思的。比方说,在bash里,执行命令行的选项为-c,而mysql里执行的则是-e,前者的解释是command的缩写,后者的解释是execute的缩写,都挺合适。

在mysql中,有两个是比较相同的选项,一个是制定端口号的port命令,另一个是指明密码的-password字段,大家注意到他们都是应该以直观的P开始,那他们如何分配呢?事实上两个都是使用P,只是一个使用大写的,一个是小写的。还有一个指明协议的的--protocal选项,这个使用哪个呢?作者说,那我是在也没招了,没有提供短的缩写方式,只能全拼,那就不好意思了,您就麻烦一点敲完吧。
  评论这张
 
阅读(654)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017