import os, sys target = ARGUMENTS.get( 'target', 'lua' ).lower() cputype = ARGUMENTS.get( 'cpu', '' ).upper() allocator = ARGUMENTS.get( 'allocator', '' ).lower() boardname = ARGUMENTS.get( 'board' , '').upper() # List of platform/CPU combinations cpu_list = { 'at91sam7x' : [ 'AT91SAM7X256', 'AT91SAM7X512' ], 'lm3s' : [ 'LM3S8962', 'LM3S6965' ], 'str9' : [ 'STR912FW44' ], 'i386' : [ 'I386' ], 'lpc288x' : [ 'LPC2888' ], 'str7' : [ 'STR711FR2' ], 'stm32' : [ 'STM32F103ZE' ], 'avr32' : [ 'AT32UC3A0512' ] } # List of board/CPU combinations board_list = { 'SAM7-EX256' : [ 'AT91SAM7X256', 'AT91SAM7X512' ], 'EK-LM3S8962' : [ 'LM3S8962' ], 'EK-LM3S6965' : [ 'LM3S6965' ], 'STR9-COMSTICK' : [ 'STR912FW44' ], 'PC' : [ 'I386' ], 'LPC-H2888' : [ 'LPC2888' ], 'MOD711' : [ 'STR711FR2' ], 'STM3210E-EVAL' : [ 'STM32F103ZE' ], 'ATEVK1100' : [ 'AT32UC3A0512' ] } # Variants: board = # cpu = # board = cpu= if boardname == '' and cputype == '': print "Must specifiy board, cpu, or both" sys.exit( -1 ) elif boardname != '' and cputype != '': # board = cpu= # Check if the board, cpu pair is correct if not board_list.has_key( boardname ): print "Unknown board", boardname sys.exit( -1 ) if not cputype in board_list[ boardname ]: print "Invalid CPU %s for board %s" % ( cputype, boardname ) sys.exit( -1 ) elif boardname != '': # board = # Find CPU if not board_list.has_key( boardname ): print "Unknown board", boardname sys.exit( -1 ) cputype = board_list[ boardname ][ 0 ] else: # cpu = # Find board name for b, v in board_list.items(): if cputype in v: boardname = b break else: print "CPU %s not found" % cputype sys.exit( -1 ) platform = None # Look for the given CPU in the list of platforms for p, v in cpu_list.items(): if cputype in v: platform = p break else: print "Unknown CPU %s" % cputype print "List of accepted CPUs: " for p, v in cpu_list.items(): print " ", p, "-->", for cpu in v: print cpu, print sys.exit( -1 ) # CPU/allocator mapping (if allocator not specified) if allocator == '': if cputype == 'LPC2888': allocator = 'multiple' else: allocator = 'newlib' elif allocator not in [ 'newlib', 'multiple' ]: print "Unknown allocator", allocator print "Allocator can be either 'newlib' or 'multiple'" sys.exit( -1 ) # User report if not GetOption( 'clean' ): print print "*********************************" print "Compiling eLua ..." print "CPU: ", cputype print "Board: ", boardname print "Platform: ", platform print "Allocator: ", allocator print "Target: ", target print "*********************************" print output = 'elua_' + target + '_' + cputype.lower() cdefs = '-DELUA_CPU=%s -DELUA_BOARD=%s -DELUA_PLATFORM=%s -D__BUFSIZ__=128' % ( cputype, boardname, platform.upper() ) if allocator == 'multiple': cdefs = cdefs + " -DUSE_MULTIPLE_ALLOCATOR" # Lua source files and include path lua_files = """lapi.c lcode.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c loslib.c ltablib.c lstrlib.c loadlib.c linit.c lua.c""" if target == 'lualong' or target == 'lua': lua_full_files = " " + " ".join( [ "src/lua/%s" % name for name in lua_files.split() ] ) local_include = "-Iinc -Iinc/newlib -Isrc/lua" if target == 'lualong': cdefs = cdefs + ' -DLUA_NUMBER_INTEGRAL' else: print "Invalid target", target sys.exit( 1 ) local_include = local_include + " -Isrc/modules -Isrc/platform/%s" % platform # Additional libraries local_libs = '' # Application files app_files = " src/main.c src/romfs.c src/xmodem.c src/shell.c src/term.c src/dlmalloc.c src/common.c " # Newlib related files newlib_files = " src/newlib/devman.c src/newlib/stubs.c src/newlib/genstd.c src/newlib/stdtcp.c" # UIP files uip_files = "uip_arp.c uip.c uiplib.c dhcpc.c psock.c resolv.c" uip_files = " src/elua_uip.c " + " ".join( [ "src/uip/%s" % name for name in uip_files.split() ] ) local_include = local_include + " -Isrc/uip" # Lua module files module_names = "disp.c modcommon.c pio.c spi.c tmr.c pd.c uart.c term.c pwm.c lpack.c bit.c net.c cpu.c" module_files = " " + " ".join( [ "src/modules/%s" % name for name in module_names.split() ] ) # Optimizer flags (speed or size) #opt = "-O3" opt = "-Os -fomit-frame-pointer" # Toolset data (filled by each platform in part) tools = {} # We get platform-specific data by executing the platform script execfile( "src/platform/%s/conf.py" % platform ) # Complete file list source_files = app_files + specific_files + newlib_files + uip_files + lua_full_files + module_files # Make filesystem first if not GetOption( 'clean' ): print "Building filesystem..." import mkfs mkfs.mkfs( "romfs", "romfiles" ) print os.system( "mv -f romfiles.h inc/" ) os.system( "rm -f src/fs.o" ) # Env for building the program comp = Environment( CCCOM = tools[ platform ][ 'cccom' ], ASCOM = tools[ platform ][ 'ascom' ], LINKCOM = tools[ platform ][ 'linkcom' ], OBJSUFFIX = ".o", PROGSUFFIX = ".elf", ENV = os.environ ) # comp.TargetSignatures( 'content' ) # comp.SourceSignatures( 'MD5' ) Default( comp.Program( output, Split( source_files ) ) ) Decider( 'MD5' ) # Programming target prog = Environment( BUILDERS = { 'program' : Builder( action = Action ( tools[ platform ][ 'progfunc' ] ) ) }, ENV = os.environ ) prog.program( "prog", output + ".elf" )