123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #!/usr/bin/python
- import sys, os, string, subprocess, shutil, fileinput, multiprocessing, re, resource
- def replaceAll(fd,searchExp,replaceExp):
- for line in fileinput.input(fd, inplace=1):
- if searchExp in line:
- line = line.replace(searchExp,replaceExp)
- sys.stdout.write(line)
- def prependText(filename, text) :
- data = ""
- with open(filename, 'r') as original:
- data = original.read()
- with open(filename, 'w') as modified:
- modified.write(text)
- modified.write(data)
- def appendText(filename, text) :
- with open(filename, "a") as myfile:
- myfile.write(text)
- try:
- home = os.getcwd()
- glibc = "glibc-2.17"
- glibcParent = "" # glibc parent directory
- glibcDir = "" # glibc dir (ex. glibc-2.17)
- buildDir = "build"
- installDir = "/usr/local/graphene"
- commandStr = ""
- commandOutput = ""
- quiet = False
- debug_flags = ""
- for arg in sys.argv[1:]:
- if arg == '--quiet' or arg == '-q':
- quiet = True
- if arg == 'debug':
- debug_flags = "-g"
- #########################################
- #### get the locations of directories ###
- #########################################
- if not quiet:
- iput = raw_input('use {0} as the source of GNU libc? ([y]/n):'.format(glibc)).lower()
- if not iput == 'y' and not iput == '' :
- glibc = raw_input('enter the glibc source to install with: ')
- if not quiet:
- iput = raw_input('{0} contains glibc code to compile? ([y]/n): '.format(glibc)).lower()
- if not iput == 'y' and not iput == '':
- glibc = raw_input('directory containing glibc code to compile: ')
- if os.path.isdir(glibc) :
- glibc = os.path.abspath(glibc)
- glibcParent,glibcDir = os.path.split(glibc)
- print 'building in {0}: {1}'.format(glibcParent, glibcDir)
- if not quiet:
- iput = raw_input('use {0} as the directory to build glibc in? ([y]/n): '.format(buildDir)).lower()
- if not iput == 'y' and not iput == '':
- buildDir = raw_input('the directory to build glibc in: ')
- buildDir = os.path.abspath(buildDir)
- print 'using build dir: {0}'.format(buildDir)
- if os.path.isdir(buildDir) :
- if not quiet:
- clean = raw_input('clean build (delete {0}, rerun configure, etc.)? ([y]/n): '.format(buildDir))
- else:
- clean = 'y'
- if clean == 'y' or clean == '':
- shutil.rmtree(buildDir)
- os.makedirs(buildDir)
- else :
- print 'Then just go to {0} and type make...'.format(buildDir)
- exit(0)
- else :
- os.makedirs(buildDir)
- if not quiet:
- iput = raw_input('use {0} as the directory to install glibc in? ([y]/n): '.format(installDir)).lower()
- if not iput == 'y' and not iput == '':
- installDir = raw_input('the directory to install glibc in: ')
- installDir = os.path.abspath(installDir)
- print 'using install dir: {0}'.format(installDir)
- ################################
- #### doctor glibc's Makefile ###
- ################################
- os.chdir(buildDir)
- cflags = '{0} -O2 -U_FORTIFY_SOURCE -fno-stack-protector'.format(debug_flags)
- extra_defs = ''
- disabled_features = { 'nscd' }
- extra_flags = '--with-tls --enable-add-ons=nptl --without-selinux {0}'.format(' '.join(['--disable-' + f for f in disabled_features]))
- ## configure
- commandStr = r'CFLAGS="{2}" {3} {0}/configure --prefix={1} {4} | tee configure.out'.format(glibc, installDir, cflags, extra_defs, extra_flags)
- print commandStr
- commandOutput = subprocess.call(commandStr, shell=True)
- ## Enable parallel builds
- numCPUs = multiprocessing.cpu_count()
- ## Don't use up all the cores!
- numCPUs = numCPUs - 1
- if numCPUs == 0:
- numCPUs = 1
- replaceAll('Makefile', r'# PARALLELMFLAGS = -j4', r'PARALLELMFLAGS = -j{0}'.format(numCPUs))
- link_binaries = [ ( 'elf', 'ld-linux-x86-64.so.2' ),
- ( 'nptl', 'libpthread.so.0' ),
- ( 'nptl_db','libthread_db.so.1' ),
- ( 'math', 'libm.so.6' ),
- ( 'dlfcn', 'libdl.so.2' ),
- ( 'login', 'libutil.so.1' ),
- ( 'csu', 'crt1.o' ),
- ( 'csu', 'crti.o' ),
- ( 'csu', 'crtn.o' ),
- ( 'libos', 'liblibos.so.1' ) ]
- for (dir, bin) in link_binaries:
- print bin + ' -> ' + dir + '/' + bin
- os.symlink(dir + '/' + bin, bin)
- print '\n\n\nNow type \'make\' in \'{0}\'\n\n'.format(buildDir)
- except:
- print 'uh-oh: {0}'.format(sys.exc_info()[0])
|