Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530911
  • 博文数量: 102
  • 博客积分: 2146
  • 博客等级: 大尉
  • 技术积分: 1146
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-09 17:32
文章分类

全部博文(102)

文章存档

2015年(14)

2014年(24)

2013年(5)

2012年(30)

2011年(16)

2010年(13)

分类: LINUX

2010-11-03 15:34:14

###############################################################################
# Copyright (c) 2008 Montage Tech - All Rights Reserved
# Owner: Yongmin Du
#         Michael Qiu
###############################################################################
#
# make options:
# prj=[test]                Currently, we only support test project. If no prj
#                           setted in command line, Makefile will read the
#                           default project value stored in config.mk
# arch=[x86|ckcore|mips]    Override the default value set in platform.mk, if
#                           current one is not the same as previous one, system
#                           automatically remove "obj" and "out" before compile.
# debug=[1|0]               Override the default debug flag in platform.mk
# unit=[1|0]                Override the default unit flag in platform.mk
# test_mode=[0|1|2]         Override the defualt test_mode flag platform.mk
#                           0 means automated test. If the arch is x86, System
#                           will stick this option to 0 nomatterwhat you set on
#                           command line.
#                           1 means basic mode
#                           2 means console mode
# cunit_self_test=[0|1]     override the default self_test flag in platform.mk
# clean                     clear object files and .bin .elf and .map files
# out                       Output the .bin .elf and .map files in "out" folder
# superclean                Remove "out" and "obj" folder.
###############################################################################
# Top Directory
###############################################################################
TOPDIR = .$(shell pwd | sed 's/\(.*\)\/wizards\(.*\)/\2/g' \
         |sed 's/\/[0-9a-zA-Z]*/\/../g')

prjtype = dvbs

DEFAULTPRJ = "prj = $(prj)"

-include $(TOPDIR)/config/$(prj)/$(prj).mk

###############################################################################
# Build Relative Directories
###############################################################################
OUTDIR = $(TOPDIR)/out/$(prj)/$(arch)
OBJDIR = $(TOPDIR)/obj/$(prj)/$(arch)
LIBDIR = $(TOPDIR)/lib/$(arch)
BINDIR = $(TOPDIR)/config/$(prj)/binary
TOOLS = $(TOPDIR)/tools
INFO = $(OUT)/info
BIN  = $(OUTDIR)/bin
OBJPATH = $(OBJDIR)$(shell pwd | sed 's/\(.*\)\/wizards\(.*\)/\2/g')

###############################################################################
# Tool Chain
###############################################################################

CROSS = mips-elf-

AS    = $(CROSS)as
CC    = $(CROSS)gcc
LD    = $(CROSS)ld
AR    = $(CROSS)ar
OD    = $(CROSS)objdump
OC    = $(CROSS)objcopy
GS    = $(CROSS)gasp
NM    = $(CROSS)nm
RD    = $(CROSS)readelf
STRIP = $(CROSS)strip
SIZE  = $(CROSS)size
LIBTOOL = $(CROSS)libtool

CAT   = cat
LS    = ls
XARGS = xargs
RM    = rm
CP    = cp
MKDIR = mkdir
ECHO  = echo
SED   = sed
FIND  = find

MAKE= make

