############################################################################ # arch/z80/src/Makefile.sdcc # # Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. # Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # 3. Neither the name NuttX nor the names of its contributors may be # used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # ############################################################################ ############################################################################ # Tools # CFLAGS, CPPFLAGS, ASFLAGS, LDFLAGS are set in $(TOPDIR)/Make.defs CFLAGS += -I$(ARCH_SRCDIR)/chip -I$(ARCH_SRCDIR)/common -I$(TOPDIR)/sched CPPFLAGS += -D__ASSEMBLY__ ############################################################################ # Files and directories # There should be one head source (.asm file) HEAD_OBJ = $(HEAD_ASRC:$(ASMEXT)=$(OBJEXT)) # Assembly sources and objects ASRCS = $(CHIP_ASRCS) $(CMN_ASRCS) AOBJS = $(ASRCS:$(ASMEXT)=$(OBJEXT)) # C sources and objects CSRCS = $(CHIP_CSRCS) $(CMN_CSRCS) COBJS = $(CSRCS:.c=$(OBJEXT)) # All sources and objcts SRCS = $(ASRCS) $(CSRCS) OBJS = $(AOBJS) $(COBJS) # Sources that can have dependencies (no .asm files) DEPSRCS = $(CSRCS) # Directories ARCH_SRCDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src BOARDDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src/board VPATH = chip:common:board # Libraries LIBGCC = ${shell $(CC) -print-libgcc-file-name} # Supports dynamic sizing of HEAP. # HEAP_BASE = ${shell ./mkhpbase.sh} ############################################################################ # Targets all: $(HEAD_OBJ) libarch$(LIBEXT) $(AOBJS) $(HEAD_OBJ): %$(OBJEXT): %$(ASMEXT) $(call ASSEMBLE, $<, $@) $(COBJS): %$(OBJEXT): %.c $(call COMPILE, $<, $@) # This is a kludge to work around some conflicting symbols in libsdcc.liXqueb $(SDCCLIBDIR)/myz80.lib: $(SDCCLIBDIR)/$(SDCCLIB) @cat $(SDCCLIBDIR)/$(SDCCLIB) | \ grep -v alloc | grep -v free | grep -v printf | \ grep -v _str | grep -v _mem | grep -v crt0\.o \ > myz80.lib @sudo mv -f myz80.lib $(SDCCLIBDIR)/myz80.lib # Create a header file that contains addressing information needed by the code up_mem.h: @echo "#ifndef __UP_MEM_H" >up_mem.h @echo "#define __UP_MEM_H" >>up_mem.h @echo "" >>up_mem.h @echo "#include " >>up_mem.h @echo "" >>up_mem.h @echo "#define CONFIG_STACK_END $(CONFIG_DRAM_SIZE)" >> up_mem.h @echo "#define CONFIG_STACK_BASE (CONFIG_STACK_END - $(CONFIG_IDLETHREAD_STACKSIZE))" >> up_mem.h @echo "#define CONFIG_HEAP1_END CONFIG_STACK_BASE" >> up_mem.h @echo "#define CONFIG_HEAP1_BASE $(HEAP_BASE)" >> up_mem.h @echo "" >>up_mem.h @echo "#endif /* __UP_MEM_H */" >>up_mem.h asm_mem.h: @echo " CONFIG_COMPILER_OTHER == 0" > asm_mem.h @echo " CONFIG_COMPILER_SDCC == 1" >> asm_mem.h ifeq ($(CC),sdcc) @echo " CONFIG_COMPILER == 1" >> asm_mem.h else @echo " CONFIG_COMPILER == 0" >> asm_mem.h endif @echo " CONFIG_STACK_END == ($(CONFIG_DRAM_SIZE) - 1)" >> asm_mem.h @echo " CONFIG_STACK_BASE == (CONFIG_STACK_END - $(CONFIG_IDLETHREAD_STACKSIZE))" >> asm_mem.h @echo " CONFIG_HEAP1_END == (CONFIG_STACK_END - $(CONFIG_IDLETHREAD_STACKSIZE) - 1)" >> asm_mem.h @echo " CONFIG_HEAP1_BASE == $(HEAP_BASE)" >> asm_mem.h # Combine all objects in this directory into a library libarch$(LIBEXT): up_mem.h asm_mem.h $(OBJS) @( for obj in $(OBJS) ; do \ $(call ARCHIVE, $@, $${obj}); \ done ; ) # This builds the libboard library in the board/ subdirectory board/libboard$(LIBEXT): @$(MAKE) -C board TOPDIR="$(TOPDIR)" libboard$(LIBEXT) EXTRADEFINES=$(EXTRADEFINES) # This target builds the final executable pass1.ihx: up_mem.h asm_mem.h $(SDCCLIBDIR)/myz80.lib $(HEAD_OBJ) board/libboard$(LIBEXT) @echo "LD: pass1.ihx" @echo "--" >pass1.lnk # Non-interactive @echo "-k $(BOARDDIR)" >>pass1.lnk # Path to board library @echo "-k $(SDCCLIBDIR)" >>pass1.lnk # Path to SDCC z80 library @echo "-l libboard$(LIBEXT)" >>pass1.lnk # Name of board library @for LIB in $(LINKLIBS); do \ echo "-l $(TOPDIR)/$$LIB" >> pass1.lnk ;\ done @echo "-l myz80.lib" >>pass1.lnk # Name of SDCC z80 library ifneq ($(CONFIG_LINKER_START_AREA),) @echo "-b START=$(CONFIG_LINKER_START_AREA)" >>pass1.lnk # Start of START area else @echo "-b START=0" >>pass1.lnk # Start of START area endif ifneq ($(CONFIG_LINKER_CODE_AREA),) @echo "-b _CODE=$(CONFIG_LINKER_CODE_AREA)" >>pass1.lnk # Start of _CODE area else @echo "-b _CODE=256" >>pass1.lnk # Start of _CODE area endif @echo "-i" >>pass1.lnk # Intel hex format @echo "-x" >>pass1.lnk # Hexadecimal @echo "-m" >>pass1.lnk # Generate a map file @echo "-j" >>pass1.lnk # Generate a symbol file @echo "pass1.ihx" >>pass1.lnk # Path to head object @echo "$(HEAD_OBJ)" >>pass1.lnk # Path to head object @echo "-e" >>pass1.lnk # End of script @$(LD) -f pass1.lnk @rm -f up_mem.h asm_mem.h @rm -f up_allocateheap$(OBJEXT) $(HEAD_OBJ) libarch$(LIBEXT) @$(MAKE) TOPDIR="$(TOPDIR)" libarch$(LIBEXT) @$(MAKE) TOPDIR="$(TOPDIR)" $(HEAD_OBJ) nuttx.ihx: up_mem.h asm_mem.h $(SDCCLIBDIR)/myz80.lib $(HEAD_OBJ) board/libboard$(LIBEXT) @echo "LD: nuttx.ihx" @echo "--" >nuttx.lnk # Non-interactive @echo "-k $(BOARDDIR)" >>nuttx.lnk # Path to board library @echo "-k $(SDCCLIBDIR)" >>nuttx.lnk # Path to SDCC z80 library @echo "-l libboard$(LIBEXT)" >>nuttx.lnk # Name of board library @for LIB in $(LINKLIBS); do \ echo "-l $(TOPDIR)/$$LIB" >> nuttx.lnk ;\ done @echo "-l myz80.lib" >>nuttx.lnk # Name of SDCC z80 library ifneq ($(CONFIG_LINKER_START_AREA),) @echo "-b START=$(CONFIG_LINKER_START_AREA)" >>nuttx.lnk # Start of START area else @echo "-b START=0" >>nuttx.lnk # Start of START area endif ifneq ($(CONFIG_LINKER_CODE_AREA),) @echo "-b _CODE=$(CONFIG_LINKER_CODE_AREA)" >>nuttx.lnk # Start of _CODE area else @echo "-b _CODE=256" >>nuttx.lnk # Start of _CODE area endif @echo "-i" >>nuttx.lnk # Intel hex format @echo "-x" >>nuttx.lnk # Hexadecimal @echo "-m" >>nuttx.lnk # Generate a map file @echo "-j" >>nuttx.lnk # Generate a symbol file @echo "nuttx.ihx" >>nuttx.lnk # Path to head object @echo "$(HEAD_OBJ)" >>nuttx.lnk # Path to head object @echo "-e" >>nuttx.lnk # End of script @$(LD) -f nuttx.lnk nuttx$(EXEEXT): pass1.ihx nuttx.ihx @rm -f pass1.* @cp -f nuttx.map $(TOPDIR)/. ifeq ($(EXEEXT),.cmd) sed s/:00000001FF/:00520001AD/ nuttx.ihx | \ hex2cmd > $(TOPDIR)/nuttx.cmd else @packihx nuttx.ihx > $(TOPDIR)/nuttx$(EXEEXT) endif # This is part of the top-level export target export_head: board/libboard$(LIBEXT) $(HEAD_OBJ) @if [ -d "$(EXPORT_DIR)/startup" ]; then \ cp -f $(HEAD_OBJ) "$(EXPORT_DIR)/startup"; \ else \ echo "$(EXPORT_DIR)/startup does not exist"; \ exit 1; \ fi # Build dependencies .depend: Makefile up_mem.h asm_mem.h chip/Make.defs $(DEPSRCS) @if [ -e board/Makefile ]; then \ $(MAKE) -C board TOPDIR="$(TOPDIR)" depend ; \ fi @$(MKDEP) --dep-path chip --dep-path common $(CC) -- $(CFLAGS) -- $(DEPSRCS) >Make.dep @touch $@ depend: .depend clean: @if [ -e board/Makefile ]; then \ $(MAKE) -C board TOPDIR="$(TOPDIR)" clean ; \ fi @rm -f libarch$(LIBEXT) up_mem.h asm_mem.h pass1.* nuttx.* *~ .*.swp $(call CLEAN) distclean: clean @if [ -e board/Makefile ]; then \ $(MAKE) -C board TOPDIR="$(TOPDIR)" distclean ; \ fi @rm -f Make.dep .depend -include Make.dep