| from SCons.Environment import Environment as Environment |
| from SCons.Script.SConscript import SConsEnvironment as SConsEnvironment |
| from os.path import join as pjoin |
| from os.path import isdir as isdir |
| from os.path import isfile as isfile |
| from os.path import exists as exists |
| from os import environ as environ |
| from string import join as sjoin |
| |
| def AskForDir(env,pkg): |
| response = raw_input('Enter directory containing %(pkg)s: ' % {'pkg':pkg }) |
| if response == 'quit' or response == "exit": |
| print "Configuration terminated by user" |
| env.Exit(1) |
| if not isdir(response): |
| print "'" + response + "' is not a directory. Try again." |
| return AskForDir(env,pkg) |
| return response |
| |
| def FindPackage(ctxt,pkgname,varname,hdr,libs,code='main(argc,argv);',paths=[], |
| objs=[],hdrpfx='',progs=[]): |
| ctxt.Message('Checking for Package ' + pkgname + '...') |
| ctxt.env[pkgname + '_bin'] = '' |
| ctxt.env[pkgname + '_lib'] = '' |
| ctxt.env[pkgname + '_inc'] = '' |
| lastLIBS = ctxt.env['LIBS'] |
| lastLIBPATH = ctxt.env['LIBPATH'] |
| lastCPPPATH = ctxt.env['CPPPATH'] |
| lastBINPATH = ctxt.env['BINPATH'] |
| lastLINKFLAGS = ctxt.env['LINKFLAGS'] |
| prog_template = """ |
| #include <%(include)s> |
| int main(int argc, char **argv) { |
| %(code)s |
| return 0; |
| } |
| """ |
| ctxt.env.AppendUnique(LIBS = libs) |
| if len(ctxt.env['confpath']) > 0: |
| paths = ctxt.env['confpath'].split(':') + paths |
| if len(ctxt.env[varname]) > 0: |
| paths = [ctxt.env[varname]] + paths |
| paths += [ '/opt/local','/opt/','/sw/local','/sw','/usr/local','/usr'] |
| # Check each path |
| for p in paths: |
| # Clear old settings from previous iterations |
| libdir = '' |
| incdir = '' |
| bindir = None |
| objects = [] |
| foundlib = 0 |
| # Check various library directory names |
| for ldir in ['lib','libs','LIBS','Lib','Libs','Library','Libraries']: |
| libdir = pjoin(p,ldir) |
| # Skip this ldir if it doesn't exist |
| if not isdir(libdir): |
| continue |
| |
| # Check each required library to make sure its a file |
| count = 0 |
| for alib in libs: |
| library = pjoin(libdir,ctxt.env['LIBPREFIX']) |
| library += alib + ctxt.env['LIBSUFFIX'] |
| if not isfile(library): |
| break |
| else: |
| count += 1 |
| |
| # if we didn't get them all then then try the next path |
| if count != len(libs): |
| continue |
| |
| # If we were given some object files to check |
| if len(objs) > 0: |
| count = 0 |
| # Check each of the required object files |
| for o in objs: |
| obj = pjoin(libdir,ctxt.env['OBJPREFIX']) |
| obj += o + ctxt.env['OBJSUFFIX'] |
| if not isfile(obj): |
| break |
| else: |
| count += 1 |
| objects.append(obj) |
| |
| # If we didn't find them all, try the next library path |
| if count != len(objs): |
| continue |
| |
| # Otherwise we found the right library path |
| foundlib = 1 |
| break |
| |
| if not foundlib: |
| continue |
| |
| # At this point we have a valid libdir. Now check the various include |
| # diretory names |
| count = 0 |
| for incdir in ['include', 'inc', 'incl']: |
| hdrdir = pjoin(p,incdir) |
| if not isdir(hdrdir): |
| continue |
| if hdrpfx != '': |
| hdrdir = pjoin(hdrdir,hdrpfx) |
| if not isdir(hdrdir): |
| continue |
| header = pjoin(hdrdir,hdr) |
| if not isfile(header): |
| continue |
| else: |
| count += 1 |
| break |
| |
| # Check that we found the header file |
| if count != 1: |
| continue |
| |
| # Check for programs |
| count = 0 |
| for pr in progs: |
| bindir = pjoin(p,'bin') |
| if not exists(pjoin(bindir,pr)): |
| break |
| else: |
| count += 1 |
| |
| # If we didn't find all the programs, try the next path |
| if count != len(progs): |
| continue |
| |
| # We found everything we're looking for, now test it out |
| ctxt.env.AppendUnique(LIBPATH = [libdir]) |
| ctxt.env.AppendUnique(CPPPATH = [hdrdir]) |
| ctxt.env.AppendUnique(BINPATH = [bindir]) |
| ctxt.env.AppendUnique(LINKFLAGS = objects) |
| ret = ctxt.TryRun( |
| prog_template % {'include':hdr,'code':code},'.cpp' |
| ) |
| |
| # If the test failed, reset the variables and try next path |
| if not ret: |
| ctxt.env.Replace(LIBS=lastLIBS, LIBPATH=lastLIBPATH, |
| CPPPATH=lastCPPPATH, BINPATH=lastBINPATH, LINKFLAGS=lastLINKFLAGS) |
| continue |
| |
| # Otherwise, we've succeded, unset temporary environment settings and |
| # set up the the packages environment variables. |
| |
| ctxt.env.Replace(LIBS=lastLIBS, LINKFLAGS=lastLINKFLAGS) |
| ctxt.env[varname] = p |
| ctxt.env[pkgname + '_bin'] = bindir |
| ctxt.env[pkgname + '_lib'] = libdir |
| ctxt.env[pkgname + '_inc'] = hdrdir |
| ctxt.Result('Found: (' + hdrdir + ',' + libdir + ')') |
| return 1 |
| |
| # After processing all paths, we didn't find it |
| ctxt.Result( 'Not Found' ) |
| |
| # We didn't find it. Lets ask for a directory name and call ourselves |
| # again using that directory name |
| dir = AskForDir(ctxt.env,pkgname) |
| return FindPackage(ctxt,pkgname,varname,hdr,libs,code,[dir],objs,hdrpfx,progs) |
| |
| def FindLLVM(conf): |
| code = 'new llvm::Module("Name");' |
| conf.FindPackage('LLVM','with_llvm','llvm/Module.h',['LLVMCore','LLVMSystem'], |
| code,[],[],'',['llvm2cpp','llvm-as','llc'] ) |
| |
| def FindAPR(conf): |
| code = 'apr_initialize();' |
| return conf.FindPackage('APR','with_apr',pjoin('apr-1','apr_general.h'), |
| ['apr-1'],code,[]) |
| |
| def FindAPRU(conf): |
| code = 'apu_version_string();' |
| return conf.FindPackage('APRU','with_apru',pjoin('apr-1','apu_version.h'), |
| ['aprutil-1'],code,[]) |
| |
| def FindLibXML2(conf): |
| code = 'xmlNewParserCtxt();' |
| return conf.FindPackage('LIBXML2','with_libxml2',pjoin('libxml','parser.h'), |
| ['xml2'],code,[],[],'libxml2',['xmllint']) |
| |
| def CheckProgram(ctxt,progname,varname,moredirs=[],critical=1): |
| ctxt.Message("Checking for Program " + progname + "...") |
| if ctxt.env[varname] is not None and exists(ctxt.env[varname]): |
| ret = 1 |
| else: |
| paths = sjoin(moredirs,':') + ':' + ctxt.env['ENV']['PATH'] |
| fname = ctxt.env.WhereIs(progname,paths) |
| ret = fname != None |
| if ret: |
| ctxt.env[varname] = fname |
| else: |
| ctxt.env[varname] = None |
| ctxt.Result(ret) |
| if critical and not ret: |
| print "Required Program '" + progname + "' is missing." |
| ctxt.env.Exit(1) |
| return ret |
| |
| def CheckCXXHdr(conf,hdr,critical=1): |
| ret = conf.CheckCXXHeader(hdr) |
| if critical and not ret: |
| print "Required C++ Header <" + hdr + "> is missing." |
| conf.env.Exit(1) |
| return ret |
| |
| def CheckCHdr(conf,hdr,critical=1): |
| ret = conf.CheckCHeader(hdr) |
| if critical and not ret: |
| print "Required C Header <" + hdr + "> is missing." |
| conf.env.Exit(1) |
| return ret |
| |
| |
| def CheckForHeaders(conf): |
| CheckCXXHdr(conf,'algorithm') |
| CheckCXXHdr(conf,'cassert') |
| CheckCXXHdr(conf,'ios') |
| CheckCXXHdr(conf,'iostream') |
| CheckCXXHdr(conf,'istream') |
| CheckCXXHdr(conf,'map') |
| CheckCXXHdr(conf,'memory') |
| CheckCXXHdr(conf,'new') |
| CheckCXXHdr(conf,'ostream') |
| CheckCXXHdr(conf,'string') |
| CheckCXXHdr(conf,'vector') |
| CheckCXXHdr(conf,'llvm/ADT/StringExtras.h') |
| CheckCXXHdr(conf,'llvm/System/Path.h') |
| CheckCHdr(conf,['apr-1/apr.h','apr-1/apr_pools.h']) |
| CheckCHdr(conf,['apr-1/apr.h','apr-1/apr_uri.h']) |
| CheckCHdr(conf,'libxml/parser.h') |
| CheckCHdr(conf,'libxml/relaxng.h') |
| CheckCHdr(conf,'libxml/xmlwriter.h') |
| return 1 |
| |
| def CheckForPrograms(conf): |
| conf.CheckProgram('g++','with_gxx') |
| conf.CheckProgram('llc','with_llc',[conf.env['LLVM_bin']]) |
| conf.CheckProgram('llvm-dis','with_llvmdis',[conf.env['LLVM_bin']]) |
| conf.CheckProgram('llvm-as','with_llvmas',[conf.env['LLVM_bin']]) |
| conf.CheckProgram('llvm2cpp','with_llvm2cpp',[conf.env['LLVM_bin']]) |
| conf.CheckProgram('llvm-ar','with_llvmar',[conf.env['LLVM_bin']]) |
| conf.CheckProgram('llvm-ld','with_llvm_ld',[conf.env['LLVM_bin']]) |
| conf.CheckProgram('llvm-gcc','with_llvmgcc') |
| conf.CheckProgram('llvm-g++','with_llvmgxx') |
| conf.CheckProgram('gperf','with_gperf') |
| conf.CheckProgram('pod2html','with_pod2html',[],0) |
| conf.CheckProgram('pod2man','with_pod2man',[],0) |
| conf.CheckProgram('xmllint','with_xmllint',['LIBXML2_bin'],0) |
| if not conf.CheckProgram('runtest','with_runtest',[],0): |
| print "*** TESTING DISABLED ***" |
| if not conf.CheckProgram('doxygen','with_doxygen',[],0): |
| print "*** DOXYGEN DISABLED ***" |
| if not conf.CheckProgram('xsltproc','with_xsltproc',[],0): |
| print "*** XSLTPROC DISABLED ***" |
| return 1 |
| |
| def ConfigureHLVM(env): |
| save_path = env['ENV']['PATH'] |
| conf = env.Configure(custom_tests = { |
| 'FindPackage':FindPackage, 'CheckProgram':CheckProgram }, |
| conf_dir=pjoin(env['BuildDir'],'conftest'), |
| log_file=pjoin(env['BuildDir'],'config.log'), |
| config_h=pjoin(env['BuildDir'],'hlvm','Base','config.h') |
| ) |
| rlist = [] |
| for p in env['confpath'].split(':'): |
| if p != '' and exists(p): |
| env.PrependENVPath('PATH', p) |
| if exists(pjoin(p,'bin')): |
| env.PrependENVPath('PATH', pjoin(p,'bin')) |
| |
| env['LIBS'] = '' |
| |
| FindLLVM(conf) |
| FindLibXML2(conf) |
| FindAPR(conf) |
| FindAPRU(conf) |
| CheckForHeaders(conf) |
| CheckForPrograms(conf) |
| conf.Finish() |
| env['ENV']['PATH'] = save_path |