Chinaunix首页 | 论坛 | 博客
  • 博客访问: 202963
  • 博文数量: 47
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-04 13:34
文章分类

全部博文(47)

文章存档

2011年(1)

2009年(5)

2008年(41)

我的朋友

分类: LINUX

2008-06-22 23:58:16

  
  7 #.PHONY目标表明不需要真正创建一个名字为“dummy”的文件
  8 .PHONY: dummy

177 # A rule to do nothing
    # 空规则,不需要任何动作,定义dummy的主要目的是之执行dummy下的命令
   
# 例如 A: dummy
    #          do some thing
    # 在执行make A时将直接执行“do some thing”
179 dummy:

 34 #
 35 # Get things started.
 36 #
    # 真正的执行从这里开始
 37 first_rule: sub_dirs
 38         $(MAKE) all_targets

    # SUB_DIRS        := $(subdir-y)
133 subdir-list = $(sort $(patsubst %,_subdir_%,$(SUB_DIRS)))
134 sub_dirs: dummy $(subdir-list)

136 ifdef SUB_DIRS
137 $(subdir-list) : dummy
138         $(MAKE) -C $(patsubst _subdir_%,%,$@)
139 endif

 80 all_targets: $(O_TARGET) $(L_TARGET)
 83 # Rule to compile a set of .o files into one .o file
 85 ifdef O_TARGET
 86 $(O_TARGET): $(obj-y)
 87         rm -f $@
 88     ifneq "$(strip $(obj-y))" ""
            #如果$(obj-y)不为空,则进行连接
 89         $(LD) $(EXTRA_LDFLAGS) -r -o $@ $(filter $(obj-y), $^)
 90     else
            #如果$(obj-y)为空,则创建一个名字为$(O_TARGET)的空目标文件
 91         $(AR) rcs $@
 92     endif
 93         @ ( \
 94             echo 'ifeq ($(strip $(subst $(comma),:,$(EXTRA_LDFLAGS) $(obj-y))),$$(strip $$(subst $$(comma),:,$$(EXTRA_LDFL    AGS) $$(obj-y))))' ; \
 95             echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
 96             echo 'endif' \
 97         ) > $(dir $@)/.$(notdir $@).flags
 98 endif

   Rules.make首先定义了一个不需要创建真实文件的空规则"dummy",具体解释看上面的注释。由于".PHONY"是一个空规则,因此真正的目标是从"first_rule:"开始的。
   "first_rule:"依赖"sub_dirs",而"sub_dirs"又依赖"dummy $(subdir-list)","dummy"是空规则,不管;"$(subdir-list)"则和宏"SUB_DIRS"有关。在本例中,
"subdir-y        := priv_data",那么,“subdir-list”则为"_subdir_priv_data"。由于“subdir-list”依赖"dummy"。因此直接执行下面的命令:"$(MAKE) -C $(patsubst _subdir_%,%,$@)","$(patsubst _subdir_%,%,$@)"为"priv_data"。这样实现了执行子目录的Makefile了。
   接下来我们看"first_rule: sub_dirs"下面的命令:"$(MAKE) all_targets"
   "all_targets"依赖于"$(O_TARGET) $(L_TARGET)"本例中,"$(O_TARGET)"定义为"lib.o","$(O_TARGET)"依赖"$(obj-y)","$(obj-y)"的具体实现则在"Rules.make"中"Common rules"有定义。"$(O_TARGET)"的下面的命令可以参照上面的注释。
   这样lib字母下的Makefile就执行完毕了。回到根目录下的Make文件,我们就剩下最后一步了:

$(LD) -v $(LINKFLAGS) \
                $(HEAD) \
                $(CORE_FILES) \
                $(DRIVERS) \
                $(LIBS) \
                -o vivi-elf $(CLIBS)
        $(NM) -v -l vivi-elf > vivi.map
        $(OBJCOPY) -O binary -S vivi-elf vivi $(OBJCOPYFLAGS)


阅读(2049) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~