From 046a0561bc34e1de1fcd0e533ad6308d7909be94 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sun, 27 Nov 2011 19:08:25 -0600 Subject: [PATCH] Cleanup --- SConstruct | 35 -- bksys/generic.py | 644 ---------------------------- bksys/kde.py | 887 --------------------------------------- bksys/parser.py | 142 ------- bksys/scons-mini.tar.bz2 | Bin 58130 -> 0 bytes src/SConscript | 26 -- 6 files changed, 1734 deletions(-) delete mode 100644 SConstruct delete mode 100644 bksys/generic.py delete mode 100644 bksys/kde.py delete mode 100644 bksys/parser.py delete mode 100644 bksys/scons-mini.tar.bz2 delete mode 100644 src/SConscript diff --git a/SConstruct b/SConstruct deleted file mode 100644 index 99f08b0..0000000 --- a/SConstruct +++ /dev/null @@ -1,35 +0,0 @@ -#! /usr/bin/env python - -""" -help -> scons -h -compile -> scons -clean -> scons -c -install -> scons install -uninstall -> scons -c install -configure -> scons configure prefix=/tmp/ita debug=full extraincludes=/usr/local/include:/tmp/include prefix=/usr/local - -Run from a subdirectory -> scons -u -The variables are saved automatically after the first run (look at cache/kde.cache.py, ..) -""" - -################################################################### -# LOAD THE ENVIRONMENT AND SET UP THE TOOLS -################################################################### - -## Load the builders in config -env = Environment(tools=['default', 'generic', 'kde', 'parser'], toolpath=['./', './bksys']) -env.KDEuse("environ") - -#env['DUMPCONFIG']=1 - -################################################################### -# SCRIPTS FOR BUILDING THE TARGETS -################################################################### -env.set_build_dir('src po', 'build') -env.xmlfile('config.bks') - -################################################################### -# CONVENIENCE FUNCTIONS TO EMULATE 'make dist' and 'make distclean' -################################################################### -env.dist('wlassistant', '0.5.7') - diff --git a/bksys/generic.py b/bksys/generic.py deleted file mode 100644 index 6ca5cfa..0000000 --- a/bksys/generic.py +++ /dev/null @@ -1,644 +0,0 @@ -## Thomas Nagy, 2005 -""" Run scons -h to display the associated help, or look below """ - -import os, re, types, sys, string, shutil, stat, glob -import SCons.Defaults -import SCons.Tool -import SCons.Util -from SCons.Script.SConscript import SConsEnvironment -from SCons.Options import Options, PathOption - -def getreldir(lenv): - cwd=os.getcwd() - root=SCons.Node.FS.default_fs.Dir('#').abspath - return cwd.replace(root,'').lstrip('/') - -def dist(env, appname, version=None): - ### To make a tarball of your masterpiece, use 'scons dist' - import os - if 'dist' in sys.argv: - if not version: VERSION=os.popen("cat VERSION").read().rstrip() - else: VERSION=version - FOLDER = appname+'-'+VERSION - TMPFOLD = ".tmp"+FOLDER - ARCHIVE = FOLDER+'.tar.bz2' - - ## check if the temporary directory already exists - os.popen('rm -rf %s %s %s' % (FOLDER, TMPFOLD, ARCHIVE) ) - - ## create a temporary directory - startdir = os.getcwd() - - os.popen("mkdir -p "+TMPFOLD) - os.popen("cp -R * "+TMPFOLD) - os.popen("mv "+TMPFOLD+" "+FOLDER) - - ## remove scons-local if it is unpacked - os.popen("rm -rf "+FOLDER+"/scons "+FOLDER+"/sconsign "+FOLDER+"/scons-local-0.96.1") - - ## remove our object files first - os.popen("find "+FOLDER+" -name \"cache\" | xargs rm -rf") - os.popen("find "+FOLDER+" -name \"build\" | xargs rm -rf") - os.popen("find "+FOLDER+" -name \"*.pyc\" | xargs rm -f") - - ## CVS cleanup - os.popen("find "+FOLDER+" -name \"CVS\" | xargs rm -rf") - os.popen("find "+FOLDER+" -name \".cvsignore\" | xargs rm -rf") - - ## Subversion cleanup - os.popen("find %s -name .svn -type d | xargs rm -rf" % FOLDER) - - ## GNU Arch cleanup - os.popen("find "+FOLDER+" -name \"{arch}\" | xargs rm -rf") - os.popen("find "+FOLDER+" -name \".arch-i*\" | xargs rm -rf") - - ## Create the tarball (coloured output) - print "\033[92m"+"Writing archive "+ARCHIVE+"\033[0m" - os.popen("tar cjf "+ARCHIVE+" "+FOLDER) - - ## Remove the temporary directory - os.popen('rm -rf '+FOLDER) - env.Exit(0) - - if 'distclean' in sys.argv: - ## Remove the cache directory - import os, shutil - if os.path.isdir(env['CACHEDIR']): shutil.rmtree(env['CACHEDIR']) - os.popen("find . -name \"*.pyc\" | xargs rm -rf") - env.Exit(0) - -colors= { -'BOLD' :"\033[1m", -'RED' :"\033[91m", -'GREEN' :"\033[92m", -'YELLOW':"\033[1m", #"\033[93m" # unreadable on white backgrounds -'CYAN' :"\033[96m", -'NORMAL':"\033[0m", -} - -def pprint(env, col, str, label=''): - if env.has_key('NOCOLORS'): - print "%s %s" % (str, label) - return - try: mycol=colors[col] - except: mycol='' - print "%s%s%s %s" % (mycol, str, colors['NORMAL'], label) - -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='' - - # change the working directory before reading the targets - self.chdir='' - - # unix permissions - self.perms='' - - # these members are private - self.chdir_lock=None - self.dirprefix='./' - self.old_os_dir='' - self.old_fs_dir='' - self.p_local_shlibs=[] - self.p_local_staticlibs=[] - self.p_global_shlibs=[] - - self.p_localsource=None - self.p_localtarget=None - - # work directory - self.workdir_lock=None - self.orig_fs_dir=SCons.Node.FS.default_fs.getcwd() - self.not_orig_fs_dir='' - self.not_orig_os_dir='' - - if not env.has_key('USE_THE_FORCE_LUKE'): env['USE_THE_FORCE_LUKE']=[self] - else: env['USE_THE_FORCE_LUKE'].append(self) - - def joinpath(self, val): - if len(self.dirprefix)<3: return val - dir=self.dirprefix - thing=self.orenv.make_list(val) - files=[] - bdir="./" - if self.orenv.has_key('_BUILDDIR_'): bdir=self.orenv['_BUILDDIR_'] - for v in thing: files.append( self.orenv.join(bdir, dir, v) ) - return files - - # a list of paths, with absolute and relative ones - def fixpath(self, val): - def reldir(dir): - ndir = SCons.Node.FS.default_fs.Dir(dir).srcnode().abspath - rootdir = SCons.Node.FS.default_fs.Dir('#').abspath - return ndir.replace(rootdir, '').lstrip('/') - - dir=self.dirprefix - if not len(dir)>2: dir=reldir('.') - - thing=self.orenv.make_list(val) - ret=[] - bdir="./" - if self.orenv.has_key('_BUILDDIR_'): bdir=self.orenv['_BUILDDIR_'] - for v in thing: - #if v[:2] == "./" or v[:3] == "../": - # ret.append( self.orenv.join('#', bdir, dir, v) ) - #elif v[:1] == "#" or v[:1] == "/": - # ret.append( v ) - #else: - # ret.append( self.orenv.join('#', bdir, dir, v) ) - if v[:1] == "#" or v[:1] == "/": - ret.append(v) - else: - ret.append( self.orenv.join('#', bdir, dir, v) ) - - return ret - - def lockworkdir(self): - if self.workdir_lock: return - self.workdir_lock=1 - self.not_orig_fs_dir=SCons.Node.FS.default_fs.getcwd() - self.not_orig_os_dir=os.getcwd() - SCons.Node.FS.default_fs.chdir( self.orig_fs_dir, change_os_dir=1) - - def unlockworkdir(self): - if not self.workdir_lock: return - SCons.Node.FS.default_fs.chdir( self.not_orig_fs_dir, change_os_dir=0) - os.chdir(self.not_orig_os_dir) - self.workdir_lock=None - - def execute(self): - if self.executed: return - - if self.orenv.has_key('DUMPCONFIG'): - self.xml() - self.executed=1 - return - - self.env = self.orenv.Copy() - - if not self.p_localtarget: self.p_localtarget = self.joinpath(self.target) - if not self.p_localsource: self.p_localsource = self.joinpath(self.src) - - if (not self.src or len(self.src) == 0) and not self.p_localsource: - self.env.pprint('RED',"no source file given to object - self.src") - self.env.Exit(1) - if not self.target: - self.env.pprint('RED',"no target given to object - self.target") - 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.fixpath(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'] - 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(self.fixpath(sal[0]+'.so')[0]) - elif sal[1] in sext: self.p_local_staticlibs.append(self.fixpath(sal[0]+'.a')[0]) - 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.fixpath(self.libpaths)) - if len(self.linkflags)>0: self.env.PrependUnique(LINKFLAGS=self.env.make_list(self.linkflags)) - if len(self.p_local_shlibs)>0: - self.env.link_local_shlib(self.p_local_shlibs) - if len(self.p_local_staticlibs)>0: - self.env.link_local_staticlib(self.p_local_staticlibs) - - # the target to return - no more self.env modification is allowed after this part - ret=None - if self.type=='shlib' or self.type=='kioslave': - ret=self.env.bksys_shlib(self.p_localtarget, self.p_localsource, self.instdir, - self.libprefix, self.vnum) - elif self.type=='program': - ret=self.env.Program(self.p_localtarget, self.p_localsource) - if not self.env.has_key('NOAUTOINSTALL'): - ins=self.env.bksys_install(self.instdir, ret) - if ins and self.perms: - for i in ins: self.env.AddPostAction(ins, self.env.Chmod(str(i), self.perms)) - elif self.type=='staticlib': - ret=self.env.StaticLibrary(self.p_localtarget, self.p_localsource) - - # we link the program against a shared library made locally, add the dependency - if len(self.p_local_shlibs)>0: - if ret: self.env.Depends( ret, self.p_local_shlibs ) - if len(self.p_local_staticlibs)>0: - if ret: self.env.Depends( ret, self.p_local_staticlibs ) - - self.executed=1 - -## 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: - try: return s.split() - except AttributeError: return s - -def join(lenv, s1, s2, s3=None, s4=None): - if s4 and s3: return lenv.join(s1, s2, lenv.join(s3, s4)) - if s3 and s2: return lenv.join(s1, lenv.join(s2, s3)) - elif not s2: return s1 - # having s1, s2 - #print "path1 is "+s1+" path2 is "+s2+" "+os.path.join(s1,string.lstrip(s2,'/')) - if not s1: s1="/" - return os.path.join(s1,string.lstrip(s2,'/')) - -def exists(env): - return true - -# record a dump of the environment -bks_dump='\n\n' -def add_dump(nenv, str): - global bks_dump - if str: bks_dump+=str -def get_dump(nenv): - if not nenv.has_key('DUMPCONFIG'): - nenv.pprint('RED','WARNING: trying to get a dump while DUMPCONFIG is not set - this will not work') - global bks_dump - return bks_dump+"\n" - -def generate(env): - ## Bksys requires scons 0.96 - env.EnsureSConsVersion(0, 96) - - SConsEnvironment.pprint = pprint - SConsEnvironment.make_list = make_list - SConsEnvironment.join = join - SConsEnvironment.dist = dist - SConsEnvironment.getreldir = getreldir - SConsEnvironment.add_dump = add_dump - SConsEnvironment.get_dump = get_dump - - env['HELP']=0 - if '--help' in sys.argv or '-h' in sys.argv or 'help' in sys.argv: env['HELP']=1 - if env['HELP']: - p=env.pprint - p('BOLD','*** Instructions ***') - p('BOLD','--------------------') - p('BOLD','* scons ','to compile') - p('BOLD','* scons -j4 ','to compile with several instances') - p('BOLD','* scons install ','to compile and install') - p('BOLD','* scons -c install','to uninstall') - p('BOLD','\n*** Generic options ***') - p('BOLD','--------------------') - p('BOLD','* debug ','debug=1 (-g) or debug=full (-g3, slower) else use environment CXXFLAGS, or -O2 by default') - p('BOLD','* prefix ','the installation path') - p('BOLD','* extraincludes','a list of paths separated by ":"') - p('BOLD','* scons configure debug=full prefix=/usr/local extraincludes=/tmp/include:/usr/local') - p('BOLD','* scons install prefix=/opt/local DESTDIR=/tmp/blah\n') - return - - ## 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'] = env.join(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) - - SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod, lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode)) - - ## 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'] and env['ARGS'].has_key('DESTDIR'): dd=env['ARGS']['DESTDIR'] - if dd: - env['DESTDIR']=dd - env.pprint('CYAN','** Enabling DESTDIR for the project ** ',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 - - ## no colors - if os.environ.has_key('NOCOLORS'): env['NOCOLORS']=1 - - ## load the options - cachefile=env['CACHEDIR']+'generic.cache.py' - opts = Options(cachefile) - opts.AddOptions( - ( 'GENCCFLAGS', 'C flags' ), - ( 'BKS_DEBUG', 'debug level: full, trace, or just something' ), - ( 'GENCXXFLAGS', 'additional cxx flags for the project' ), - ( '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 not env['HELP'] and (env['_CONFIGURE'] or not env.has_key('ISCONFIGURED')): - # be paranoid, unset existing variables - for var in ['BKS_DEBUG', 'GENCXXFLAGS', 'GENCCFLAGS', 'GENLINKFLAGS', 'PREFIX', 'EXTRAINCLUDES', 'ISCONFIGURED', 'EXTRAINCLUDES']: - if env.has_key(var): env.__delitem__(var) - - if env['ARGS'].get('debug', None): - env['BKS_DEBUG'] = env['ARGS'].get('debug', None) - env.pprint('CYAN','** Enabling debug for the project **') - 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', '') ) - env.pprint('CYAN','** installation prefix for the project set to:',env['PREFIX']) - - # User-specified include paths - env['EXTRAINCLUDES'] = env['ARGS'].get('extraincludes', None) - if env['EXTRAINCLUDES']: - env.pprint('CYAN','** extra include paths for the project set to:',env['EXTRAINCLUDES']) - - env['ISCONFIGURED']=1 - - # And finally save the options in the cache - opts.Save(cachefile, env) - - def bksys_install(lenv, subdir, files, destfile=None, perms=None): - """ Install files on 'scons install' """ - if not env['_INSTALL']: return - basedir = env['DESTDIR'] - install_list=None - if not destfile: install_list = env.Install(lenv.join(basedir,subdir), lenv.make_list(files)) - elif subdir: install_list = env.InstallAs(lenv.join(basedir,subdir,destfile), lenv.make_list(files)) - else: install_list = env.InstallAs(lenv.join(basedir,destfile), lenv.make_list(files)) - if perms and install_list: lenv.AddPostAction(install_list, lenv.Chmod(install_list, perms)) - env.Alias('install', install_list) - return install_list - - def build_la_file(target, source, env): - """ Writes a .la file, used by libtool """ - dest=open(target[0].path, 'w') - sname=source[0].name - dest.write("# Generated by ltmain.sh - GNU libtool 1.5.18 - (pwn3d by bksys)\n#\n#\n") - 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("dlname='%s'\n" % (name+'.'+str(nums[0])) ) - dest.write("library_names='%s'\n" % (strn) ) - else: - dest.write("dlname='%s'\n" % sname) - 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, ntarget, source, libdir, libprefix='lib', vnum='', noinst=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. - """ - # parameter can be a list - if type(ntarget) is types.ListType: target=ntarget[0] - else: target=ntarget - - 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)) - num=vnum.split('.')[0] - lst=target.split('/') - tname=lst[len(lst)-1] - libname=tname.split('.')[0] - thisenv.AppendUnique(LINKFLAGS = ["-Wl,--soname=%s.so.%s" % (libname, num)] ) - - # 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) - thisenv.bksys_install(libdir, lafile_list) - - ## 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) - thisenv.bksys_install(libdir, nm1) - thisenv.bksys_install(libdir, nm2) - return library_list - - # Declare scons scripts to process - def subdirs(lenv, folderlist): - flist=lenv.make_list(folderlist) - for i in flist: - lenv.SConscript(lenv.join(i, 'SConscript')) - # take all objects - warn those who are not already executed - if lenv.has_key('USE_THE_FORCE_LUKE'): - for ke in lenv['USE_THE_FORCE_LUKE']: - if ke.executed: continue - #lenv.pprint('GREEN',"you forgot to execute object "+ke.target) - ke.lockworkdir() - ke.execute() - ke.unlockworkdir() - - 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: - 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) - else: - 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]) - - def set_build_dir(lenv, dirs, buildto): - lenv.SetOption('duplicate', 'soft-copy') - lenv['_BUILDDIR_']=buildto - ldirs=lenv.make_list(dirs) - for dir in ldirs: - lenv.BuildDir(buildto+os.path.sep+dir, dir) - - #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 - SConsEnvironment.set_build_dir=set_build_dir - - if env.has_key('GENCXXFLAGS'): env.AppendUnique( CPPFLAGS = 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('BKS_DEBUG'): - if (env['BKS_DEBUG'] == "full"): - env.AppendUnique(CXXFLAGS = ['-DDEBUG', '-g3', '-Wall']) - elif (env['BKS_DEBUG'] == "trace"): - env.AppendUnique( - LINKFLAGS=env.Split("-lmrwlog4cxxconfiguration -lmrwautofunctiontracelog4cxx -finstrument-functions"), - CXXFLAGS=env.Split("-DDEBUG -Wall -finstrument-functions -g3 -O0")) - else: - env.AppendUnique(CXXFLAGS = ['-DDEBUG', '-g', '-Wall']) - - 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') diff --git a/bksys/kde.py b/bksys/kde.py deleted file mode 100644 index 46c9371..0000000 --- a/bksys/kde.py +++ /dev/null @@ -1,887 +0,0 @@ -# Thomas Nagy, 2005 -""" Run scons -h to display the associated help, or look below """ - -import os, re, types -from SCons.Script.SConscript import SConsEnvironment - -# Returns the name of the shared object (eg: libtdeui.so.4) -# referenced by a libtool archive (like libtdeui.la) -def getSOfromLA(lafile): - contents = open(lafile, 'r').read() - match = re.search("^dlname='([^']*)'$", contents, re.M) - if match: return match.group(1) - return None - -# A helper, needed .. everywhere -def KDEuse(lenv, flags): - if lenv['HELP']: lenv.Exit(0) - - _flags=lenv.make_list(flags) - if 'environ' in _flags: - ## The scons developers advise against using this but it is mostly innocuous :) - lenv.AppendUnique( ENV = os.environ ) - if not 'lang_qt' in _flags: - ## Use this define if you are using the kde translation scheme (.po files) - lenv.Append( CPPFLAGS = '-DQT_NO_TRANSLATION' ) - if 'rpath' in _flags: - ## Use this to set rpath - this may cause trouble if folders are moved (chrpath) - kdelibpaths=[] - if lenv['KDELIBPATH'] == lenv['KDELIB']: kdelibpaths = [lenv['KDELIB']] - else: kdelibpaths = [lenv['KDELIBPATH'], lenv['KDELIB']] - lenv.Append( RPATH = [lenv['QTLIBPATH'], lenv['KDEMODULE']]+kdelibpaths ) - if 'thread' in _flags: - ## Uncomment the following if you need threading support - lenv.KDEaddflags_cxx( ['-DQT_THREAD_SUPPORT', '-D_REENTRANT'] ) - if 'fasmoc' in _flags: - lenv['BKSYS_FASTMOC']=1 - if 'dump' in _flags: - lenv['DUMPCONFIG']=1 - if not 'nohelp' in _flags: - if lenv['_CONFIGURE'] or lenv['HELP']: lenv.Exit(0) - if not 'nosmart' or not lenv.has_key('nosmart_includes'): - lenv.AppendUnique(CPPPATH=['#/']) - lst=[] - if lenv.has_key('USE_THE_FORCE_LUKE'): - lst=lenv['USE_THE_FORCE_LUKE'] - lenv.__delitem__('USE_THE_FORCE_LUKE') - for v in lst: v.execute() - else: lenv['nosmart_includes']=1 - - ## To use kdDebug(intvalue)<<"some trace"</dev/null").read().strip() - if len(uic): - p('YELLOW',"uic-tqt was found as "+uic) - else: - uic = os.popen("which uic-tqt 2>/dev/null").read().strip() - if len(uic): - p('YELLOW',"uic-tqt was found as "+uic) - else: - p('RED',"uic-tqt was not found - set QTDIR put it in your PATH ?") - env.Exit(1) - env['QT_UIC'] = uic - - print "Checking for moc : ", - moc = qtdir + "/bin/moc" - if os.path.isfile(moc): - p('GREEN',"moc was found as "+moc) - else: - moc = os.popen("which moc 2>/dev/null").read().strip() - if len(moc): - p('YELLOW',"moc was found as "+moc) - elif os.path.isfile("/usr/share/qt3/bin/moc"): - moc = "/usr/share/qt3/bin/moc" - p('YELLOW',"moc was found as "+moc) - else: - p('RED',"moc was not found - set QTDIR or put it in your PATH ?") - env.Exit(1) - env['QT_MOC'] = moc - - ## check for the tqt and kde includes - print "Checking for the tqt includes : ", - if qtincludes and os.path.isfile(qtincludes + "/tqt.h"): - # The user told where to look for and it looks valid - p('GREEN',"ok "+qtincludes) - else: - if os.path.isfile(qtdir + "/include/tqt.h"): - # Automatic detection - p('GREEN',"ok "+qtdir+"/include/") - qtincludes = qtdir + "/include/" - elif os.path.isfile("/usr/include/tqt.h"): - p('YELLOW','the qt headers were found in /usr/include/') - qtincludes = "/usr/include" - elif os.path.isfile("/usr/include/tqt/tqt.h"): - # Debian probably - p('YELLOW','the qt headers were found in /usr/include/tqt/') - qtincludes = "/usr/include/tqt" - else: - p('RED',"the tqt headers were not found") - env.Exit(1) - - print "Checking for the kde includes : ", - kdeprefix = os.popen(kde_config+" --prefix").read().strip() - if not kdeincludes: - kdeincludes = kdeprefix+"/include/" - if os.path.isfile(kdeincludes + "/klineedit.h"): - p('GREEN',"ok "+kdeincludes) - else: - if os.path.isfile(kdeprefix+"/include/kde/klineedit.h"): - # Debian, Fedora probably - p('YELLOW',"the kde headers were found in %s/include/kde/"%kdeprefix) - kdeincludes = kdeprefix + "/include/kde/" - else: - p('RED',"The kde includes were NOT found") - env.Exit(1) - - # kde-config options - kdec_opts = {'KDEBIN' : 'exe', 'KDEAPPS' : 'apps', - 'KDEDATA' : 'data', 'KDEICONS' : 'icon', - 'KDEMODULE' : 'module', 'KDELOCALE' : 'locale', - 'KDEKCFG' : 'kcfg', 'KDEDOC' : 'html', - 'KDEMENU' : 'apps', 'KDEXDG' : 'xdgdata-apps', - 'KDEMIME' : 'mime', 'KDEXDGDIR' : 'xdgdata-dirs', - 'KDESERV' : 'services','KDESERVTYPES' : 'servicetypes', - 'KDEINCLUDE': 'include' } - - if prefix: - ## use the user-specified prefix - if not execprefix: execprefix=prefix - if not datadir: datadir=env.join(prefix,'share') - if not libdir: libdir=env.join(execprefix, "lib"+libsuffix) - - subst_vars = lambda x: x.replace('${exec_prefix}', execprefix)\ - .replace('${datadir}', datadir)\ - .replace('${libdir}', libdir)\ - .replace('${prefix}', prefix) - debian_fix = lambda x: x.replace('/usr/share', '${datadir}') - env['PREFIX'] = prefix - env['KDELIB'] = libdir - for (var, option) in kdec_opts.items(): - dir = os.popen(kde_config+' --install ' + option).read().strip() - if var == 'KDEDOC': dir = debian_fix(dir) - env[var] = subst_vars(dir) - - else: - env['PREFIX'] = os.popen(kde_config+' --expandvars --prefix').read().strip() - env['KDELIB'] = os.popen(kde_config+' --expandvars --install lib').read().strip() - for (var, option) in kdec_opts.items(): - dir = os.popen(kde_config+' --expandvars --install ' + option).read().strip() - env[var] = dir - - env['QTPLUGINS']=os.popen(kde_config+' --expandvars --install qtplugins').read().strip() - - ## kde libs and includes - env['KDEINCLUDEPATH']=kdeincludes - if not tdelibs: - tdelibs=os.popen(kde_config+' --expandvars --install lib').read().strip() - env['KDELIBPATH']=tdelibs - - ## qt libs and includes - env['QTINCLUDEPATH']=qtincludes - if not qtlibs: - qtlibs=qtdir+"/lib"+libsuffix - env['QTLIBPATH']=qtlibs - -def generate(env): - """"Set up the qt and kde environment and builders - the moc part is difficult to understand """ - - # attach this function immediately - SConsEnvironment.KDEuse=KDEuse - - if env['HELP']: - p=env.pprint - p('BOLD','*** KDE options ***') - p('BOLD','--------------------') - p('BOLD','* prefix ','base install path, ie: /usr/local') - p('BOLD','* execprefix ','install path for binaries, ie: /usr/bin') - p('BOLD','* datadir ','install path for the data, ie: /usr/local/share') - p('BOLD','* libdir ','install path for the libs, ie: /usr/lib') - - p('BOLD','* qtdir ','base of the kde libraries') - p('BOLD','* kdedir ','base of the qt libraries') - - p('BOLD','* libsuffix ','suffix of libraries on amd64, ie: 64, 32') - p('BOLD','* kdeincludes','kde includes path (/usr/include/kde on debian, ..)') - p('BOLD','* qtincludes ','qt includes path (/usr/include/qt on debian, ..)') - p('BOLD','* tdelibs ','kde libraries path, for linking the programs') - p('BOLD','* qtlibs ','qt libraries path, for linking the program') - - p('BOLD','* scons configure libdir=/usr/local/lib qtincludes=/usr/include/qt\n') - return - - import SCons.Defaults - import SCons.Tool - import SCons.Util - import SCons.Node - - def reldir(dir): - ndir = SCons.Node.FS.default_fs.Dir(dir).srcnode().abspath - rootdir = SCons.Node.FS.default_fs.Dir('#').abspath - return ndir.replace(rootdir, '').lstrip('/') - - def relfile(file): - nfile = SCons.Node.FS.default_fs.File(file).srcnode().abspath - rootdir = SCons.Node.FS.default_fs.Dir('#').abspath - return nfile.replace(rootdir, '').lstrip('/') - - CLVar = SCons.Util.CLVar - splitext = SCons.Util.splitext - Builder = SCons.Builder.Builder - - # Detect the environment - replaces ./configure implicitely and store the options into a cache - from SCons.Options import Options - cachefile=env['CACHEDIR']+'kde.cache.py' - opts = Options(cachefile) - opts.AddOptions( - ('PREFIX', 'root of the program installation'), - - ('QTDIR', ''), - ('QTLIBPATH', 'path to the qt libraries'), - ('QTINCLUDEPATH', 'path to the qt includes'), - ('QT_UIC', 'uic command'), - ('QT_MOC', 'moc command'), - ('QTPLUGINS', 'uic executable command'), - - ('KDEDIR', ''), - ('KDELIBPATH', 'path to the installed kde libs'), - ('KDEINCLUDEPATH', 'path to the installed kde includes'), - - ('KDEBIN', 'inst path of the kde binaries'), - ('KDEINCLUDE', 'inst path of the kde include files'), - ('KDELIB', 'inst path of the kde libraries'), - ('KDEMODULE', 'inst path of the parts and libs'), - ('KDEDATA', 'inst path of the application data'), - ('KDELOCALE', ''), ('KDEDOC', ''), ('KDEKCFG', ''), - ('KDEXDG', ''), ('KDEXDGDIR', ''), ('KDEMENU', ''), - ('KDEMIME', ''), ('KDEICONS', ''), ('KDESERV', ''), - ('KDESERVTYPES', ''), ('KDEAPPS', ''), - ) - opts.Update(env) - - def getInstDirForResType(lenv,restype): - if len(restype) == 0 or not lenv.has_key(restype): - lenv.pprint('RED',"unknown resource type "+restype) - lenv.Exit(1) - else: instdir = lenv[restype] - - if env['ARGS'] and env['ARGS'].has_key('prefix'): - instdir = instdir.replace(lenv['PREFIX'], env['ARGS']['prefix']) - return instdir - - # reconfigure when things are missing - if not env['HELP'] and (env['_CONFIGURE'] or not env.has_key('QTDIR') or not env.has_key('KDEDIR')): - detect_kde(env) - opts.Save(cachefile, env) - - ## set default variables, one can override them in sconscript files - env.Append(CXXFLAGS = ['-I'+env['KDEINCLUDEPATH'], '-I'+env['QTINCLUDEPATH'], '-I/usr/include/qt3', '-I/usr/include/qt4', '-includetqt.h' ], - LIBPATH = [env['KDELIBPATH'], env['QTLIBPATH'] ]) - - env['QT_AUTOSCAN'] = 1 - env['QT_DEBUG'] = 0 - - env['MEINPROC'] = 'meinproc' - env['MSGFMT'] = 'msgfmt' - - ## ui file processing - def uic_processing(target, source, env): - inc_kde ='#include \n#include \n' - inc_moc ='#include "%s"\n' % target[2].name - comp_h ='$QT_UIC -L $QTPLUGINS -nounload -o %s %s' % (target[0].path, source[0].path) - comp_c ='$QT_UIC -L $QTPLUGINS -nounload -tr tr2i18n -impl %s %s' % (target[0].path, source[0].path) - comp_moc ='$QT_MOC -o %s %s' % (target[2].path, target[0].path) - if env.Execute(comp_h): return ret - dest = open( target[1].path, "w" ) - dest.write(inc_kde) - dest.close() - if env.Execute( comp_c+" >> "+target[1].path ): return ret - dest = open( target[1].path, "a" ) - dest.write(inc_moc) - dest.close() - ret = env.Execute( comp_moc ) - return ret - def uicEmitter(target, source, env): - adjustixes = SCons.Util.adjustixes - bs = SCons.Util.splitext(str(source[0].name))[0] - bs = env.join(str(target[0].get_dir()),bs) - target.append(bs+'.cpp') - target.append(bs+'.moc') - return target, source - env['BUILDERS']['Uic']=Builder(action=uic_processing,emitter=uicEmitter,suffix='.h',src_suffix='.ui') - - def kcfg_buildit(target, source, env): - comp='kconfig_compiler -d%s %s %s' % (str(source[0].get_dir()), source[1].path, source[0].path) - return env.Execute(comp) - def kcfg_stringit(target, source, env): - print "processing %s to get %s and %s" % (source[0].name, target[0].name, target[1].name) - def kcfgEmitter(target, source, env): - adjustixes = SCons.Util.adjustixes - file=str(source[0].srcnode().name) - bs = SCons.Util.splitext(str(source[0].name))[0] - bs = env.join(str(target[0].get_dir()),bs) - # .h file is already there - target.append( bs+'.cpp' ) - - content=source[0].srcnode().get_contents() - - kcfgfilename="" - kcfgFileDeclRx = re.compile("[fF]ile\s*=\s*(.+)\s*") - match = kcfgFileDeclRx.search(content) - if match: kcfgfilename = match.group(1) - - if not kcfgfilename: - env.pprint('RED','invalid kcfgc file '+source[0].srcnode().abspath) - env.Exit(1) - source.append( env.join( str(source[0].get_dir()), kcfgfilename) ) - return target, source - - env['BUILDERS']['Kcfg']=Builder(action=env.Action(kcfg_buildit, kcfg_stringit), - emitter=kcfgEmitter, suffix='.h', src_suffix='.kcfgc') - - ## MOC processing - env['BUILDERS']['Moc']=Builder(action='$QT_MOC -o $TARGET $SOURCE',suffix='.moc',src_suffix='.h') - env['BUILDERS']['Moccpp']=Builder(action='$QT_MOC -o $TARGET $SOURCE',suffix='_moc.cpp',src_suffix='.h') - - ## KIDL file - env['BUILDERS']['Kidl']=Builder(action= 'dcopidl $SOURCE > $TARGET || (rm -f $TARGET ; false)', - suffix='.kidl', src_suffix='.h') - ## DCOP - env['BUILDERS']['Dcop']=Builder(action='dcopidl2cpp --c++-suffix cpp --no-signals --no-stub $SOURCE', - suffix='_skel.cpp', src_suffix='.kidl') - ## STUB - env['BUILDERS']['Stub']=Builder(action= 'dcopidl2cpp --c++-suffix cpp --no-signals --no-skel $SOURCE', - suffix='_stub.cpp', src_suffix='.kidl') - ## DOCUMENTATION - env['BUILDERS']['Meinproc']=Builder(action='cd $TARGET.dir && $MEINPROC --check --cache $TARGET.name $SOURCE.name', - suffix='.cache.bz2') - ## TRANSLATIONS - env['BUILDERS']['Transfiles']=Builder(action='$MSGFMT $SOURCE -o $TARGET',suffix='.gmo',src_suffix='.po') - - ## Handy helpers for building kde programs - ## You should not have to modify them .. - - ui_ext = [".ui"] - kcfg_ext = ['.kcfgc'] - header_ext = [".h", ".hxx", ".hpp", ".hh"] - cpp_ext = [".cpp", ".cxx", ".cc"] - skel_ext = [".skel", ".SKEL"] - stub_ext = [".stub", ".STUB"] - - def KDEfiles(lenv, target, source): - """ Returns a list of files for scons (handles kde tricks like .skel) - It also makes custom checks against double includes like : ['file.ui', 'file.cpp'] - (file.cpp is already included because of file.ui) """ - - # ITA - #print "kdefiles" - - q_object_search = re.compile(r'[^A-Za-z0-9]Q_OBJECT[^A-Za-z0-9]') - def scan_moc(cppfile): - addfile=None - - # try to find the header - orifile=cppfile.srcnode().name - bs=SCons.Util.splitext(orifile)[0] - - h_file='' - dir=cppfile.dir - for n_h_ext in header_ext: - afile=dir.File(bs+n_h_ext) - if afile.rexists(): - #h_ext=n_h_ext - h_file=afile - break - # We have the header corresponding to the cpp file - if h_file: - h_contents = h_file.get_contents() - if q_object_search.search(h_contents): - # we know now there is Q_OBJECT macro - reg = '\n\s*#include\s*("|<)'+str(bs)+'.moc("|>)' - meta_object_search = re.compile(reg) - #cpp_contents = open(file_cpp, 'rb').read() - cpp_contents=cppfile.get_contents() - if meta_object_search.search(cpp_contents): - lenv.Moc(h_file) - else: - lenv.Moccpp(h_file) - addfile=bs+'_moc.cpp' - print "WARNING: moc.cpp for "+h_file.name+" consider using #include instead" - return addfile - - src=[] - ui_files=[] - kcfg_files=[] - other_files=[] - kidl=[] - - source_=lenv.make_list(source) - - # For each file, check wether it is a dcop file or not, and create the complete list of sources - for file in source_: - - sfile=SCons.Node.FS.default_fs.File(str(file)) # why str(file) ? because ordinal not in range issues - bs = SCons.Util.splitext(file)[0] - ext = SCons.Util.splitext(file)[1] - if ext in skel_ext: - if not bs in kidl: - kidl.append(bs) - lenv.Dcop(bs+'.kidl') - src.append(bs+'_skel.cpp') - elif ext in stub_ext: - if not bs in kidl: - kidl.append(bs) - lenv.Stub(bs+'.kidl') - src.append(bs+'_stub.cpp') - elif ext == ".moch": - lenv.Moccpp(bs+'.h') - src.append(bs+'_moc.cpp') - elif ext in cpp_ext: - src.append(file) - if not env.has_key('NOMOCFILE'): - ret = scan_moc(sfile) - if ret: src.append( sfile.dir.File(ret) ) - elif ext in ui_ext: - lenv.Uic(file) - src.append(bs+'.cpp') - elif ext in kcfg_ext: - name=SCons.Util.splitext(sfile.name)[0] - hfile=lenv.Kcfg(file) - cppkcfgfile=sfile.dir.File(bs+'.cpp') - src.append(bs+'.cpp') - else: - src.append(file) - - for base in kidl: lenv.Kidl(base+'.h') - - # Now check against typical newbie errors - for file in ui_files: - for ofile in other_files: - if ofile == file: - env.pprint('RED',"WARNING: You have included %s.ui and another file of the same prefix"%file) - print "Files generated by uic (file.h, file.cpp must not be included" - for file in kcfg_files: - for ofile in other_files: - if ofile == file: - env.pprint('RED',"WARNING: You have included %s.kcfg and another file of the same prefix"%file) - print "Files generated by kconfig_compiler (settings.h, settings.cpp) must not be included" - # ITA - #print "end kdefiles" - return src - - - """ In the future, these functions will contain the code that will dump the - configuration for re-use from an IDE """ - def KDEinstall(lenv, restype, subdir, files, perms=None): - if env.has_key('DUMPCONFIG'): - ret= "\n" % (restype, subdir) - for i in lenv.make_list(files): - ret += " \n" % (relfile(i)) - ret += "\n" - lenv.add_dump(ret) - return None - - if not env['_INSTALL']: return None - dir = getInstDirForResType(lenv, restype) - - p=None - if not perms: - if restype=='KDEBIN': p=0755 - else: p=perms - install_list = lenv.bksys_install(lenv.join(dir, subdir), files, perms=p) - return install_list - - def KDEinstallas(lenv, restype, destfile, file): - if not env['_INSTALL']: return - dir = getInstDirForResType(lenv, restype) - install_list = lenv.InstallAs(lenv.join(dir, destfile), file) - env.Alias('install', install_list) - return install_list - - def KDEprogram(lenv, target, source, - includes='', localshlibs='', globallibs='', globalcxxflags=''): - """ Makes a kde program - The program is installed except if one sets env['NOAUTOINSTALL'] """ - src = KDEfiles(lenv, target, source) - program_list = lenv.Program(target, src) - - # we link the program against a shared library done locally, add the dependency - if not lenv.has_key('nosmart_includes'): - lenv.AppendUnique(CPPPATH=['./']) - if len(localshlibs)>0: - lst=lenv.make_list(localshlibs) - lenv.link_local_shlib(lst) - lenv.Depends( program_list, lst ) - - if len(includes)>0: lenv.KDEaddpaths_includes(includes) - if len(globallibs)>0: lenv.KDEaddlibs(globallibs) - if len(globalcxxflags)>0: lenv.KDEaddflags_cxx(globalcxxflags) - - if not lenv.has_key('NOAUTOINSTALL'): - KDEinstall(lenv, 'KDEBIN', '', target) - return program_list - - def KDEshlib(lenv, target, source, kdelib=0, libprefix='lib', - includes='', localshlibs='', globallibs='', globalcxxflags='', vnum=''): - """ Makes a shared library for kde (.la file for klibloader) - The library is installed except if one sets env['NOAUTOINSTALL'] """ - src = KDEfiles(lenv, target, source) - - if not lenv.has_key('nosmart_includes'): - lenv.AppendUnique(CPPPATH=['./']) - # we link the program against a shared library done locally, add the dependency - lst=[] - if len(localshlibs)>0: - lst=lenv.make_list(localshlibs) - lenv.link_local_shlib(lst) - if len(includes)>0: lenv.KDEaddpaths_includes(includes) - if len(globallibs)>0: lenv.KDEaddlibs(globallibs) - if len(globalcxxflags)>0: lenv.KDEaddflags_cxx(globalcxxflags) - - restype='KDEMODULE' - if kdelib==1: restype='KDELIB' - - library_list = lenv.bksys_shlib(target, src, getInstDirForResType(lenv, restype), libprefix, vnum) - if len(lst)>0: lenv.Depends( library_list, lst ) - - return library_list - - def KDEstaticlib(lenv, target, source): - """ Makes a static library for kde - in practice you should not use static libraries - 1. they take more memory than shared ones - 2. makefile.am needed it because of limitations - (cannot handle sources in separate folders - takes extra processing) """ - if not lenv.has_key('nosmart_includes'): lenv.AppendUnique(CPPPATH=['./']) - src=KDEfiles(lenv, target, source) - return lenv.StaticLibrary(target, src) - # do not install static libraries by default - - def KDEaddflags_cxx(lenv, fl): - """ Compilation flags for C++ programs """ - lenv.AppendUnique(CXXFLAGS = lenv.make_list(fl)) - - def KDEaddflags_c(lenv, fl): - """ Compilation flags for C programs """ - lenv.AppendUnique(CFLAGS = lenv.make_list(fl)) - - def KDEaddflags_link(lenv, fl): - """ Add link flags - Use this if KDEaddlibs below is not enough """ - lenv.PrependUnique(LINKFLAGS = lenv.make_list(fl)) - - def KDEaddlibs(lenv, libs): - """ Helper function """ - lenv.AppendUnique(LIBS = lenv.make_list(libs)) - - def KDEaddpaths_includes(lenv, paths): - """ Add new include paths """ - lenv.AppendUnique(CPPPATH = lenv.make_list(paths)) - - def KDEaddpaths_libs(lenv, paths): - """ Add paths to libraries """ - lenv.PrependUnique(LIBPATH = lenv.make_list(paths)) - - def KDElang(lenv, folder, appname): - """ Process translations (.po files) in a po/ dir """ - import glob - dir=SCons.Node.FS.default_fs.Dir(folder).srcnode() - fld=dir.srcnode() - tmptransfiles = glob.glob(str(fld)+'/*.po') - - if lenv.has_key('DUMPCONFIG'): - lenv.add_dump( "\n" % (reldir(dir), appname) ) - return - - transfiles=[] - if lenv.has_key('_BUILDDIR_'): - bdir=lenv['_BUILDDIR_'] - for pof in lenv.make_list(tmptransfiles): - # ITA - d=relfile(pof) - d2=d.replace(bdir,'').lstrip('/') - d3=lenv.join(bdir, d2) - #print d2 - #print d3 - transfiles.append( lenv.join('#', bdir, d2) ) - else: transfiles=tmptransfiles - - languages=None - if lenv['ARGS'] and lenv['ARGS'].has_key('languages'): - languages=lenv.make_list(lenv['ARGS']['languages']) - mydir=SCons.Node.FS.default_fs.Dir('.') - for f in transfiles: - #fname=f.replace(mydir.abspath, '') - fname=f - file=SCons.Node.FS.default_fs.File(fname) - country = SCons.Util.splitext(file.name)[0] - if not languages or country in languages: - result = lenv.Transfiles(file) - dir=lenv.join( getInstDirForResType(lenv, 'KDELOCALE'), country) - lenv.bksys_install(lenv.join(dir, 'LC_MESSAGES'), result, destfile=appname+'.mo') - - def KDEicon(lenv, icname='*', path='./', restype='KDEICONS', subdir=''): - """Contributed by: "Andrey Golovizin" - modified by "Martin Ellis" - - Installs icons with filenames such as cr22-action-frame.png into - KDE icon hierachy with names like icons/crystalsvg/22x22/actions/frame.png. - - Global KDE icons can be installed simply using env.KDEicon('name'). - The second parameter, path, is optional, and specifies the icons - location in the source, relative to the SConscript file. - - To install icons that need to go under an applications directory (to - avoid name conflicts, for example), use e.g. - env.KDEicon('name', './', 'KDEDATA', 'appname/icons')""" - - if lenv.has_key('DUMPCONFIG'): - lenv.add_dump( "\n" ) - lenv.add_dump( " \n" % (reldir(path), subdir) ) - lenv.add_dump( "\n" ) - return - - type_dic = { 'action':'actions', 'app':'apps', 'device':'devices', - 'filesys':'filesystems', 'mime':'mimetypes' } - dir_dic = { - 'los' :'locolor/16x16', 'lom' :'locolor/32x32', - 'him' :'hicolor/32x32', 'hil' :'hicolor/48x48', - 'lo16' :'locolor/16x16', 'lo22' :'locolor/22x22', 'lo32' :'locolor/32x32', - 'hi16' :'hicolor/16x16', 'hi22' :'hicolor/22x22', 'hi32' :'hicolor/32x32', - 'hi48' :'hicolor/48x48', 'hi64' :'hicolor/64x64', 'hi128':'hicolor/128x128', - 'hisc' :'hicolor/scalable', - 'cr16' :'crystalsvg/16x16', 'cr22' :'crystalsvg/22x22', 'cr32' :'crystalsvg/32x32', - 'cr48' :'crystalsvg/48x48', 'cr64' :'crystalsvg/64x64', 'cr128':'crystalsvg/128x128', - 'crsc' :'crystalsvg/scalable' - } - - iconfiles = [] - dir=SCons.Node.FS.default_fs.Dir(path).srcnode() - mydir=SCons.Node.FS.default_fs.Dir('.') - import glob - for ext in ['png', 'xpm', 'mng', 'svg', 'svgz']: - files = glob.glob(str(dir)+'/'+'*-*-%s.%s' % (icname, ext)) - for file in files: - iconfiles.append( file.replace(mydir.abspath, '') ) - for iconfile in iconfiles: - lst = iconfile.split('/') - filename = lst[ len(lst) - 1 ] - tmp = filename.split('-') - if len(tmp)!=3: - env.pprint('RED','WARNING: icon filename has unknown format: '+iconfile) - continue - [icon_dir, icon_type, icon_filename]=tmp - try: - basedir=getInstDirForResType(lenv, restype) - destdir = '%s/%s/%s/%s/' % (basedir, subdir, dir_dic[icon_dir], type_dic[icon_type]) - except KeyError: - env.pprint('RED','WARNING: unknown icon type: '+iconfile) - continue - lenv.bksys_install(destdir, iconfile, icon_filename) - - ## This function uses env imported above - WARNING ugly code, i will have to rewrite (ITA) - def docfolder(lenv, folder, lang, destination=""): - # folder is the folder to process - # lang is the language - # destination is the subdirectory in KDEDOC (appname) - import glob - docfiles=[] - dir=SCons.Node.FS.default_fs.Dir(folder).srcnode() - mydir=SCons.Node.FS.default_fs.Dir('.') - dirpath=mydir.srcnode().abspath - docg = glob.glob(str(dir)+"/???*.*") # file files that are at least 4 chars wide :) - for file in docg: - f = file.replace(dirpath, '') - docfiles.append(f) - - if lenv.has_key('DUMPCONFIG'): - lenv.add_dump( "\n" % destination) - lenv.add_dump( " \n" % (lang, reldir(dir)) ) - lenv.add_dump( "\n" ) - return - - # warn about errors - #if len(lang) != 2: - # print "error, lang must be a two-letter string, like 'en'" - - # when the destination is not given, use the folder - if len(destination) == 0: destination=folder - docbook_list = [] - - bdir='.' - if lenv.has_key('_BUILDDIR_'): bdir = lenv['_BUILDDIR_'] - for file in docfiles: - # do not process folders - #if not os.path.isfile( lenv.join('.', file) ): continue - - # build a node representing the file in the build directory to force symlinking - nodefile=relfile( lenv.join(mydir.abspath, file) ) - #print nodefile - #nodefile=relfile( lenv.join(self.dirprefix, file) ) - nodefile=SCons.Node.FS.default_fs.File( lenv.join('#', bdir, nodefile) ) - #print nodefile.abspath - - # do not process the cache file - if file == 'index.cache.bz2': continue - # ignore invalid files (TODO??) - if len( SCons.Util.splitext( file ) ) <= 1: continue - ext = SCons.Util.splitext( file )[1] - - # install picture files - if ext in ['.jpeg', '.jpg', '.png']: lenv.KDEinstall('KDEDOC', lenv.join(lang,destination), nodefile.abspath) - # docbook files are processed by meinproc - if ext != '.docbook': continue - - docbook_list.append( nodefile ) - lenv.KDEinstall('KDEDOC', lenv.join(lang,destination), nodefile.abspath) - - # Now process the index.docbook files .. - if len(docbook_list) == 0: return - - index='' - cache='' - for file in docbook_list: - if file.name=='index.docbook': - index=file - cache=file.dir.File('index.cache.bz2') - - if not index: - print "BUG in docfolder: no index.docbook but docbook files found" - lenv.Exit(1) - - for file in docbook_list: - # make the cache.bz2 file depend on all .docbook files in the same dir - lenv.Depends( cache, file ) - - lenv.Meinproc( cache, index ) - lenv.KDEinstall( 'KDEDOC', lenv.join(lang,destination), cache ) - - if env['_INSTALL']: - dir=lenv.join(env['DESTDIR'], lenv.getInstDirForResType('KDEDOC'), lang, destination) - comp='mkdir -p %s && cd %s && rm -f common && ln -s ../common common' % (dir, dir) - lenv.Execute(comp) - - #self.env.AddPostAction(lenv.join(dir, 'common'), self.env.Chmod(ins, self.perms)) - # TODO add post action of cache (index.cache.bz2) - - #valid_targets = "program shlib kioslave staticlib".split() - import generic - class kobject(generic.genobj): - def __init__(self, val, senv=None): - if senv: generic.genobj.__init__(self, val, senv) - else: generic.genobj.__init__(self, val, env) - self.iskdelib=0 - def it_is_a_kdelib(self): self.iskdelib=1 - def execute(self): - if self.executed: return - if self.orenv.has_key('DUMPCONFIG'): - self.executed=1 - self.xml() - return - if (self.type=='shlib' or self.type=='kioslave'): - install_dir = 'KDEMODULE' - if self.iskdelib==1: install_dir = 'KDELIB' - self.instdir=getInstDirForResType(self.orenv, install_dir) - elif self.type=='program': - self.instdir=getInstDirForResType(self.orenv, 'KDEBIN') - self.perms=0755 - - # ITA - #print self.source - #print "hallo" - self.p_localsource=KDEfiles(env, self.joinpath(self.target), self.joinpath(self.source)) - # ITA - #print self.p_localsource - generic.genobj.execute(self) - - def xml(self): - dirprefix = reldir('.') - if not dirprefix: dirprefix=self.dirprefix - ret='\n' % (self.type, dirprefix, self.target, self.cxxflags, self.cflags, self.includes, self.linkflags, self.libpaths, self.libs, self.vnum, self.iskdelib, self.libprefix) - if self.source: - for i in self.orenv.make_list(self.source): ret+=' \n' % i - ret+="\n" - self.orenv.add_dump(ret) - - # Attach the functions to the environment so that SConscripts can use them - SConsEnvironment.KDEprogram = KDEprogram - SConsEnvironment.KDEshlib = KDEshlib - SConsEnvironment.KDEstaticlib = KDEstaticlib - SConsEnvironment.KDEinstall = KDEinstall - SConsEnvironment.KDEinstallas = KDEinstallas - SConsEnvironment.KDElang = KDElang - SConsEnvironment.KDEicon = KDEicon - - SConsEnvironment.KDEaddflags_cxx = KDEaddflags_cxx - SConsEnvironment.KDEaddflags_c = KDEaddflags_c - SConsEnvironment.KDEaddflags_link = KDEaddflags_link - SConsEnvironment.KDEaddlibs = KDEaddlibs - SConsEnvironment.KDEaddpaths_includes = KDEaddpaths_includes - SConsEnvironment.KDEaddpaths_libs = KDEaddpaths_libs - - SConsEnvironment.docfolder = docfolder - SConsEnvironment.getInstDirForResType = getInstDirForResType - SConsEnvironment.kobject = kobject - diff --git a/bksys/parser.py b/bksys/parser.py deleted file mode 100644 index cdde2b0..0000000 --- a/bksys/parser.py +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/python - -from xml.sax import make_parser -from xml.sax.handler import ContentHandler - -import SCons.Util - -def exists(env): - return True - -class SconsHandler(ContentHandler): - - def __init__ (self, envi, builddir): - self.envname = "" - self.env = envi - self.builddir="" #envi['_BUILDDIR_'] - - #self.dump = True - self.dump = False - self.count = 0 - self.dir = "" - self.autoinstall = False - self.appname="" - - self.obj = "" - - self.subdir ="" - self.type ="" - - self.isgloballib="" - self.target="" - - self._includes="" - self.cxxflags="" - self.globallibs="" - self.locallibs="" - self.linkflags="" - - self.srclist=[] - - def adrl(self, file): - if self.builddir: - dir=self.env.join(self.builddir,file).lstrip('/') - else: - dir=file.lstrip('/') - return dir - - def dump_commands(self, str): - if self.dump: - print str - - def startElement(self, name, attrs): - - if name == 'icondirent': - dir = attrs.get('dir', '') - sbdir = attrs.get('subdir', '') - if dir: - #if self.env.has_key("DUMPCONFIG"): - # print "env.KDEicon('"+dir+")'" - self.env.KDEicon('*', self.adrl(dir), subdir=sbdir) - elif name == 'subdirent': - dir = attrs.get('dir', None) - if dir: - #if self.env.has_key("DUMPCONFIG"): - # print "env.SConscript('"+dir+"/SConscript')" - self.env.SConscript(self.env.join(self.adrl(dir),"SConscript")) - elif name == 'docdir': - self.appname = self.adrl( attrs.get('name', None) ) - elif name == 'docdirent': - dir = attrs.get('dir', None) - lang = attrs.get('lang', None) - if dir and lang: - #if self.env.has_key("DUMPCONFIG"): - # print "env.docfolder('"+dir+"', '"+lang+"', '"+self.appname+"')" - self.env.docfolder(self.adrl(dir), lang, self.appname) - elif name == 'podir': - dir = attrs.get('dir', None) - appname = attrs.get('name', None) - if dir and appname: - if self.env.has_key('_BUILDDIR_'): dir=self.env.join(self.env['_BUILDDIR_'], dir) - self.env.KDElang(dir, appname) - elif name == 'install': - self.type = attrs.get('type', None) - self.subdir = attrs.get('subdir', None) - - elif name == 'file': - name = attrs.get('name', None) - if self.type: - #if self.env.has_key("DUMPCONFIG"): - # print "env.KDEinstall('"+self.type+"', '"+self.subdir+"', '"+name+"')" - self.env.KDEinstall(self.type, self.subdir, name) - - elif name == 'compile': - - type = attrs.get('type', None) - if not type: self.env.Exit(1) - self.obj = self.env.kobject(type) - - self.obj.target = str(attrs.get('target', '')) - self.obj.source = [] - - self.obj.includes = str(attrs.get('includes', '')) - self.obj.cflags = str(attrs.get('cflags', '')) - self.obj.cxxflags = str(attrs.get('cxxflags', '')) - - self.obj.libs = str(attrs.get('libs', '')) - self.obj.linkflags = str(attrs.get('linkflags', '')) - self.obj.libpath = str(attrs.get('libpath', '')) - - self.obj.vnum = str(attrs.get('vnum', '')) - self.obj.iskdelib = str(attrs.get('iskdelib', 0)) - self.obj.libprefix = str(attrs.get('libprefix', '')) - - self.obj.chdir = self.adrl(str(attrs.get('chdir', ''))) - self.obj.dirprefix = self.adrl(str(attrs.get('dirprefix', './'))) - if not self.obj.dirprefix: self.obj.dirprefix='./' # avoid silly errors - - elif name == 'source': - file = attrs.get('file', None) - condition = attrs.get('condition', ""); - lst=condition.split(':') - for c in lst: - if self.env.has_key(c): - self.obj.source.append( file ) - break - if file and not condition: self.obj.source.append( file ) - - def endElement(self, name): - if name == 'compile': - self.obj.execute() - -def generate(env): - - def xmlfile(env, file, builddir=''): - parser = make_parser() - curHandler = SconsHandler(env, builddir) - parser.setContentHandler(curHandler) - parser.parse(open(file)) - - from SCons.Script.SConscript import SConsEnvironment - SConsEnvironment.xmlfile = xmlfile - diff --git a/bksys/scons-mini.tar.bz2 b/bksys/scons-mini.tar.bz2 deleted file mode 100644 index fae5c28e329058f500e356e149d7037b075cd475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58130 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