Chinaunix首页 | 论坛 | 博客
  • 博客访问: 27797
  • 博文数量: 22
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 12:40
文章分类

全部博文(22)

文章存档

2012年(22)

我的朋友
最近访客

分类:

2012-09-24 12:45:16

   在make命令后,一般要跟一个目标的名字,如果没有,make就去寻找Makefile中定义的第一个目标,通常这个名字是all。那么我们首先找到目标all。
 50 all:    do-it-all
 51
 52 ifeq (.config,$(wildcard .config))
    #.config存在,进入
 53 include .config
 54 else
 55 CONFIGURATION = config
 56 do-it-all:      config
 57 endif
 58 do-it-all:      Version vivi



   从上图可以看到,all依赖于do-it-all,接下来则判断.config是否存在,如果不存在,do-it-all则依赖于config,此时 make 就变成make config了。make config的情景我们已经分析过了,在此不再讨论。我们讨论.config存在的情况,此时do-it-all依赖Version vivi。由于vivi目标相对Version更加重要,我们先看vivi。找vivi的依赖,一路找下去。
117 vivi: include/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
118         #LINKFLAGS = -Tarch/vivi.lds -Bstatic
119         #include arch/Makefile HEAD
120         #HEAD:=arch/$(MACHINE)/head.o
121         #CORE_FILES=init/main.o init/version.o lib/lib.o
122         #DRIVERS-y :=
123         #DRIVERS-$(CONFIG_SERIAL) += drivers/serial/serial.o
124         #DRIVERS-$(CONFIG_MTD) += drivers/mtd/mtd.o
125         #DRIVERS := $(DRIVERS-y)
126         #LIBS := lib/priv_data/priv_data.o
127         #":="和"="的区别?
128         #.S-->.s-->.o-->elf
129         #.c-->.i-->.s-->.o-->elf
130         $(LD) -v $(LINKFLAGS) \
131                 $(HEAD) \
132                 $(CORE_FILES) \
133                 $(DRIVERS) \
134                 $(LIBS) \
135                 -o vivi-elf $(CLIBS)
136         $(NM) -v -l vivi-elf > vivi.map
137         $(OBJCOPY) -O binary -S vivi-elf vivi $(OBJCOPYFLAGS)

   171行,我们可以看到vivi的第一个依赖是include/version.h,同时它作为一个目标,还可以再分。如下所示:
191 include/version.h:
192         @echo \#define VIVI_RELEASE \"$(VIVIRELEASE)\" > .ver
193         @echo \#define VIVI_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver
194         @echo '#define VIVI_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >>.ver
195         @mv -f .ver $@
   vivi的第2,3个依赖是init/main.o,init/version.o。这两个还可以再分吗?我们在Makefile包含的 Rules.make中找到依赖。它们分别依赖init/main.c init/version.c,且不可再分,那么可以执行下面的命令$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -c -o $@ $<,生成init/main.o,init/version.o。
 56 %.o: %.c
 57         $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -c -o $@ $<
 58         @ ( \
 59             echo 'ifeq ($(strip $(subst $(comma),:,$(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@))),$$(strip $$(subst $$(comma),:,    $$(CFLAGS) $$(EXTRA_CFLAGS) $$(CFLAGS_$@))))' ; \
 60             echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
 61             echo 'endif' \
 62         ) > $(dir $@)/.$(notdir $@).flags
阅读(320) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~