diff options
Diffstat (limited to 'bksys/generic.py')
| -rw-r--r-- | bksys/generic.py | 498 | 
1 files changed, 0 insertions, 498 deletions
| diff --git a/bksys/generic.py b/bksys/generic.py deleted file mode 100644 index 580cbd5..0000000 --- a/bksys/generic.py +++ /dev/null @@ -1,498 +0,0 @@ -## Thomas Nagy, 2005 - -""" -Detect and store the most common options -* kdecxxflags  : debug=1 (-g) or debug=full (-g3, slower) -  else use the user CXXFLAGS if any, - or -O2 by default -* prefix : the installation path -* extraincludes : a list of paths separated by ':' -ie: scons configure debug=full prefix=/usr/local extraincludes=/tmp/include:/usr/local -""" - -BOLD   ="\033[1m" -RED    ="\033[91m" -GREEN  ="\033[92m" -YELLOW ="\033[1m" #"\033[93m" # unreadable on white backgrounds -CYAN   ="\033[96m" -NORMAL ="\033[0m" - -import os, re, types, sys, string, shutil, stat - -import SCons.Defaults -import SCons.Tool -import SCons.Util -from SCons.Script.SConscript import SConsEnvironment -from SCons.Options import Options, PathOption - -class genobj: -	def __init__(self, val, env): -		if not val in "program shlib kioslave staticlib".split(): -			print "unknown genobj given: "+val -			env.Exit(1) - -		self.type = val -		self.orenv = env -		self.env   = None -		self.executed = 0 - -		self.target='' -		self.src=None - -		self.cxxflags='' -		self.cflags='' -		self.includes='' - -		self.linkflags='' -		self.libpaths='' -		self.libs='' - -		# vars used by shlibs -		self.vnum='' -		self.libprefix='' - -		# a directory where to install the targets (optional) -		self.instdir='' -		# ignore the DESTDIR (optional) -		self.nodestdir='' - -		# change the working directory before reading the targets -		self.chdir='' - -		# these members are private -		self.chdir_lock=None -		self.old_os_dir='' -		self.old_fs_dir='' -		self.p_local_shlibs=[] -		self.p_local_staticlibs=[] -		self.p_global_shlibs=[] - -		#if not env.has_key('USE_THE_FORCE_LUKE'): env['USE_THE_FORCE_LUKE']=[self] -		#else: env['USE_THE_FORCE_LUKE'].append(self) - -	def lockchdir(self): -		if not self.chdir: return -		self.chdir_lock=1 -		SConfFS=SCons.Node.FS.default_fs -		self.old_fs_dir=SConfFS.getcwd() -		self.old_os_dir=os.getcwd() -		#os.chdir(old_os_dir+'/'+self.chdir) -		SConfFS.chdir( SConfFS.Dir('#/'+self.chdir), change_os_dir=1) - -	def unlockchdir(self): -		if not self.chdir: return -		if self.chdir_lock: -			#os.chdir(self.old_os_dir) -			SCons.Node.FS.default_fs.chdir(self.old_fs_dir, change_os_dir=0) -			self.chdir_lock=None - -	def execute(self): -		if self.orenv.has_key('DUMPCONFIG'): -			print self.xml() -			return - -		self.lockchdir() - -		self.env = self.orenv.Copy() - -		if not self.src or len(self.src) == 0: -			print RED+"no source file given to object - self.src"+NORMAL -			self.env.Exit(1) -		if not self.env.has_key('nosmart_includes'): self.env.AppendUnique(CPPPATH=['./']) -		if self.type == "kioslave": self.libprefix='' - -		if len(self.includes)>0: self.env.AppendUnique(CPPPATH=self.env.make_list(self.includes)) -		if len(self.cxxflags)>0: self.env.AppendUnique(CXXFLAGS=self.env.make_list(self.cxxflags)) -		if len(self.cflags)>0: self.env.AppendUnique(CCFLAGS=self.env.make_list(self.cflags)) - -		llist=self.env.make_list(self.libs) -		lext='.so .la'.split() -		sext='.a'.split() -		for l in llist: -			sal=SCons.Util.splitext(l) -			if len(sal)>1: -				if sal[1] in lext: self.p_local_shlibs.append(sal[0]+'.so') -				elif sal[1] in sext: self.p_local_staticlibs.append(sal[0]+'.a') -				else: self.p_global_shlibs.append(l) - -		if len(self.p_global_shlibs)>0: self.env.AppendUnique(LIBS=self.p_global_shlibs) -		if len(self.libpaths)>0:   self.env.PrependUnique(LIBPATH=self.env.make_list(self.libpaths)) -		if len(self.linkflags)>0:  self.env.PrependUnique(LINKFLAGS=self.env.make_list(self.linkflags)) - -		# the target to return -		ret=None -		if self.type=='shlib' or self.type=='kioslave': -			ret=self.env.bksys_shlib(self.target, self.src, self.instdir,  -				self.libprefix, self.vnum, nodestdir=self.nodestdir) -		elif self.type=='program': -			ret=self.env.Program(self.target, self.src) -			if not self.env.has_key('NOAUTOINSTALL'): -				self.env.bksys_install(self.instdir, ret, nodestdir=self.nodestdir) -		elif self.type=='staticlib': -			ret=self.env.StaticLibrary(self.target, self.src) - -		# we link the program against a shared library made locally, add the dependency -		if len(self.p_local_shlibs)>0: -			self.env.link_local_shlib(self.p_local_shlibs) -			if ret: self.env.Depends( ret, self.p_local_shlibs ) -		if len(self.p_local_staticlibs)>0: -			self.env.link_local_staticlib(self.p_local_staticlibs) -			if ret: self.env.Depends( ret, self.p_local_staticlibs ) - -		self.unlockchdir() - -## Copy function that honors symlinks -def copy_bksys(dest, source, env): -        if os.path.islink(source): -		#print "symlinking "+source+" "+dest -		if os.path.islink(dest): -			os.unlink(dest) -		os.symlink(os.readlink(source), dest) -	else: -		shutil.copy2(source, dest) -		st=os.stat(source) -		os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) -	return 0 - -## Return a list of things -def make_list(env, s): -	if type(s) is types.ListType: -		return s -	else: -		return s.split() - -def exists(env): -	return true - -def generate(env): -	## Bksys requires scons 0.96 -	env.EnsureSConsVersion(0, 96) - -	SConsEnvironment.make_list = make_list -	def doConfigure(env): -		return not env['HELP'] and (env['_CONFIGURE'] or not env.has_key('ISCONFIGURED')) - -	SConsEnvironment.doConfigure = doConfigure -	env['HELP']=0 -	if '--help' in sys.argv or '-h' in sys.argv or 'help' in sys.argv: -		env['HELP']=1 -	 -	env.addHelpText(""" -b[*** Generic options *** ------------------------] -b[* debug  ]: debug=1 (-g) or debug=full (-g3, slower), otherwise use -              environment CXXFLAGS, or -O2 by default. -b[* prefix ]: the installation path -b[* extraincludes ]: a list of paths separated by ':' - -ie: b[scons configure debug=full prefix=/usr/local extraincludes=/tmp/include:/usr/local] -""") -	 -	## Global cache directory -	# Put all project files in it so a rm -rf cache will clean up the config -	if not env.has_key('CACHEDIR'): -		env['CACHEDIR'] = os.getcwd()+'/cache/' -	if not os.path.isdir(env['CACHEDIR']): -		os.mkdir(env['CACHEDIR']) -	 -	## SCons cache directory -	# This avoids recompiling the same files over and over again:  -	# very handy when working with cvs -	if os.getuid() != 0: -		env.CacheDir(os.getcwd()+'/cache/objects') - -	#  Avoid spreading .sconsign files everywhere - keep this line -	env.SConsignFile(env['CACHEDIR']+'/scons_signatures') -	 -	def makeHashTable(args): -		table = { } -		for arg in args: -			if len(arg) > 1: -				lst=arg.split('=') -				if len(lst) < 2: -					continue -				key=lst[0] -				value=lst[1] -				if len(key) > 0 and len(value) >0: -					table[key] = value - 		return table - -	env['ARGS']=makeHashTable(sys.argv) - -	## Special trick for installing rpms ... -	env['DESTDIR']='' -	if 'install' in sys.argv: -		dd='' -		if os.environ.has_key('DESTDIR'): -			dd=os.environ['DESTDIR'] -		if not dd: -			if env['ARGS']: dd=env['ARGS']['DESTDIR'] -		if dd: -			env['DESTDIR']=dd+'/' -			print CYAN+'** Enabling DESTDIR for the project ** ' + NORMAL + env['DESTDIR'] - -	## install symlinks for shared libraries properly -	env['INSTALL'] = copy_bksys - -	## Use the same extension .o for all object files -	env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - -	## load the options -	cachefile=env['CACHEDIR']+'generic.cache.py' -	opts = Options(cachefile) -	opts.AddOptions( -		( 'GENCCFLAGS', 'C flags' ), -		( 'GENCXXFLAGS', 'debug level for the project : full or just anything' ), -		( 'GENLINKFLAGS', 'additional link flags' ), -		( 'PREFIX', 'prefix for installation' ), -		( 'EXTRAINCLUDES', 'extra include paths for the project' ), -		( 'ISCONFIGURED', 'is the project configured' ), -	) -	opts.Update(env) -	 -	# Use this to avoid an error message 'how to make target configure ?' -	env.Alias('configure', None) - -	# Check if the following command line arguments have been given -	# and set a flag in the environment to show whether or not it was -	# given. -	if 'install' in sys.argv: -		env['_INSTALL']=1 -	else: -		env['_INSTALL']=0 -	if 'configure' in sys.argv: -		env['_CONFIGURE']=1 -	else: -		env['_CONFIGURE']=0 - -	# Configure the environment if needed -	if doConfigure(env): -		# be paranoid, unset existing variables -		for var in "GENCXXFLAGS GENCCFLAGS GENLINKFLAGS PREFIX EXTRAINCLUDES ISCONFIGURED EXTRAINCLUDES".split(): -			if env.has_key(var): env.__delitem__(var) - -		if env['ARGS'].get('debug', None): -			debuglevel = env['ARGS'].get('debug', None) -			print CYAN+'** Enabling debug for the project **' + NORMAL -			if (debuglevel == "full"): -				env['GENCXXFLAGS'] = ['-DDEBUG', '-g3', '-Wall'] -			else: -				env['GENCXXFLAGS'] = ['-DDEBUG', '-g', '-Wall'] -		else: -			if os.environ.has_key('CXXFLAGS'): -				# user-defined flags (gentooers will be elighted) -				env['GENCXXFLAGS'] = SCons.Util.CLVar( os.environ['CXXFLAGS'] ) -				env.Append( GENCXXFLAGS = ['-DNDEBUG', '-DNO_DEBUG'] ) -			else: -				env.Append(GENCXXFLAGS = ['-O2', '-DNDEBUG', '-DNO_DEBUG']) - -		if os.environ.has_key('CFLAGS'): -			env['GENCCFLAGS'] = SCons.Util.CLVar( os.environ['CFLAGS'] ) - -		## FreeBSD settings (contributed by will at freebsd dot org) -		if os.uname()[0] == "FreeBSD": -			if os.environ.has_key('PTHREAD_LIBS'): -				env.AppendUnique( GENLINKFLAGS = SCons.Util.CLVar( os.environ['PTHREAD_LIBS'] ) ) -		        else: -				syspf = os.popen('/sbin/sysctl kern.osreldate') -				osreldate = int(syspf.read().split()[1]) -				syspf.close() -				if osreldate < 500016: -					env.AppendUnique( GENLINKFLAGS = ['-pthread']) -					env.AppendUnique( GENCXXFLAGS = ['-D_THREAD_SAFE']) -				elif osreldate < 502102: -					env.AppendUnique( GENLINKFLAGS = ['-lc_r']) -					env.AppendUnique( GENCXXFLAGS = ['-D_THREAD_SAFE']) -				else: -					env.AppendUnique( GENLINKFLAGS = ['-pthread']) - -		# User-specified prefix -		if env['ARGS'].has_key('prefix'): -			env['PREFIX'] = os.path.abspath( env['ARGS'].get('prefix', '') ) -			print (CYAN+'** installation prefix for the project set to : ' + -			       env['PREFIX'] +' **'+ NORMAL) - -		# User-specified include paths -		env['EXTRAINCLUDES'] = env['ARGS'].get('extraincludes', None) -		if env['EXTRAINCLUDES']: -			print (CYAN+'** extra include paths for the project set to: ' + -			       env['EXTRAINCLUDES'] +' **'+ NORMAL) - -		env['ISCONFIGURED']=1 - -		# And finally save the options in the cache -		opts.Save(cachefile, env) - -	def bksys_install(lenv, subdir, files, destfile=None, nodestdir=None): -		""" Install files on "scons install" -		If the DESTDIR env variable has been set, (e.g. by  -		"scons install DESTDIR=$CURDIR/debian) then install files to that -		directory, regardless of where the configure stage showed that -		files should be installed. -		This feature is useful for packagers, and users of GNU stow. -		 -		NB. The DESTDIR will be ignored if NODESTDIR is also set, although -		the same effect can be acheived by not setting DESTDIR in the first -		place.""" - -		if not env['_INSTALL']: -			return -		basedir = env['DESTDIR'] -		if nodestdir or env.has_key('NODESTDIR') : basedir = "/" -		install_list = None -		if not destfile: -			install_list = env.Install(basedir+subdir+'/', files) -		else: -			if subdir: -				install_list = env.InstallAs(basedir+subdir+'/'+destfile, files) -			else: -				install_list = env.InstallAs(basedir+'/'+destfile, files) -		env.Alias('install', install_list) -		return install_list - -	def build_la_file(target, source, env): -		""" Action for building libtool files. -		Writes a .la file, as used by libtool.""" -		dest=open(target[0].path, 'w') -		sname=source[0].name -		dest.write("dlname='%s'\n" % sname) -		if len(env['BKSYS_VNUM'])>0: -			vnum=env['BKSYS_VNUM'] -			nums=vnum.split('.') -			src=source[0].name -			name = src.split('so.')[0] + 'so' -			strn = src+" "+name+"."+str(nums[0])+" "+name -			dest.write("library_names='%s'\n" % (strn) ) -		else: -			dest.write("library_names='%s %s %s'\n" % (sname, sname, sname) ) -		dest.write("old_library=''\ndependency_libs=''\ncurrent=0\n") -		dest.write("age=0\nrevision=0\ninstalled=yes\nshouldnotlink=no\n") -		dest.write("dlopen=''\ndlpreopen=''\n") -		dest.write("libdir='%s'" % env['BKSYS_DESTDIR']) -		dest.close() -		return 0 - -	def string_la_file(target, source, env): -		print "building '%s' from '%s'" % (target[0].name, source[0].name) -	la_file = env.Action(build_la_file, string_la_file, ['BKSYS_VNUM', 'BKSYS_DESTDIR']) -	env['BUILDERS']['LaFile'] = env.Builder(action=la_file,suffix='.la',src_suffix=env['SHLIBSUFFIX']) - -	## Function for building shared libraries -	def bksys_shlib(lenv, target, source, libdir, libprefix='lib', vnum='', noinst=None, nodestdir=None): -		""" Install a shared library. -		 -		Installs a shared library, with or without a version number, and create a -		.la file for use by libtool. -		 -		If library version numbering is to be used, the version number -		should be passed as a period-delimited version number (e.g. -		vnum = '1.2.3').  This causes the library to be installed -		with its full version number, and with symlinks pointing to it. -		 -		For example, for libfoo version 1.2.3, install the file -		libfoo.so.1.2.3, and create symlinks libfoo.so and -		libfoo.so.1 that point to it. -		""" -		thisenv = lenv.Copy() # copying an existing environment is cheap -		thisenv['BKSYS_DESTDIR']=libdir -		thisenv['BKSYS_VNUM']=vnum -		thisenv['SHLIBPREFIX']=libprefix - -		if len(vnum)>0: -			thisenv['SHLIBSUFFIX']='.so.'+vnum -			thisenv.Depends(target, thisenv.Value(vnum)) - -		# Fix against a scons bug - shared libs and ordinal out of range(128) -		if type(source) is types.ListType: -			src2=[] -			for i in source: -				src2.append( str(i) ) -			source=src2 - -		library_list = thisenv.SharedLibrary(target, source) -		lafile_list  = thisenv.LaFile(target, library_list) - -		## Install the libraries automatically -		if not thisenv.has_key('NOAUTOINSTALL') and not noinst: -			thisenv.bksys_install(libdir, library_list, nodestdir=nodestdir) -			thisenv.bksys_install(libdir, lafile_list, nodestdir=nodestdir)	 - -		## Handle the versioning -		if len(vnum)>0: -			nums=vnum.split('.') -			symlinkcom = ('cd $TARGET.dir && ' + -			              'rm -f $TARGET.name && ' + -			              'ln -s $SOURCE.name $TARGET.name') -			tg = target+'.so.'+vnum -			nm1 = target+'.so' -			nm2 = target+'.so.'+nums[0] -			 -			thisenv.Command(nm1, tg, symlinkcom) -			thisenv.Command(nm2, tg, symlinkcom) - -			#base=env['DESTDIR']+libdir+'/' -			thisenv.bksys_install(libdir, nm1, nodestdir=nodestdir) -			thisenv.bksys_install(libdir, nm2, nodestdir=nodestdir) - -	# Declare scons scripts to process -	def subdirs(lenv, folderlist): -		flist=[] -		if type(folderlist) is types.ListType: flist = folderlist -		else: flist = folderlist.split() -		for i in flist: -			lenv.SConscript(i+"/SConscript") - -        def link_local_shlib(lenv, str): -                """ Links against a shared library made in the project """ -                lst = lenv.make_list(str) -		for file in lst: -			import re -			reg = re.compile("(.*)/lib(.*).(la|so)") -			result = reg.match(file) -			if not result: -				print "Unknown la file given "+file -				continue -			dir  = result.group(1) -			link = result.group(2) -			lenv.AppendUnique(LIBS = [link]) -			lenv.PrependUnique(LIBPATH = [dir]) - -        def link_local_staticlib(lenv, str): -                """ Links against a shared library made in the project """ -                lst = lenv.make_list(str) -		for file in lst: -			import re -			reg = re.compile("(.*)/(lib.*.a)") -			result = reg.match(file) -			if not result: -				print "Unknown archive file given "+file -				continue - -			f=SCons.Node.FS.default_fs.File(file) -			lenv.Append(LINKFLAGS=[f.path]) - -	#valid_targets = "program shlib kioslave staticlib".split() -        SConsEnvironment.bksys_install = bksys_install -	SConsEnvironment.bksys_shlib   = bksys_shlib -	SConsEnvironment.subdirs       = subdirs -	SConsEnvironment.link_local_shlib = link_local_shlib -	SConsEnvironment.link_local_staticlib = link_local_staticlib - -	SConsEnvironment.genobj=genobj - -	if env.has_key('GENCXXFLAGS'): -		env.PrependUnique( CXXFLAGS = env['GENCXXFLAGS'] ) - -	if env.has_key('GENCCFLAGS'): -		env.AppendUnique( CCFLAGS = env['GENCCFLAGS'] ) - -	if env.has_key('GENLINKFLAGS'): -		env.AppendUnique( LINKFLAGS = env['GENLINKFLAGS'] ) - -	if env.has_key('EXTRAINCLUDES'): -		if env['EXTRAINCLUDES']: -			incpaths = [] -			for dir in str(env['EXTRAINCLUDES']).split(':'): -				incpaths.append( dir ) -			env.Append(CPPPATH = incpaths) - -	env.Export('env') | 
