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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

makefile学习(五)  

2011-11-23 15:04:16|  分类: LINUX编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

makefile学习(五)

使用MAKEFILE就会有好多的伪目标、宏和特殊字符,最简单的当然是CC,呵呵,宏其实也可以叫做变量。一定不要晕。伪目标也很多常用的如clean,我们在重新编译时总会运行make clean,这次还会提及特殊字符“-”(减号)和@,意义下面细说。
先把这次的makefile的内容贴出来:
转载自网络http://blog.csdn.net/edgar_wu/article/details/3863034示例三项式
#
# makefile sample that uses phony targets and macros
#

# *** MACROS

INSTPATH=./bin/myapp
INCPATH=./include
OBJPATH=./obj
CC=cc
CFLAGS=-g -Wall -I$(INCPATH)
COND1=`stat app 2>/dev/null | grep Modify`  说明一下:这里不是单引号,是反引号,也就是键盘上的ESC键下面的那个键
COND2=`stat $(INSTPATH) 2>/dev/null | grep Modify`

# *** Targets

all: getobj app install putobj

app: main.o mod_a.o mod_b.o
 $(CC) $(CFLAGS) -o app main.o mod_a.o mod_b.o

main.o: main.c $(INCPATH)/inc_a.h $(INCPATH)/inc_b.h
 $(CC) $(CFLAGS) -c main.c

mod_a.o: mod_a.c $(INCPATH)/inc_a.h
 $(CC) $(CFLAGS) -c mod_a.c

mod_b.o: mod_b.c $(INCPATH)/inc_b.h
 $(CC) $(CFLAGS) -c mod_b.c

getobj:
 -mv $(OBJPATH)/*.o . 2>/dev/null

putobj:
 -mv *.o $(OBJPATH) 2>/dev/null

# Process only when app timestamp is changed
install:
 @if [ "$(COND1)" != "$(COND2)" ];\
 then\
  cp -p ./app $(INSTPATH) 2>/dev/null;\
  chmod 700 $(INSTPATH);\
  echo "Installed in" $(INSTPATH);\
 fi
 
# This one is used for housekepping
cleanall:
 -rm -f app
 -rm -f $(OBJPATH)/*.o
 -rm -f $(INSTPATH)
 
然后说一下注意的地方:
1、在高版本的UBUNTU上,VIM高级版本会自动对MAKEFILE的命令进行缩进,也就是说,不必再使用TAB键缩进,当然,你手动也未为不可。
2、目录指示一定不要忘记/,比如/dev/null不可以 dev/null
3、记得无论何种括号要成对出现,否则出现“  Unterminated variable reference. Stop.”
4、mv obj/*.o .  2>/dev/null 在以前的BLOG中提及过,标准输入stdin文件描述符为0,标准输出stdout文件描述符为1,标准错误stderr文件描述符为2,这句话的意思是把OBJ文件夹下的缀为o的所有文件拷贝到目录,记得有一个小DOT号噢,代表当前目录,将标准错误发送空设备,说白了就是扔掉。
如果写成 2>/dev/null &,则表示在后台执行。
而如果写成::>/dev/null 2>&1则表示:1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

5、包含COND1和COND2的SHELL说白了就是比较当前新生成的APP和搬运的目录下的APP,如果一样就算了,不一样搬运过去,并且给他一个相当大的权限。
stat命令表示得到文件的具体的信息,他得到的内容大于等于ls这个命令。grep是为了和stat一起得到具体的文件选项,你运行一下会发现有一个Modify,后面是时间,明白了吧。 ls -ltr:-l: 列出文件详细信息 -t:以时间排序  -r: 反向
6、@if中的@是一个特殊字符,表示make在执行命令前不要把命令的内容输出到标准设备上,还有一个-mv中的-:表示在出现错误时候忽略,因为make在执行过程中默认是如果出现错误就退出执行。使用这个符号就可以让其继续执行。
7、all伪目标:默认就是执行全部,并且可以对MAKE目标分组,引导其分别执行命令来处理这些目标,你可以把他理解成一种依赖,象普通的目标一样。
伪目标的作用(再重复一次):防止目标名称与实际文件相冲突,而产生异常。可以用.PHONY显示的指名一个目标是伪目标,更具体的可以参看标准文档和陈皓的文章。
8、变量(宏)可以用$(变量名)来访问或者替换。
9、注意SHELL中的\,这个符号是用来连接的,就象编程里的宏的换行连接是一样的。

注意了以上几点后,你会发现,其实和前几篇的用法并没有什么大的差别。

  评论这张
 
阅读(961)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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