Chinaunix首页 | 论坛 | 博客
  • 博客访问: 267953
  • 博文数量: 45
  • 博客积分: 1618
  • 博客等级: 上尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-11 10:13
文章分类

全部博文(45)

文章存档

2012年(1)

2011年(25)

2010年(19)

我的朋友

分类: Python/Ruby

2011-08-22 16:21:55

介绍我的Makefile学习日志
1、最简单也是最核心的规则
   target: prerequisites
       command
   任何一个Makefile里面总能找到一个类似于这样结构语句,比如:
   edit:main.o kbd.o command.o display.o
        cc -o edit main.o kbd.o command.o display.o
   或者:
   all: .all-packages
   .all-packages: .check-BIOS
       $(XDC) --jobs=1 -PR $(PACKAGE_DIR)/ti/sdo/codecs
   第一个比较简单target对应edit,就是要生成的二进制文件,prerequisites是生成target文件所以来的文件,比如main.o kbd.o command.o display.o,而command就是要执行的shell命令了,这条命令就是单纯的gcc编译命令,很简单。
   对于第二个,我们看到all:.all-packages,很显然生成all可执行文件需要.all-packages,而后面一句也指明要生成.all-packages需要.check-BIOS,后面是一条shell命令,里面的$(XDC)是Makefile前面定义的宏,后面的是参数,之类的,当宏被替换掉后,该句仍是一条可执行的shell脚本
2、make
   一般情况下我们直接运行make命令,make命令会自动查找Makefile文件,而其入口就是上面所说的符合其规则的第一条,比如:
   edit:main.o kbd.o command.o
        cc -o edit main.o kbd.o command.o
   main.o : main.c defs.h
        cc -c main.c
   kbd.o : kbd.c defs.h command.h
        cc -c kbd.c
   command.o : command.c defs.h command.h
        cc -c command.c
   clean:
        rm edit main.o kbd.o command.o
   当我们直接运行make时候,他会默认生成edit,根据后面的依赖去查找其他文件,当我们使用make clean时候,他会直接跳到clean除执行,clean在这里类似于一个标签,指明了make的入口
3、隐藏规则
   objects = main.o kbd.o command.o display.o \
       insert.o search.o files.o utils.o
   edit : $(objects)
       cc -o edit $(objects)

   $(objects) : defs.h
   kbd.o command.o files.o : command.h
   display.o insert.o search.o files.o : buffer.h

   .PHONY : clean
    clean :
    rm edit $(objects)
    上面看到,为了少些点*.o文件名,使用了宏定义,而且后面*.o文件也没有为每一个文件写一条命令,这就是Makefile的隐藏规则,它默认为*.o执行了“cc -c *.c 依赖文件”命令,这是Makefile的自动推导,这些很好的简化了Makefile的写法和工作量
4、自动化变量
   $< 规则的第一个依赖文件名
   $@ 所有目标集合
   $^ 规则的所有依赖文件列表,使用空格分隔
   还有其他的,没用到,凡是$开头的基本都是自动化变量,可以自己网上查找资料
5、函数调用
   这个太强到了,调用方法:$()或者${},示例:

       comma:= ,
       empty:=
       space:= $(empty) $(empty)
       foo:= a b c
       bar:= $(subst $(space),$(comma),$(foo))

   在这个示例中,$(comma)的值是一个逗号。$(space)使用了$(empty)定义了一个空格,$(foo)的值是“a b c”,$(bar)的定义用,调用了函数“subst”,这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个参数是替换操作作用的字串。这个函数也就是把$(foo)中的空格替换成逗号,所以$(bar)的值是“a,b,c
   对于其他的函数,在网上有很多列表!
  
阅读(1378) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~