import os import sys argenv=Environment() # command line options argenv.Replace(debug=ARGUMENTS.get("debug",0)) argenv.Replace(debugopt=ARGUMENTS.get("debugopt",0)) argenv.Replace(debugopt2=ARGUMENTS.get("debugopt2",0)) argenv.Replace(debugmem=ARGUMENTS.get("debugmem",0)) argenv.Replace(do_64bit_analysis=ARGUMENTS.get("do_64bit_analysis",1)) argenv.Replace(do_64bit_build=ARGUMENTS.get("do_64bit_build",2)) argenv.Replace(build_ida=ARGUMENTS.get("build_ida",-1)) argenv.Replace(build_ida7=ARGUMENTS.get("build_ida7",-1)) argenv.Replace(build_irdb=ARGUMENTS.get("build_irdb",1)) argenv.Replace(build_irdb_driver=ARGUMENTS.get("build_irdb_driver",0)) argenv.Replace(install=ARGUMENTS.get("install",1)) argenv.Replace(numeric_error_annots=ARGUMENTS.get("numeric_error_annots",1)) argenv.Replace(do_sccp=ARGUMENTS.get("do_sccp",1)) argenv.Replace(profile=ARGUMENTS.get("profile",0)) # environment options argenv.Replace(SMPSA_HOME=os.environ['SMPSA_HOME']) argenv.Replace(IDASDK=os.environ['IDASDK']) argenv.Replace(IDAROOT=os.environ['IDAROOT']) argenv.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME']) if argenv['SMPSA_HOME'] is None: print 'Cannot proceed without SMPSA_HOME set.' exit(1) if int(argenv['debug']) == 1: print "Setting debug mode" STARS_CCFLAGS=" -g " STARS_LDFLAGS="" STARS_LDPREFIX="" elif int(argenv['debugopt']) == 1: print "Setting debugopt mode" STARS_CCFLAGS=" -g -O1 " STARS_LDFLAGS="" STARS_LDPREFIX="" elif int(argenv['debugopt2']) == 1: print "Setting debugopt2 mode" STARS_CCFLAGS=" -g -O2 " STARS_LDFLAGS="" STARS_LDPREFIX="" elif int(argenv['debugmem']) == 1: print "Setting debugmem mode" STARS_CCFLAGS=" -g -fsanitize=address -fno-omit-frame-pointer " STARS_LDFLAGS=" -lasan " STARS_LDPREFIX="LD_PRELOAD='/usr/lib/gcc/x86_64-linux-gnu/5/libasan.so'" elif int(argenv['profile']) == 1: print "Setting perf profiling mode" STARS_CCFLAGS=" -O3 -fno-omit-frame-pointer -pg " STARS_LDFLAGS="" STARS_LDPREFIX="" else: print "Setting release mode" STARS_CCFLAGS=" -O3 " STARS_LDFLAGS="" STARS_LDPREFIX="" # sanity check default values for build_ida and build_ida7 # -1 means "default" 0 means off, 1 means on. # defaults are build_ida7=1, build_ida=0. # build_ida=1 causes default build_ida7=0 # cannot both be on. # can both be off. # check both on for error` if int(argenv['build_ida7']) == 1 and int(argenv['build_ida']) == 1: print "Cannot set both build_ida7 and build_ida at the same time." sys.exit(0) #check both default elif int(argenv['build_ida7']) == -1 and int(argenv['build_ida']) == -1: argenv.Replace(build_ida7=ARGUMENTS.get("build_ida",0)) argenv.Replace(build_ida7=ARGUMENTS.get("build_ida7",1)) #check one off, one default elif int(argenv['build_ida7']) == -1 and int(argenv['build_ida']) == 0: argenv.Replace(build_ida7=ARGUMENTS.get("build_ida7",1)) elif int(argenv['build_ida7']) == 0 and int(argenv['build_ida']) == -1: argenv.Replace(build_ida7=ARGUMENTS.get("build_ida",0)) # check one on, one default elif int(argenv['build_ida7']) == -1 and int(argenv['build_ida']) == 1: argenv.Replace(build_ida7=ARGUMENTS.get("build_ida7",0)) elif int(argenv['build_ida7']) == 1 and int(argenv['build_ida']) == -1: argenv.Replace(build_ida7=ARGUMENTS.get("build_ida",0)) # check one on, one explicitly off elif int(argenv['build_ida7']) == 0 and int(argenv['build_ida']) == 1: ''' okay, nothing to do.''' elif int(argenv['build_ida7']) == 1 and int(argenv['build_ida']) == 0: ''' okay, nothing to do.''' # check both explicitly off elif int(argenv['build_ida7']) == 0 and int(argenv['build_ida']) == 0: ''' okay, nothing to do.''' # how can it be none of these? else: print "build_ida/build_ida7 set wildly. values are 0, 1 or left unset. (or, possibly internal error in build?)" sys.exit(0) # STARS_LDFLAGS=" -lasan LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/5/libasan.so" if int(argenv['do_64bit_analysis']) == 1: STARS_CCFLAGS+=" -D__EA64__ " if int(argenv['do_sccp']) == 1: STARS_CCFLAGS+=" -DSTARS_DO_SCCP " if int(argenv['numeric_error_annots']) == 1: STARS_CCFLAGS+=" -DSTARS_EMIT_NUMERIC_ERROR_ANNOTS " Export('argenv', 'STARS_CCFLAGS', 'STARS_LDFLAGS', 'STARS_LDPREFIX') installers=[] if int(argenv['build_ida']) == 1 or int(argenv['build_ida7']) == 1: if argenv['IDASDK'] is None: print 'Cannot proceed without IDASDK set.' exit(1) if argenv['IDAROOT'] is None: print 'Cannot proceed without IDAROOT set.' exit(1) if argenv['IDASDK'] is None: print 'Cannot proceed without IDASDK set.' exit(1) if argenv['IDAROOT'] is None: print 'Cannot proceed without IDAROOT set.' exit(1) if int(argenv['build_ida']) == 1: print "Build IDA Plugin" lib=SConscript('SConscript.ida', variant_dir='build_ida') elif int(argenv['build_ida7']) == 1: print "Build IDA 7.0+ Plugin" lib=SConscript('SConscript.ida7', variant_dir='build_ida') print "Done build IDA Plugin" test=argenv.Command(target="./test.log", source=lib, action="IDAROOT=$IDAROOT SMPSA_HOME=$SMPSA_HOME $SMPSA_HOME/tests/scripts/make_baseline.sh 2>&1 |tee ./test.log") argenv.Depends(test,lib) ab=argenv.AlwaysBuild(test) argenv.Default(ab) installers=installers+ab if int(argenv['build_irdb']) == 1 or int(argenv['build_irdb_driver']) == 1: if argenv['SECURITY_TRANSFORMS_HOME'] is None: print 'Cannot build libstars.a without SECURITY_TRANSFORMS_HOME set. Did you forget the env. var.? Or try setting build_irdb=0. ' exit(1) print "Build IDA/IRDB library" lib=SConscript('SConscript.irdb_lib', variant_dir='build_irdb_lib') installers=installers+lib libehp=argenv.SConscript("libehp/SConscript", variant_dir='scons_build/libehp'); libehp=argenv.Install("$SMPSA_HOME/libehp/lib", libehp); argenv.Depends(lib, libehp) Default(libehp, lib) if 'PEDI_HOME' in os.environ: pedi = Command( target = "./testoutput", source = "./SConscript", action = "if [ -f manifest.txt.config ]; then "+os.environ['PEDI_HOME']+"/pedi -m manifest.txt ; else echo Skipping PEDI; fi" ) Depends(pedi,installers) Default( pedi )