tmpword = $(addprefix +,$@)
keyword = $(addsuffix +,$(tmpword))
dirword = $(shell pwd | sed 's/\(.*\)\/wizards\(.*\)/\2/g')/$@
objpath = $(shell pwd | sed 's/\(.*\)\/wizards\(.*\)/\2/g')
objword = $(objpath)/$*.c
objall  = $(objpath)/*
objnull  = $(objpath)/!

LIBINC = /usr/local/mips-elf/mips-elf/include/
GCCINC = /usr/local/mips-elf/lib/gcc/mips-elf/4.1.1/include

HOSTOS = $(shell uname -o)
ifeq "$(HOSTOS)" "GNU/Linux"
    MKIMG = $(TOOLS)/mkimg_mips
    ANCHOR = $(TOOLS)/anchor/anchor
    LZMA = lzma
else
    MKIMG = $(TOOLS)/mkimg_mips.exe
    ANCHOR = $(TOOLS)/anchor/anchor.exe
    LZMA = $(TOOLS)/lzma.exe
endif


version = 0
###############################################################################
# Build Options
###############################################################################
INC= -I$(LIBINC) -I$(GCCINC) $(LOCALINC)

OPTIMIZE_DEFINES = -O$(optimize)

MACRODEF += -DARCH=MIPS

ifeq "$(magic)" "1"
  MACRODEF += -DCHIP_MAGIC
endif

ifeq "$(MIPS32FLAG)" "TRUE"
    MIPS16FLAG =
endif

ifeq "$(OPTIFLAG)" "TRUE"
    OPTIMIZE_DEFINES = -O$(OPTIOPTION)
endif

LD_FILE ?= $(TOPDIR)/link_mips.ld

CFLAGS ?= $(INC) $(MACRODEF) $(OPTIMIZE_DEFINES) $(DEBUG_DEFINES)          \
         -G0 -EL -mips1 -Wa,-xgot -nostartfiles -nodefaultlibs -Wall          \
          -Wno-pointer-sign $(MIPS16FLAG) -Werror -msoft-float                  \
         -ffunction-sections
AFLAGS ?= -EL -mips1
LDFLAGS ?= --oformat elf32-littlemips -gc-sections -T$(LD_FILE) -L$(LIBDIR)


###############################################################################
# Build Targets
###############################################################################
    
.PHONY: all
all: PREBUILD $(patsubst %,$(OBJPATH)/%, $(OBJS)) $(SUBDIRS)

.PHONY: dbg
dbg: all AFTERBUILD
    @$(ECHO) $(LDFLAGS) -o $(OUTDIR)/wizards.elf > $(OBJDIR)/.link.tmp
    @$(CP) $(LIBDIR)/new.o $(OBJDIR)
    @$(FIND) $(OBJDIR) -name "*.o" -type f -print |sort -d >> $(OBJDIR)/.link.tmp
    @$(ECHO) -lm -lc -lgcc >> $(OBJDIR)/.link.tmp
    @$(CAT) $(OBJDIR)/.link.tmp | $(XARGS) $(LD) -M > $(OUTDIR)/wizards.map
    @mips-elf-objdump -x -D --source $(OUTDIR)/wizards.elf \
    >$(OUTDIR)/wizard_full.s
    @$(SED) 's/-.*$$//g' $(OBJDIR)/.link.tmp | $(XARGS) $(SIZE) \
    > $(OUTDIR)/wizards.siz
    @$(SIZE) $(OUTDIR)/wizards.elf >> $(OUTDIR)/wizards.siz
    @$(ECHO) Build with optimize=$(OPTIMIZE_DEFINES) \
    debug=$(debug) unit=$(unit) >> $(OUTDIR)/wizards.siz
ifeq "$(debug)" "0"
    @-$(RM) -f $(OUTDIR)/wizards.dbg
else
    $(CP) $(OUTDIR)/wizards.elf $(OUTDIR)/wizards.dbg
endif
    @$(STRIP) $(OUTDIR)/wizards.elf
    @mips-elf-objdump -Dz $(OUTDIR)/wizards.elf >$(OUTDIR)/wizard_strip.s
    @$(OC) -O binary $(OUTDIR)/wizards.elf $(OUTDIR)/wizards.bin
   
   
.PHONY: out   
out: dbg HANDLE_OUTPUT   
    @$(RM) -f $(OBJDIR)/.link.tmp
    @$(ECHO) Build done

PREBUILD:
ifeq "$(MAKELEVEL)" "0"
    @$(ECHO) Build with \"prj=$(prj) arch=$(arch) mips16=$(mips16) cache=$(cache) optimize=$(optimize) assert=$(assert) print=$(print) \
    debug=$(debug) test_mode=$(test_mode) cunit_self_test=$(cunit_self_test) bootloader=$(bootloader)\"
    -@$(MKDIR) -p $(OUTDIR)
    -@$(MKDIR) -p $(OBJDIR)
endif

.PHONY: $(SUBDIRS)

ifneq "$(strip $(SUBDIRS))" ""
$(SUBDIRS):
    $(if $(findstring $(dirword),$(MODGROUP)),@$(ECHO) "Enter $(findstring $(dirword),$(MODGROUP)")")
    $(if $(findstring $(dirword),$(MODGROUP)),@$(MAKE) -C $@ all)   
endif

.PHONY: clean superclean
SUBDIRS_CLEAN = $(patsubst %,%_clean,$(SUBDIRS))
clean:
    $(RM) -rf $(TOPDIR)/obj/$(prj)

$(SUBDIRS_CLEAN):
    @$(MAKE) -C $(patsubst %_clean,%,$@) clean unit=1

superclean:
    $(RM) -rf $(TOPDIR)/obj $(TOPDIR)/out

###############################################################################
# Pattern Rules.
###############################################################################

define compiling-obj
@$(ECHO) "Generating $(OBJPATH)/$*.d ..."
@$(ECHO) "Compiling $< ..."
@$(CC) -c $(CFLAGS) -o $@ $<
endef

.SUFFIXES : .o .c .s .d

-include $(OBJS:%.o=$(OBJPATH)/%.d)

$(OBJPATH)/cache.o: $(TOPDIR)/src/hal/arch/mips/cache.s
    -@$(MKDIR) -p $(OBJPATH)
    $(CC) -mips32 -O0 -EL -nostartfiles -nodefaultlibs -Wall -c -o $@ $<

$(OBJPATH)/%.o: %.s
    -@$(MKDIR) -p $(OBJPATH)
    @$(ECHO) '['$<']'
    @$(AS) $(AFLAGS) -o $@ $<

$(OBJPATH)/%.o: %.c
    -@$(MKDIR) -p $(OBJPATH)
    $(CC) -MM $(CFLAGS) $< > $(OBJPATH)/$*.p
    @$(SED) -e 's#^$*#$(OBJPATH)/$*#' < $(OBJPATH)/$*.p > $(OBJPATH)/$*.d
    @$(SED) -e 's#^$*#$(OBJPATH)/$*#' -e 's/#.*//' -e 's/^[^:]*: *//' \
          -e 's/ *\\$$//' -e '/^$$/ d' -e 's/$$/ :/' \
          < $(OBJPATH)/$*.p >> $(OBJPATH)/$*.d
    @$(RM) -f $(OBJPATH)/$*.p
    $(if $(findstring $(objall),$(MODGROUP)), $(compiling-obj), \
    $(if $(findstring $(objword),$(MODGROUP)),$(compiling-obj)))   

$(TOPDIR)/config.mk: $(TOPDIR)/default.mk
    $(ECHO) $(DEFAULTPRJ) > $@


 
阅读(1337) | 评论(0) | 转发(0) |
0

上一篇:高阻态

下一篇:Makefile

给主人留下些什么吧!~~