From ea64e2b7d3128120394011b58e07a2483efb0a00 Mon Sep 17 00:00:00 2001 From: James Snyder Date: Mon, 10 May 2010 23:05:55 +0000 Subject: [PATCH] Use more of SCons handling for adding preprocessor defines & validation. --- SConstruct | 228 ++++++++++++++++++----------------- src/platform/lpc17xx/conf.py | 15 ++- 2 files changed, 126 insertions(+), 117 deletions(-) diff --git a/SConstruct b/SConstruct index 5ecee0ad..8baee3f6 100644 --- a/SConstruct +++ b/SConstruct @@ -1,6 +1,5 @@ import os, sys, shutil, string - # Helper: "normalize" a name to make it a suitable C macro name def cnorm( name ): name = name.replace( '-', '' ) @@ -147,7 +146,57 @@ file_list = { 'SAM7-EX256' : [ 'bisect', 'hangman' , 'led', 'piano', 'hello', 'i 'MBED' : [ 'bisect', 'hangman', 'hello', 'info', 'led', 'pwmled', 'dualpwm', 'life' ], } -comp = Environment( OBJSUFFIX = ".o", PROGSUFFIX = ".elf", ENV = os.environ ) +# define terminal colors +colors = {} +colors['cyan'] = '\033[96m' +colors['purple'] = '\033[95m' +colors['blue'] = '\033[94m' +colors['green'] = '\033[92m' +colors['yellow'] = '\033[93m' +colors['red'] = '\033[91m' +colors['end'] = '\033[0m' + +#If the output is not a terminal, remove the colors +if not sys.stdout.isatty(): + for key, value in colors.iteritems(): + colors[key] = '' + +compile_source_message = '%sCompiling %s==> %s$SOURCE%s' % \ + (colors['blue'], colors['purple'], colors['yellow'], colors['end']) + +compile_shared_source_message = '%sCompiling shared %s==> %s$SOURCE%s' % \ + (colors['blue'], colors['purple'], colors['yellow'], colors['end']) + +link_program_message = '%sLinking Image %s==> %s$TARGET%s' % \ + (colors['red'], colors['purple'], colors['yellow'], colors['end']) + +link_library_message = '%sLinking Static Library %s==> %s$TARGET%s' % \ + (colors['red'], colors['purple'], colors['yellow'], colors['end']) + +ranlib_library_message = '%sRanlib Library %s==> %s$TARGET%s' % \ + (colors['red'], colors['purple'], colors['yellow'], colors['end']) + +link_shared_library_message = '%sLinking Shared Library %s==> %s$TARGET%s' % \ + (colors['red'], colors['purple'], colors['yellow'], colors['end']) + +java_library_message = '%sCreating Java Archive %s==> %s$TARGET%s' % \ + (colors['red'], colors['purple'], colors['yellow'], colors['end']) + + +comp = Environment( OBJSUFFIX = ".o", + PROGSUFFIX = ".elf", + ENV = os.environ, + CPPDEFINES = {}, + CXXCOMSTR = compile_source_message, + CCCOMSTR = compile_source_message, + SHCCCOMSTR = compile_shared_source_message, + SHCXXCOMSTR = compile_shared_source_message, + ARCOMSTR = link_library_message, + RANLIBCOMSTR = ranlib_library_message, + SHLINKCOMSTR = link_shared_library_message, + LINKCOMSTR = link_program_message, + JARCOMSTR = java_library_message, + JAVACCOMSTR = compile_source_message ) # Replacement for standard EnumVariable functionality to derive case from original list class InsensitiveString(object): @@ -176,59 +225,42 @@ def MatchEnumVariable(key, help, default, allowed_values, map={}): # Add Configurable Variables vars = Variables('build-setup.conf') -vars.Add(MatchEnumVariable('target', - 'build "regular" float lua or integer-only "lualong"', - 'lua', - allowed_values = ['lua','lualong'])) - -vars.Add(MatchEnumVariable('cpu', - 'build for the specified CPU (board will be inferred, if possible)', - 'auto', - allowed_values = cpu_list + ['auto'])) - -vars.Add(MatchEnumVariable('allocator', - 'select memory allocator', - 'auto', - allowed_values=['newlib','multiple','simple','auto'])) - -vars.Add(MatchEnumVariable('board', - 'selects board for target (cpu will be inferred)', - 'auto', - allowed_values=board_list.keys() + ['auto'])) - -vars.Add(MatchEnumVariable('toolchain', - 'specifies toolchain to use (if unset, will scan for working, compatible toolchain', - 'auto', - allowed_values=toolchain_list.keys() + ['auto'])) - -vars.Add(BoolVariable('optram', - 'enables Lua Tiny RAM enhancements', - True)) - -vars.Add(MatchEnumVariable('boot', - 'boot mode, standard will boot to shell, luarpc boots to an rpc server', - 'standard', - allowed_values=['standard','luarpc'])) - -vars.Add(MatchEnumVariable('romfs', - 'ROMFS compilation mode', - 'verbatim', - allowed_values=['verbatim', 'compress', 'compiled'])) +vars.AddVariables(MatchEnumVariable('target', + 'build "regular" float lua or integer-only "lualong"', + 'lua', + allowed_values = [ 'lua', 'lualong' ] ), + MatchEnumVariable('cpu', + 'build for the specified CPU (board will be inferred, if possible)', + 'auto', + allowed_values = cpu_list + [ 'auto' ] ), + MatchEnumVariable('allocator', + 'select memory allocator', + 'auto', + allowed_values=[ 'newlib', 'multiple', 'simple', 'auto' ] ), + MatchEnumVariable('board', + 'selects board for target (cpu will be inferred)', + 'auto', + allowed_values=board_list.keys() + [ 'auto' ] ), + MatchEnumVariable('toolchain', + 'specifies toolchain to use (auto=search for usable toolchain)', + 'auto', + allowed_values=toolchain_list.keys() + [ 'auto' ] ), + BoolVariable( 'optram', + 'enables Lua Tiny RAM enhancements', + True ), + MatchEnumVariable('boot', + 'boot mode, standard will boot to shell, luarpc boots to an rpc server', + 'standard', + allowed_values=[ 'standard' , 'luarpc' ] ), + MatchEnumVariable('romfs', + 'ROMFS compilation mode', + 'verbatim', + allowed_values=[ 'verbatim' , 'compress', 'compiled' ] ) ) vars.Update(comp) -Help(vars.GenerateHelpText(comp)) vars.Save('build-setup.conf', comp) -# target = ARGUMENTS.get( 'target', 'lua' ).lower() -# cputype = ARGUMENTS.get( 'cpu', '' ).upper() -# allocator = ARGUMENTS.get( 'allocator', '' ).lower() -# board = ARGUMENTS.get( 'board' , '').upper() -# toolchain = ARGUMENTS.get( 'toolchain', '') -# optram = int( ARGUMENTS.get( 'optram', '1' ) ) -# boot = ARGUMENTS.get( 'boot', '').lower() -# romfsmode = ARGUMENTS.get( 'romfs', 'verbatim' ).lower() - if not GetOption( 'help' ): conf = Configure(comp) @@ -240,20 +272,12 @@ if not GetOption( 'help' ): print "Must specifiy board, cpu, or both" Exit( -1 ) elif comp['board'] != 'auto' and comp['cpu'] != 'auto': - # board = cpu= # Check if the board, cpu pair is correct - if not board_list.has_key( comp['board'] ): - print "Unknown board", comp['board'] - Exit( -1 ) if not comp['cpu'] in board_list[ comp['board'] ]: print "Invalid CPU %s for board %s" % ( comp['cpu'], comp['board'] ) Exit( -1 ) elif comp['board'] != 'auto': - # board = # Find CPU - if not board_list.has_key( comp['board'] ): - print "Unknown board", comp['board'] - Exit( -1 ) comp['cpu'] = board_list[ comp['board'] ][ 0 ] else: # cpu = @@ -280,7 +304,7 @@ if not GetOption( 'help' ): for cpu in v[ 'cpus' ]: print cpu, print - sys.exit( -1 ) + Exit( -1 ) # Check the toolchain if comp['toolchain'] != 'auto': @@ -289,40 +313,25 @@ if not GetOption( 'help' ): Exit( -1 ) toolset = toolchain_list[ comp['toolchain'] ] else: - for toolchain in platform_list[ platform ]['toolchains']: - comp['CC'] = toolchain_list[ toolchain ][ 'compile' ] - if conf.CheckCC(): - comp['toolchain'] = toolchain + # if 'auto' try to match a working toolchain with target + usable_chains = [toolchain_list[ toolchain ][ 'compile' ] for toolchain in platform_list[ platform ]['toolchains']] + comp['CC'] = comp.Detect( usable_chains ) + if comp['CC']: + comp['AS'] = toolchain_list[ toolchain ][ 'asm' ] + comp['toolchain'] = platform_list[ platform ]['toolchains'][usable_chains.index(comp['CC'])] toolset = toolchain_list[ comp['toolchain'] ] - break - - if comp['toolchain'] == 'auto': - print "No available, compatible toolchain found" + else: + print "Unable to find usable toolchain in your path." + print "List of accepted toolchains (for %s):" % ( comp['cpu'] ) + print ', '.join(usable_chains) Exit( -1 ) - # CPU/allocator mapping (if allocator not specified) if comp['allocator'] == 'auto': if comp['board'] in ['LPC-H2888', 'ATEVK1100', 'MBED']: comp['allocator'] = 'multiple' else: comp['allocator'] = 'newlib' - elif comp['allocator'] not in [ 'newlib', 'multiple', 'simple' ]: - print "Unknown allocator", comp['allocator'] - print "Allocator can be either 'newlib', 'multiple' or 'simple'" - Exit( -1 ) - - # Check boot mode selection - ## if comp['boot'] not in ['standard', 'luarpc']: - ## print "Unknown boot mode: ", comp['boot'] - ## print "Boot mode can be either 'standard' or 'luarpc'" - ## Exit( -1 ); - - # Check romfs mode - if comp['romfs'] not in ['verbatim', 'compile', 'compress']: - print "Unknown romfs mode: ", comp['romfs'] - print "romfs mode can be either 'verbatim', 'compile' or 'compress'" - Exit( -1 ) # Build the compilation command now compcmd = '' @@ -353,36 +362,36 @@ if not GetOption( 'help' ): print output = 'elua_' + comp['target'] + '_' + comp['cpu'].lower() - cdefs = '-DELUA_CPU=%s -DELUA_BOARD=%s -DELUA_PLATFORM=%s -D__BUFSIZ__=128' % ( comp['cpu'], comp['board'], platform.upper() ) + + comp.Append(CPPDEFINES = {'__BUFSIZ__' : 128}) # Also make the above into direct defines (to use in conditional C code) - cdefs = cdefs + " -DELUA_CPU_%s -DELUA_BOARD_%s -DELUA_PLATFORM_%s" % ( cnorm( comp['cpu'] ), cnorm( comp['board'] ), cnorm( platform ) ) + comp.Append(CPPDEFINES = ["ELUA_CPU_" + cnorm( comp['cpu'] ), "ELUA_BOARD_" + cnorm( comp['board'] ), "ELUA_PLATFORM_" + cnorm( platform )]) + if comp['allocator'] == 'multiple': - cdefs = cdefs + " -DUSE_MULTIPLE_ALLOCATOR" + comp.Append(CPPDEFINES = ['USE_MULTIPLE_ALLOCATOR']) elif comp['allocator'] == 'simple': - cdefs = cdefs + " -DUSE_SIMPLE_ALLOCATOR" + comp.Append(CPPDEFINES = ['USE_SIMPLE_ALLOCATOR']) if comp['boot'] == 'luarpc': - cdefs += " -DELUA_BOOT_RPC" + comp.Append(CPPDEFINES = ['ELUA_BOOT_RPC']) # Special macro definitions for the SYM target if platform == 'sim': - cdefs = cdefs + " -DELUA_SIMULATOR -DELUA_SIM_%s" % comp['cpu'] + comp.Append(CPPDEFINES = ['ELUA_SIMULATOR',"ELUA_SIM_" + cnorm( comp['cpu'] ) ] ) # 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 lrotable.c legc.c""" - if comp['target'] == 'lualong' or comp['target'] == 'lua': - lua_full_files = " " + " ".join( [ "src/lua/%s" % name for name in lua_files.split() ] ) - local_include = ['inc', 'inc/newlib', 'inc/remotefs', 'src/lua'] - if comp['target'] == 'lualong': - cdefs = cdefs + ' -DLUA_NUMBER_INTEGRAL' - else: - print "Invalid target", comp['target'] - Exit( 1 ) - local_include += ['src/modules', 'src/platform/%s' % platform] - cdefs = cdefs + " -DLUA_OPTIMIZE_MEMORY=%d" % ( comp['optram'] != 0 and 2 or 0 ) + lua_full_files = " " + " ".join( [ "src/lua/%s" % name for name in lua_files.split() ] ) + + comp.Append(CPPPATH = ['inc', 'inc/newlib', 'inc/remotefs', 'src/lua']) + if comp['target'] == 'lualong': + comp.Append(CPPDEFINES = ['LUA_NUMBER_INTEGRAL']) + + comp.Append(CPPPATH = ['src/modules', 'src/platform/%s' % platform]) + comp.Append(CPPDEFINES = {"LUA_OPTIMIZE_MEMORY" : ( comp['optram'] != 0 and 2 or 0 ) } ) # Additional libraries local_libs = '' @@ -396,11 +405,11 @@ if not GetOption( 'help' ): # 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 += ['src/uip'] + comp.Append(CPPPATH = ['src/uip']) # FatFs files app_files = app_files + "src/elua_mmc.c src/mmcfs.c src/fatfs/ff.c src/fatfs/ccsbcs.c " - local_include += ['src/fatfs'] + comp.Append(CPPPATH = ['src/fatfs']) # Lua module files module_names = "pio.c spi.c tmr.c pd.c uart.c term.c pwm.c lpack.c bit.c net.c cpu.c adc.c can.c luarpc.c bitarray.c elua.c" @@ -411,8 +420,7 @@ if not GetOption( 'help' ): rfs_files = " " + " ".join( [ "src/remotefs/%s" % name for name in rfs_names.split() ] ) # Optimizer flags (speed or size) - #opt = "-O3" - opt = "-Os -fomit-frame-pointer" + comp.Append(CCFLAGS = ['-Os','-fomit-frame-pointer']) #opt += " -ffreestanding" #opt += " -fconserve-stack" # conserve stack at potential speed cost, >=GCC4.4 @@ -423,13 +431,7 @@ if not GetOption( 'help' ): 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 + rfs_files - - # Env for building the program - comp['CCCOM'] = tools[ platform ][ 'cccom' ] - comp['ASCOM'] = tools[ platform ][ 'ascom' ] - comp['LINKCOM'] = tools[ platform ][ 'linkcom' ] - comp['CPPPATH'] = local_include + source_files = Split( app_files + specific_files + newlib_files + uip_files + lua_full_files + module_files + rfs_files ) comp = conf.Finish() @@ -458,9 +460,11 @@ if not GetOption( 'help' ): # comp.TargetSignatures( 'content' ) # comp.SourceSignatures( 'MD5' ) comp[ 'INCPREFIX' ] = "-I" - Default( comp.Program( target = output, source = Split( source_files ) ) ) + Default( comp.Program( target = output, source = source_files ) ) Decider( 'MD5-timestamp' ) # Programming target prog = Environment( BUILDERS = { 'program' : Builder( action = Action ( tools[ platform ][ 'progfunc' ] ) ) }, ENV = os.environ ) prog.program( "prog", output + ".elf" ) + +Help(vars.GenerateHelpText(comp)) diff --git a/src/platform/lpc17xx/conf.py b/src/platform/lpc17xx/conf.py index 6a975b9c..8caac7d6 100644 --- a/src/platform/lpc17xx/conf.py +++ b/src/platform/lpc17xx/conf.py @@ -3,7 +3,8 @@ import fnmatch import glob import os -local_include += ['src/platform/%s/drivers/inc' % platform] + +comp.Append(CPPPATH = ['src/platform/%s/drivers/inc' % platform]) fwlib_files = " ".join(glob.glob("src/platform/%s/drivers/src/*.c" % platform)) @@ -20,13 +21,17 @@ else: specific_files = fwlib_files + " " + " ".join( [ "src/platform/%s/%s" % ( platform, f ) for f in specific_files.split() ] ) ldscript = "src/platform/%s/%s" % ( platform, ldscript ) -cdefs = cdefs + " -DFOR" + comp[ 'cpu' ] + " -Dgcc" +comp.Append(CPPDEFINES = ["FOR" + comp[ 'cpu' ],'gcc']) + +# Configure General Flags for Target +comp.Prepend(CCFLAGS = ['-mcpu=cortex-m3','-mthumb','-mlittle-endian','-ffunction-sections','-fdata-sections','-fno-strict-aliasing']) +comp.Prepend(LINKFLAGS = ['-mcpu=cortex-m3','-mthumb','-Wl,-T','-Xlinker',ldscript,'-u', '_start','-Wl,-e,Reset_Handler','-Wl,-static','-Wl,--gc-sections','-nostartfiles','-nostdlib','-Wl,--allow-multiple-definition']) +comp.Prepend(ASFLAGS = ['-x assembler-with-cpp','-mcpu=cortex-m3','-mthumb','-Wall']) + +comp.Append(LIBS = ['c','gcc','m']) # Toolset data tools[ 'lpc17xx' ] = {} -tools[ 'lpc17xx' ][ 'cccom' ] = "%s -mcpu=cortex-m3 -mthumb -mlittle-endian %s $_CPPINCFLAGS -ffunction-sections -fdata-sections -fno-strict-aliasing %s -Wall -c $SOURCE -o $TARGET" % ( toolset[ 'compile' ], opt, cdefs ) -tools[ 'lpc17xx' ][ 'linkcom' ] = "%s -mcpu=cortex-m3 -mthumb -Wl,-T -Xlinker %s -u _start -Wl,-e,Reset_Handler -Wl,-static -Wl,--gc-sections -nostartfiles -nostdlib -Wl,--allow-multiple-definition -o $TARGET $SOURCES -lc -lgcc -lm %s" % ( toolset[ 'compile' ], ldscript, local_libs ) -tools[ 'lpc17xx' ][ 'ascom' ] = "%s -x assembler-with-cpp $_CPPINCFLAGS -mcpu=cortex-m3 -mthumb %s -Wall -c $SOURCE -o $TARGET" % ( toolset[ 'compile' ], cdefs ) # Programming function for LPC17xx def progfunc_lpc17xx( target, source, env ):