Hello Carsten, > Carsten Neumann wrote: >> Johannes Brunen wrote:
>> In OpenSG 1.8 lights seems to be always global, which is quite unfortunate. > have you tried RenderAction::setLocalLights(true) ? No, I didn't know this option. I will try, thanks for pointing. > In 2 there is a ChunkOverrideGroup which allows overriding a specific > chunk of a material. That is good news. I'm excited... >> 4. I have had problems with the "--jobs=4" switch of the scons system. >> Is this a known problem? Is it supported by OpenSG at all? > ..., but for 2 I use -j4 all the time and it works fine. > What problems did you have ? I have had build errors on incremental builds which did vanish when I tried without the -j4 option. I just verified it as follows: First I changed a cpp file from the system lib. Then I run the following command from my shell ./scons --jobs=4 compiler=msvc71 type=dbg contrib_ply=yes which leads to the following error: LINK : fatal error LNK1104: cannot open file 'Build\win32-msvc71\installed\lib\OSGSystemD.lib' scons: *** [Build\win32-msvc71\Source\Contrib\OSGContribD.dll] Error 1104 scons: building terminated because of errors. Trying again the same procedure but with the command ./scons compiler=msvc71 type=dbg contrib_ply=yes does not show an error at all. >> 5. Should I switch to OpenSG 2.0 framework or should I wait further? ... > ... > The generic answer is something like this: If you don't need any of the > features that 2 lacks compared to 1, ... Oh, that is a difficult one for me. Can I read up what is still missing from OpenSG 2.0 against 1.8. Is the content of http://opensg.vrsource.org/trac/wiki/Dev/FeaturesToPortFrom1to2 up to date? Did anyone take the time to diff the branches? However, I do not want to bother. OpenSG 2.0 is not released. So I will be patient. > One exception is perhaps if you > have some cores that do complicated stuff for rendering, ... What are these? Nevertheless, I will give the OpenSG 2.0 branch a try... >> 7. Is it possible to build multiple build types (opt,dbg) >> simultaneously? I tried "type=dgb,opt" but that doesn't work. > probably not. Personally I'm not a big fan of this type of thing, > because it makes the build system (even more) complicated and you can > easily get the same thing by opening two consoles. I didn't know that it is possible to run two scons processes concurrently on the same build system. However, Stephane did point me to the 'both' type option of the build system, which is exactly what I'm looking for. Actually, I added a third option to my SConstruct file (see below) named 'all', which builds 'opt','dbg' and 'dbgopt', simultaneously. >> 8. Could there be a third build type "dbgopt" for optimized debug >> libraries? > I don't see why not. ... Anyways, I certainly don't mind having this :) Fine. >> 9. Would it be of interest to support custom memory management handlers? > Sounds interesting as well. How does it integrate and how do you control > which mem management is used ? OpenSG basically uses new/delete, so to > affect it those would have to be replaced (globally). Yes, that is exactly how it works. I simply link an object to the libraries ('NewDeleteImpl.obj' and 'NewDeleteImplD.obj', rsp) providing the globally defined functions: void* ::operator new(size_t size) { ... } void* ::operator new[](size_t size) { ... } void ::operator delete(void *pObj) { ... } void ::operator delete[](void *pObj) { ... } These itself are delegating into my custum memory manager. This works pretty fine and I use it all over my code. > Does this mem management give you performance benefits ? I can't answer that for the OpenSG code. For my application I could actually measure a huge performance gain comparing to the standard visual C++ memory manager. I use the http://www.nedprod.com/programs/portable/nedmalloc/index.html as a base and I'm pretty fine with it. An alternative is the Hoard memory allocator http://www.cs.umass.edu/~emery/hoard/ which is a very fine piece of software. However, the reason for changing the default memory allocator for the OpenSG (and other) library(ies) is not performance per se, but the effort of centralizing the memory management and the possibility to interfere the allocation proccess. For instance adding safe memory blocks around a requested memory block, and later on testing these bocks on some installed memory pattern can easily show memory corruption. Or counting the actually used memory is always of interest. > In OpenSG > object creation is a rather expensive operation because of the multiple > aspect and registration stuff that happens. Hmm,... >> If there is any interest I could post this >> file to the list. > yes, please. Even if I don't get around to integrate it right away we > have it in the archives and perhaps someone finds it interesting enough > to make similar changes for linux/os x ;) So, here it goes... import fnmatch import os.path import string import sys import shutil import zipfile import glob import SCons # check for local OpenSG scons version if SCons.__version__ != "0.96.1" or SCons.__build__ != "D002" or SCons.__developer__ != "OpenSG": print "SCons %s is not supported, OpenSG already includes a local scons installation. Please call './scons' on unix or '.\\scons' on windows." %(SCons.__version__) sys.exit(2) _root_dir = os.getcwd() SConsignFile() #CacheDir('cache') def Glob(match): """Similar to glob.glob, except globs SCons nodes, and thus sees generated files and files from build directories. Basically, it sees anything SCons knows about.""" def fn_filter(node): fn = str(node) return fnmatch.fnmatch(os.path.basename(fn), match) here = Dir('.') children = here.all_children() nodes = map(File, filter(fn_filter, children)) node_srcs = [n.srcnode() for n in nodes] src = here.srcnode() if src is not here: src_children = map(File, filter(fn_filter, src.all_children())) for s in src_children: if s not in node_srcs: nodes.append(File(os.path.basename(str(s)))) return nodes Export('Glob') PLATFORM = DefaultEnvironment().get('PLATFORM') class unzip: def __init__(self, verbose = False, percent = 10): self.verbose = verbose self.percent = percent def extract(self, file, dir): if not dir.endswith(':') and not os.path.exists(dir): os.mkdir(dir) zf = zipfile.ZipFile(file) # already unzipped supportlibs.zip? if os.path.exists(os.path.join(dir , 'VERSION')): # get current version number. version_file = open(os.path.join(dir , 'VERSION')) current_version = version_file.readline() version_file.close() # get version number in zip file. zip_version = zf.read('VERSION') # now compare the version numbers. if current_version == zip_version: return print 'detected incompatible win32 supportlibs version, updating supportlibs ...' print 'unzipping win32 supportlibs ...' # create directory structure to house files self._createstructure(file, dir) num_files = len(zf.namelist()) percent = self.percent divisions = 100 / percent perc = int(num_files / divisions) # extract files to directory structure for i, name in enumerate(zf.namelist()): if self.verbose == True: print "Extracting %s" % name elif (i % perc) == 0 and i > 0: complete = int (i / perc) * percent print "%s%% complete" % complete if not name.endswith('/'): outfile = open(os.path.join(dir, name), 'wb') outfile.write(zf.read(name)) outfile.flush() outfile.close() def _createstructure(self, file, dir): self._makedirs(self._listdirs(file), dir) def _makedirs(self, directories, basedir): """ Create any directories that don't currently exist """ for dir in directories: curdir = os.path.join(basedir, dir) if not os.path.exists(curdir): os.mkdir(curdir) def _listdirs(self, file): """ Grabs all the directories in the zip structure This is necessary to create the structure before trying to extract the file to it. """ zf = zipfile.ZipFile(file) dirs = [] for name in zf.namelist(): if name.endswith('/'): dirs.append(name) dirs.sort() return dirs def get_timestamp(file): if os.path.exists(file): return int(os.path.getmtime(file)) else: return 0 def MyInstall(dst, src): if get_timestamp(src) == get_timestamp(dst): return 0 try: os.unlink(dst) except OSError: pass try: import stat # Create directories if not existent. if not os.path.isdir(os.path.dirname(dst)): os.makedirs(os.path.dirname(dst)) shutil.copy2(src, dst) st=os.stat(src) os.chmod(dst, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) print 'INSTALLED "%s"' % (dst) return 0 except (IOError, os.error), why: print "Couldn't install %s: %s" % (`dst`, str(why)) return -1 Export('MyInstall') def AppendFilesUnique(files, adds): for add in adds: found = 0 for file in files: filename = str(file) if filename.find(add) > 0: found = 1 break; if found == 0: files.append(add) Export('AppendFilesUnique') # qt stuff def GetMocSources(sources): # create ui source new_sources = [] for source in sources: srcname = os.path.basename(str(source)) new_sources.append(srcname[:-2] + "_moc.cpp") return new_sources Export('GetMocSources') def CreateMocSources(env, sources): # create moc source for source in sources: srcname = os.path.basename(str(source)) if srcname[-2:] == '.h': # we should scan for Q_OBJECT ... target = srcname[:-2] + "_moc.cpp" env.Command(target, source, ["moc $SOURCES -o $TARGET"]) Export('CreateMocSources') def CreateMoc4Sources(env, sources): # create moc source for source in sources: srcname = os.path.basename(str(source)) if srcname[-2:] == '.h': # we should scan for Q_OBJECT ... target = srcname[:-2] + "_moc.cpp" qt4include = os.path.join(_po.getOption('qt4'), 'include', 'QtDesigner') if not os.path.exists(qt4include): qt4include = '/usr/include/qt4/QtDesigner' include = "-I"+ qt4include env.Command(target, source, ["moc " + include + " -DOSG_WITH_QT $SOURCES -o $TARGET"]) Export('CreateMoc4Sources') def GetUiSources(sources): # create ui source new_sources = [] new_headers = [] for source in sources: srcname = os.path.basename(str(source)) name = srcname[:-3] new_sources.append("uic_" + name + ".cpp") new_headers.append("uic_" + name + ".h") return new_sources, new_headers Export('GetUiSources') def CreateUiSources(env, sources): # create ui source cpp_sources = [] ui_moc_h_sources = [] for source in sources: srcname = os.path.basename(str(source)) name = srcname[:-3] target1 = "uic_" + name + ".h" env.Command(target1, source, ["uic -o $TARGET $SOURCES"]) target2 = "uic_" + name + ".cpp" env.Command(target2, source, ["uic -o $TARGET -impl " + target1 + " $SOURCES"]) cpp_sources.append(target2) ui_moc_h_sources.append(target1) return cpp_sources, ui_moc_h_sources Export('CreateUiSources') def CreateWinHeaders(env): if sys.platform != 'win32': return build_dir = str(env['BUILD_DIR']) path = os.path.join(build_dir, 'Source', 'Base') # create directories if not os.path.isdir(path): os.makedirs(path) filename = os.path.join(path, 'unistd.h') if not os.path.exists(filename): unistd_h = open(filename, 'w') unistd_h.close() MyInstall(os.path.join(build_dir, 'installed', 'include', 'OpenSG', 'unistd.h'), filename) if tc.get_name() == 'win32-icl': filename = os.path.join(path, 'xtree') if not os.path.exists(filename): shutil.copy2(os.path.join(build_dir, '..', '..', 'VSBuild', 'VS6', 'xtree'), filename) MyInstall(os.path.join(build_dir, 'installed', 'include', 'OpenSG', 'xtree'), filename) def CreateConfiguredHeader(env): build_dir = str(env['BUILD_DIR']) path = os.path.join(build_dir, 'Source', 'Base') is_win32 = 0 is_linux = 0 if sys.platform == 'win32': is_win32 = 1 elif sys.platform == 'linux2': is_linux = 1 filename = os.path.join(path, 'OSGConfigured.h') # Create directories if not existent. if not os.path.isdir(path): os.makedirs(path) current_configured_h = "" if os.path.exists(filename): file = open(filename, 'r') current_configured_h = file.read() file.close() new_configured_h = (""" /*---------------------------------------------------------------------- -----*\ * OpenSG * * * * * * Copyright 2000,2001 by OpenSG Forum * * * * contact: [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED] * * * \*---------------------------------------------------------------------- -----*/ /*---------------------------------------------------------------------- -----*\ * License * * * * * * * * * * * \*---------------------------------------------------------------------- -----*/ /*---------------------------------------------------------------------- -----*\ * Changes * * * * * * * * * * * * * \*---------------------------------------------------------------------- -----*/ // // This file was automatically generated by configuration script. // #ifndef _OSGCONFIGURED_H_ #define _OSGCONFIGURED_H_ #if defined (OSG_USE_WINTHREADS) #define OSG_ASPECT_USE_LOCALSTORAGE 1 #endif #if defined(OSG_WIN_TYPES) /* #undef OSG_BOOL_IS_UNSIGNED */ #endif #define OSG_DEFAULT_LOG_LEVEL LOG_WARNING #define OSG_DEFAULT_LOG_TYPE LOG_STDERR #ifndef OSG_DEFAULT_LOG_LEVEL # define OSG_DEFAULT_LOG_LEVEL LOG_WARNING #endif #ifndef OSG_DEFAULT_LOG_TYPE # define OSG_DEFAULT_LOG_TYPE LOG_STDERR #endif /* #undef OSG_DISABLE_DEPRECATED */ #if defined(OSG_DEBUG) /* #undef OSG_DEBUG_FCPTR */ /* #undef OSG_DEBUG_NO_FCPTR_ARITHM */ #endif #define OSG_OPT_DRAWTREE 1 /* #undef OSG_PTHREAD_ELF_TLS */ /* #undef OSG_NO_GLUT_GLSUBDIR */ #if defined(WIN32) && ! defined(__ICL) #pragma warning( disable : 4786 4661 4305 ) #endif /* #undef OSG_SGI_USE_PTHREAD */ #define OSG_SGI_USE_SPROC 1 #if defined(__sgi) # if defined(OSG_SGI_USE_PTHREAD) # define OSG_USE_PTHREADS # define OSG_ASPECT_USE_PTHREADKEY /* # undef OSG_USE_SPROC */ # else # define OSG_USE_SPROC # endif #endif /* #undef OSG_USE_MPATROL */ #if defined(OSG_USE_MPATROL) #define MP_NONEWDELETE 1 #include <mpatrol.h> #endif /* #undef OSG_ICC_GNU_COMPAT */ """) #if is_win32: # configured_h.write('\n') if _po.getOption('invalid_pointer_check'): new_configured_h += '#define OSG_INVALID_PTR_CHECK\n' new_configured_h += '\n' # add new line new_configured_h += '#endif /* _OSGCONFIGURED_H_ */' new_configured_h += '\n' # add new line if current_configured_h != new_configured_h: configured_h = open(filename, 'w') configured_h.write(new_configured_h) configured_h.close() MyInstall(os.path.join(build_dir, 'installed', 'include', 'OpenSG', 'OSGConfigured.h'), filename) def InstallProgram(env, prog): # HACK install manifest file on msvc80 compiler. if _po.getOption('compiler') == 'msvc80' and len(prog) > 0: prog.append(File(prog[0].abspath + '.manifest')) if env.get('OSG_PROGDIR'): env.Install('$PREFIX/lib/$OSG_PROGDIR', prog) else: env.Install('$PREFIX/lib', prog) def BuildProgram(tc, name, sources, tools=[], updates=[], **kw): from os.path import basename, join from SCons.Util import splitext for env in tc.get_env_list(): env = env.Copy() for t in tools: env.Tool(t) for u in updates: u(env) apply(env.Append, [], kw) def base(n): return splitext(basename(str(n)))[0] objects = [env.Object("${OSG_OBJDIR}/" + base(k), k) for k in sources] target = name + '${OSG_PROGSUF}' if env.get('OSG_PROGDIR'): target = join('$OSG_PROGDIR', target) prog = env.Program(target, objects) InstallProgram(env, prog) class OpenSGLibrary: def __init__(self, libraries): if type(libraries) != type([]): libraries = [libraries] self.libraries = libraries def __call__(self, env): if env.get('OSG_LIBDIR'): libdir = env['PREFIX'].Dir('lib').Dir(env['OSG_LIBDIR']) else: libdir = env['PREFIX'].Dir('lib') env.AppendUnique(LIBPATH = [Dir(libdir)]) for lib in self.libraries: # filter out OSGWindowX lib on win32 platform. if lib != 'OSGWindowX' or env['PLATFORM'] != 'win32': env.AppendUnique(LIBS = [lib + '$OSG_LIBSUF']) Export('BuildProgram OpenSGLibrary') def CreateEnvironment(*args, **kw): "Creates an environment with some things that always have to be set." env = apply(Environment, args, kw) env['ENV']['HOME'] = os.environ.get('HOME') return env win32_defines = ['WIN32', '_WINDOWS', 'WINVER=0x0400', '_WIN32_WINDOWS=0x0410', '_WIN32_WINNT=0x0400', 'STRICT', 'NOMINMAX'] # with this define I get identifier "htonl" is undefined. #win32_defines += ['WIN32_LEAN_AND_MEAN'] # OSGConfigured.h stuff win32_defines += ['_OSG_HAVE_CONFIGURED_H_'] #win32_defines += ['OSG_ASPECT_USE_LOCALSTORAGE=1', 'OSG_DEFAULT_LOG_TYPE=2', # 'OSG_DEFAULT_LOG_LEVEL=2'] # ok we need to add some kind of configure for creating the OSGConfigured.h header file. # '_OSG_HAVE_CONFIGURED_H_' class PlatformOptions: def __init__(self, opts): self.de = DefaultEnvironment() # check the QTDIR variable and set 'yes' opts.Add(PackageOption('qt', 'Enable qt3 support', 'no')) opts.Add(PackageOption('qt4', 'Enable qt4 support', 'no')) opts.Add(PackageOption('cg', 'Enable cg support', 'no')) opts.Add(BoolOption('gif', 'Enable gif support', 1)) self.package_options = ['tif', 'jpg', 'png', 'jasper', 'exr', 'glut', 'zlib'] if self.de.get('PLATFORM') == 'cygwin': print "Not supported yet!" elif self.de.get('PLATFORM') == 'win32': opts.Add(EnumOption('compiler', 'Use compiler', 'icl', allowed_values=('gcc', 'icl', 'msvc70', 'msvc71', 'msvc80', 'msvc80x64', 'mspsdkx64'))) # try to find the supportlibs directory. current_dir = Dir('.').abspath supportlibs = 'no' un = unzip() un.extract(os.path.join(current_dir , 'dist', 'win', 'supportlibs.zip'), os.path.join(current_dir , '..', 'supportlibs')) if os.path.exists(os.path.join(current_dir , '..', 'supportlibs', 'VERSION')): supportlibs = 'yes' for option in self.package_options: opts.Add(PackageOption(option, 'Enable ' + option + ' support', supportlibs)) else: if sys.platform == 'linux2': opts.Add(EnumOption('compiler', 'Use compiler', 'gcc', allowed_values=('gcc'))) for option in self.package_options: enable = 'yes' # on linux as default we disable jasper and exr support. if option == 'jasper' or option == 'exr': enable = 'no' opts.Add(PackageOption(option, 'Enable ' + option + ' support', enable)) # add common options opts.Add(EnumOption('type', 'Compile dbg, opt, dbgopt, both or all', 'opt', allowed_values=('dbg', 'opt', 'both', 'dbgopt', 'all'))) opts.Add(BoolOption('gv_beta', 'enable gv beta', 0)) opts.Add(BoolOption('invalid_pointer_check', 'enable invalid pointer check', 0)) # contrib opts.Add(BoolOption('contrib_cgchunk', 'enable contrib CGChunk', 0)) opts.Add(BoolOption('contrib_cgfxmaterial', 'enable contrib CGFXMaterial', 0)) opts.Add(BoolOption('contrib_cgfxmaterial2', 'enable contrib CGFXMaterial2', 0)) opts.Add(BoolOption('contrib_drawfunctorcore', 'enable contrib DrawFunctorCore', 0)) opts.Add(BoolOption('contrib_ply', 'enable ply loader', 0)) opts.Add(BoolOption('contrib_terrain', 'enable terrain rendering node', 0)) opts.Add(PackageOption('contrib_performer_loader', 'Enable contrib performer loader', 'no')) opts.Add(PackageOption('contrib_cal3d', 'enable Cal3D character animation library wrapper core', 'no')) opts.Add(PackageOption('contrib_physics', 'enable ODE library wrapper', 'no')) #tests opts.Add(BoolOption('tests', 'compile test programs', 0)) opts.Update(self.de) def getOption(self, opt): return self.de.get(opt) def getPackageOptions(self): return self.package_options def buildDbgOpt(self): return (self.getOption('type') == 'dbgopt' or self.getOption('type') == 'all') def buildDbg(self): return (self.getOption('type') == 'dbg' or self.getOption('type') == 'both' or self.getOption('type') == 'all') def buildOpt(self): return (self.getOption('type') == 'opt' or self.getOption('type') == 'both' or self.getOption('type') == 'all') def getPlatform(self): return self.de.get('PLATFORM') def moveGVBetaFile(base, file): src = os.path.join(base, file) dst = os.path.join(base, 'tmp_gv') if not os.path.exists(dst): os.makedirs(dst) dst = os.path.join(base, 'tmp_gv', file) if os.path.exists(src) and not os.path.exists(dst): shutil.move(src, dst) if os.path.exists(src): os.unlink(src) def unmoveGVBetaFile(base, file): src = os.path.join(base, 'tmp_gv', file) dst = os.path.join(base, file) if os.path.exists(src): if os.path.exists(dst): os.unlink(dst) shutil.move(src, base) dst = os.path.join(base, 'tmp_gv') if os.path.exists(dst): # if the directory is not empty ignore the exception. try: os.rmdir(dst) except: dummy = 1 def moveGVBetaFiles(): current_dir = Dir('.').abspath moveGVBetaFile(os.path.join(current_dir, 'Source', 'Base', 'Base'), 'OSGTypeBase.h') moveGVBetaFile(os.path.join(current_dir, 'Source', 'Base', 'Base'), 'OSGTypeBase.cpp') moveGVBetaFile(os.path.join(current_dir, 'Source', 'Base', 'Base'), 'OSGTypeFactory.h') moveGVBetaFile(os.path.join(current_dir, 'Source', 'Base', 'Base'), 'OSGTypeFactory.cpp') moveGVBetaFile(os.path.join(current_dir, 'Source', 'System', 'FileIO', 'OBJ'), 'OSGOBJSceneFileType.cpp') moveGVBetaFile(os.path.join(current_dir, 'Source', 'System', 'FileIO', 'WRL'), 'OSGVRMLSceneFileType.h') moveGVBetaFile(os.path.join(current_dir, 'Source', 'System', 'FileIO', 'WRL'), 'OSGVRMLSceneFileType.cpp') def unmoveGVBetaFiles(): current_dir = Dir('.').abspath unmoveGVBetaFile(os.path.join(current_dir, 'Source', 'Base', 'Base'), 'OSGTypeBase.h') unmoveGVBetaFile(os.path.join(current_dir, 'Source', 'Base', 'Base'), 'OSGTypeBase.cpp') unmoveGVBetaFile(os.path.join(current_dir, 'Source', 'Base', 'Base'), 'OSGTypeFactory.h') unmoveGVBetaFile(os.path.join(current_dir, 'Source', 'Base', 'Base'), 'OSGTypeFactory.cpp') unmoveGVBetaFile(os.path.join(current_dir, 'Source', 'System', 'FileIO', 'OBJ'), 'OSGOBJSceneFileType.cpp') unmoveGVBetaFile(os.path.join(current_dir, 'Source', 'System', 'FileIO', 'WRL'), 'OSGVRMLSceneFileType.h') unmoveGVBetaFile(os.path.join(current_dir, 'Source', 'System', 'FileIO', 'WRL'), 'OSGVRMLSceneFileType.cpp') class ToolChain: def __init__(self, name, **kw): self.name = name self.env = apply(CreateEnvironment, [], kw) # add all package include and lib paths # ok need to move this in the SConscript files ... # only OSGSystem need the image libs. # only OSGWindowGLUT need the glut lib. for option in _po.getPackageOptions(): if isinstance(_po.getOption(option), str): self.env.Append(CPPPATH = [os.path.join(_po.getOption(option), 'include')]) # HACK but the OpenEXR headers are broken. if option == 'exr': self.env.Append(CPPPATH = [os.path.join(_po.getOption(option), 'include', 'OpenEXR')]) self.env.Append(LIBPATH = [os.path.join(_po.getOption(option), 'lib')]) # add OSG_WITH defines if _po.getOption('glut'): self.env.Append(CPPDEFINES = ['OSG_WITH_GLUT']) if _po.getOption('jpg'): self.env.Append(CPPDEFINES = ['OSG_WITH_JPG']) if _po.getOption('tif'): self.env.Append(CPPDEFINES = ['OSG_WITH_TIF']) if _po.getOption('png'): self.env.Append(CPPDEFINES = ['OSG_WITH_PNG']) if _po.getOption('gif'): self.env.Append(CPPDEFINES = ['OSG_WITH_GIF']) if _po.getOption('jasper'): self.env.Append(CPPDEFINES = ['OSG_WITH_JASPER']) if _po.getOption('exr'): self.env.Append(CPPDEFINES = ['OSG_WITH_IMF']) if _po.getOption('qt'): #if isinstance(_po.getOption('qt'), str): self.env.PrependENVPath('PATH', os.path.join(_po.getOption('qt'), 'bin')) self.env['QTCPPPATH'] = [os.path.join(_po.getOption('qt'), 'include')] self.env['QTLIBPATH'] = [os.path.join(_po.getOption('qt'), 'lib')] if self.env.get('PLATFORM') == 'win32': # auto detect qt lib name with version number libnames = glob.glob(os.path.join(_po.getOption('qt'), 'lib', 'qt-mt*.lib')) if len(libnames) > 0: libname = os.path.basename(libnames[0]) libname = libname[:-4] self.env['OSG_WINDOW_QT_LIBS'] = [libname] else: print "Couldn't find qt-mt*.lib file!" else: self.env['OSG_WINDOW_QT_LIBS'] = ['qt-mt'] if _po.getOption('qt4'): #if isinstance(_po.getOption('qt4'), str): qt4bin = os.path.join(_po.getOption('qt4'), 'bin') if not os.path.exists(qt4bin): print "Couldn't find", qt4bin, "using /usr/bin/qt4" qt4bin = '/usr/bin/qt4' qt4include = os.path.join(_po.getOption('qt4'), 'include') if not os.path.exists(qt4include): print "Couldn't find", qt4include, "using /usr/include/qt4" qt4include = '/usr/include/qt4' qt4lib = os.path.join(_po.getOption('qt4'), 'lib') if not os.path.exists(qt4lib): print "Couldn't find", qt4lib, "using /usr/lib/qt4" qt4lib = '/usr/lib/qt4' self.env.PrependENVPath('PATH', qt4bin) self.env['QT4CPPPATH'] = [qt4include, os.path.join(qt4include, 'ActiveQt'), os.path.join(qt4include, 'Qt'), os.path.join(qt4include, 'Qt3Support'), os.path.join(qt4include, 'QtAssistant'), os.path.join(qt4include, 'QtCore'), os.path.join(qt4include, 'QtDesigner'), os.path.join(qt4include, 'QtGui'), os.path.join(qt4include, 'QtNetwork'), os.path.join(qt4include, 'QtOpenGL'), os.path.join(qt4include, 'QtTest'), os.path.join(qt4include, 'QtUiTools'), os.path.join(qt4include, 'QtXml')] self.env['QT4LIBPATH'] = [qt4lib] if self.env.get('PLATFORM') == 'win32': self.env['OSG_WINDOW_QT4_LIBS'] = ['Qt3Support4', 'QtCore4', 'QtGui4', 'QtNetwork4', 'QtOpenGL4', 'QtXml4', 'QtSql4'] else: self.env['OSG_WINDOW_QT4_LIBS'] = ['Qt3Support', 'QtCore', 'QtGui', 'QtNetwork', 'QtOpenGL', 'QtXml', 'QtSql'] if _po.getOption('cg'): if isinstance(_po.getOption('cg'), str): self.env['CGCPPPATH'] = [os.path.join(_po.getOption('cg'), 'include')] self.env['CGLIBPATH'] = [os.path.join(_po.getOption('cg'), 'lib')] if self.env.get('PLATFORM') == 'win32': if _po.getOption('contrib_cgfxmaterial'): self.env['OSG_CG_LIBS'] = ['Cg', 'CgGL', 'CgFXParser'] else: self.env['OSG_CG_LIBS'] = ['Cg', 'CgGL'] else: if _po.getOption('contrib_cgfxmaterial'): self.env['OSG_CG_LIBS'] = ['Cg', 'CgGL', 'CgFXGL'] else: self.env['OSG_CG_LIBS'] = ['Cg', 'CgGL'] if _po.getOption('gv_beta'): print 'Compiling with gv beta enabled!' self.env.Append(CPPDEFINES = ['OSG_GV_BETA']) moveGVBetaFiles() else: unmoveGVBetaFiles() # add include path for OSGConfigured.h file self.env.Append(CPPPATH=[Dir(os.path.join('Build', self.name, 'Source', 'Base'))]) def get_name(self): return self.name def get_env(self): """Returns base environment for this tool chain.""" return self.env def get_env_list(self): """Returns list of customized environment configurations (debug, opt, etc.) for this tool chain.""" env = self.env.Copy() env['OSG_OBJDIR'] = 'normal' env['OSG_LIBSUF'] = '' env['OSG_PROGSUF'] = '' return [env] def is_win32(self): return 0 class win32(ToolChain): def __init__(self, name): ToolChain.__init__(self, name) env = self.get_env() current_dir = Dir('.').abspath supportlibs = '' if os.path.exists(os.path.join(current_dir, '..', 'supportlibs')): supportlibs = os.path.join(current_dir, '..', 'supportlibs') if len(supportlibs) > 0: env.AppendENVPath('INCLUDE', supportlibs + os.sep + 'include') # HACK but the OpenEXR headers are broken. env.AppendENVPath('INCLUDE', supportlibs + os.sep + 'include/OpenEXR') env.AppendENVPath('LIB', supportlibs + os.sep + 'lib') #print 'Added supportlibs path (' + supportlibs + ')' memmanager_dir = os.path.join(current_dir, '../../../Utils', 'MemManager') env.AppendENVPath('INCLUDE', memmanager_dir + os.sep + 'inc') env.AppendENVPath('LIB', memmanager_dir + os.sep + 'lib') env.AppendENVPath('LIB', memmanager_dir + os.sep + 'libd') slibs = [] if _po.getOption('jpg'): slibs.append('libjpeg') if _po.getOption('tif'): slibs.append('tif32') if _po.getOption('png'): slibs.append('libpng') slibs.append('zlib') if _po.getOption('jasper'): slibs.append('libjasper') env['OSG_BASE_LIBS'] = [] env['OSG_SYSTEM_LIBS'] = ['opengl32', 'glu32', 'glu32.lib', 'gdi32'] + slibs env['OSG_WINDOW_GLUT_LIBS'] = ['glut32', 'opengl32', 'glu32.lib', 'gdi32'] def is_win32(self): return 1 class win32_icl_base(win32): def __init__(self, name): win32.__init__(self, name) env = self.get_env() #env.Replace(no_import_lib = 1) # icl.py is buggy only looks for version 7.0 # also need to get the version number. # I commented this line out "SCons.Tool.msvc.generate(env)" # I don't want the .net include and lib paths. # I have 4 compilers on my machine (ok worst case) icl 6.0, msvc 6.0, # msvc 7.0, msvc 7.1 actually 5 gcc ;-) env.Tool('icl') #env.Tool('mslink') #env.Tool('mslib') # add msvc6 include and lib paths import SCons.Tool.msvc include_path, lib_path, exe_path = SCons.Tool.msvc._get_msvc6_default_paths("6.0", 0) env.PrependENVPath('INCLUDE', include_path) env.PrependENVPath('LIB', lib_path) # add intel compiler bin, include, lib, path for libmmd.lib import SCons.Tool.icl iclversions = ['8.1', '8.0', '7.1', '7.0', '6.0', '5.0'] icltop = None iclversion = "600" for iclv in iclversions: icltop = SCons.Tool.icl.get_intel_compiler_top(iclv) if icltop: # create a three digit version string iclversion = str(int(float(iclv) * 100)) break if icltop: #print 'Added compiler path (' + icltop + ')' env.PrependENVPath('INCLUDE', os.path.join(icltop, 'Include')) env.PrependENVPath('LIB', os.path.join(icltop, 'Lib')) env.PrependENVPath('PATH', os.path.join(icltop, 'Bin')) else: print "Couldn't find icl compiler!" #print env['ENV']['INCLUDE'] #print env['ENV']['LIB'] # add the tools path for sed.exe, bison.exe, flex.exe ... tools_exe = os.path.join(_root_dir, 'dist', 'win', 'bin') env.AppendENVPath('PATH', tools_exe) env.Append(CXXFLAGS=['-W4', '-Qwd985', '-Qwd530', '-Qwd981', '-Qwd193', '-Qwd444', '-Qwd279', '-Qwe698', '-Qwe47', '-Qwe373', '-Qwe171', '-Qwe373', '-Qwe261']) env.Append(CPPDEFINES=win32_defines, CXXFLAGS=['-Qvc6', '-GX', '-Gi-', '-Qansi', '-Qoption,cpp,--new_for_init', '-GR']) # XXX HACK need to autodetect the compiler version! # '__STDC__' env.Append(CPPDEFINES=['__INTEL_COMPILER_VERSION=' + iclversion]) env.Append(LINKFLAGS=['/NODEFAULTLIB', '/incremental:no'], LIBS = ['user32', 'kernel32', 'winmm', 'wsock32', 'oldnames']) def get_env_list(self): env = self.get_env() envs = [] if _po.buildDbg(): dbg = env.Copy() dbg.Append(CXXFLAGS=['/MDd', '/Od', '/RTC1', '/Z7'], LINKFLAGS=['/DEBUG'], CPPDEFINES=['_DEBUG', 'OSG_DEBUG']) dbg['OSG_OBJDIR'] = 'dbg' dbg['OSG_LIBSUF'] = 'D' dbg['OSG_PROGSUF'] = 'D' dbg.Append(LIBS = ['msvcprtd', 'msvcrtd']) envs.append(dbg) if _po.buildDbgOpt(): dbgopt = env.Copy() dbgopt.Append(CXXFLAGS=['/MD', '/Od', '/RTC1', '/Z7'], LINKFLAGS=['/DEBUG'], CPPDEFINES=['_DEBUG', 'OSG_DEBUG']) dbgopt['OSG_OBJDIR'] = 'dbg' dbgopt['OSG_LIBSUF'] = '' dbgopt['OSG_PROGSUF'] = '' dbgopt.Append(LIBS = ['msvcprt', 'msvcrt']) envs.append(dbgopt) if _po.buildOpt(): opt = env.Copy() opt.Append(CXXFLAGS=['/MD', '/O2'], LINKFLAGS=['/OPT:REF', '/OPT:ICF'], CPPDEFINES=['NDEBUG']) opt['OSG_OBJDIR'] = 'opt' opt['OSG_LIBSUF'] = '' opt['OSG_PROGSUF'] = '' opt.Append(LIBS = ['msvcprt', 'msvcrt']) envs.append(opt) return envs class win32_icl(win32_icl_base): def __init__(self): win32_icl_base.__init__(self, 'win32-icl') env = self.get_env() class win32_msvc_base(win32): def __init__(self, name): win32.__init__(self, name) env = self.get_env() env.Tool('msvc') env.Tool('mslib') env.Tool('mslink') # add the tools path for sed.exe, bison.exe, flex.exe ... tools_exe = os.path.join(_root_dir, 'dist', 'win', 'bin') env.AppendENVPath('PATH', tools_exe) env.Append(CPPDEFINES=win32_defines) env.Append(LINKFLAGS=['/FORCE:MULTIPLE', '/NODEFAULTLIB', '/incremental:no'], LIBS = ['user32', 'kernel32', 'winmm', 'wsock32', 'oldnames']) def get_env_list(self): env = self.get_env() envs = [] if _po.buildDbg(): dbg = env.Copy() dbg.Append(CXXFLAGS=['/MDd', '/Od', '/ZI', '/RTC1'], LINKFLAGS=['/DEBUG','NewDeleteImplD.obj'], CPPDEFINES=['_DEBUG', 'OSG_DEBUG']) dbg['OSG_OBJDIR'] = 'dbg' dbg['OSG_LIBSUF'] = 'D' dbg['OSG_PROGSUF'] = 'D' dbg.Append(LIBS = ['MemManagerD','msvcprtd', 'msvcrtd']) envs.append(dbg) if _po.buildDbgOpt(): dbgopt = env.Copy() dbgopt.Append(CXXFLAGS=['/MDd', '/O2', '/Ob1'], LINKFLAGS=['/DEBUG','NewDeleteImplD.obj'], CPPDEFINES=['NDEBUG']) dbgopt['OSG_OBJDIR'] = 'odbg' dbgopt['OSG_LIBSUF'] = 'OD' dbgopt['OSG_PROGSUF'] = 'OD' dbgopt.Append(LIBS = ['MemManagerD','msvcprtd', 'msvcrtd']) envs.append(dbgopt) if _po.buildOpt(): opt = env.Copy() opt.Append(CXXFLAGS=['/MD', '/O2', '/Ob1'], LINKFLAGS=['/OPT:REF', '/OPT:ICF','NewDeleteImpl.obj'], CPPDEFINES=['NDEBUG']) opt['OSG_OBJDIR'] = 'opt' opt['OSG_LIBSUF'] = '' opt['OSG_PROGSUF'] = '' opt.Append(LIBS = ['MemManager','msvcprt', 'msvcrt']) envs.append(opt) return envs class win32_msvc70(win32_msvc_base): def __init__(self): win32_msvc_base.__init__(self, 'win32-msvc70') env = self.get_env() env.Append(CXXFLAGS=['/GX', '/GR', '/Zm1200']) # add msvc71 include and lib paths import SCons.Tool.msvc include_path, lib_path, exe_path = SCons.Tool.msvc._get_msvc7_default_paths("7.0", 0) env.PrependENVPath('INCLUDE', include_path) env.PrependENVPath('LIB', lib_path) env.PrependENVPath('PATH', exe_path) class win32_msvc71(win32_msvc_base): def __init__(self): win32_msvc_base.__init__(self, 'win32-msvc71') env = self.get_env() if _po.getOption('exr'): env['OSG_SYSTEM_LIBS'] += ['openexr_vc71'] env.Append(CXXFLAGS=['/GX', '/GR', '/Zm1200']) # add msvc71 include and lib paths import SCons.Tool.msvc include_path, lib_path, exe_path = SCons.Tool.msvc._get_msvc7_default_paths("7.1", 0) env.PrependENVPath('INCLUDE', include_path) env.PrependENVPath('LIB', lib_path) env.PrependENVPath('PATH', exe_path) class win32_msvc80(win32_msvc_base): def __init__(self): win32_msvc_base.__init__(self, 'win32-msvc80') env = self.get_env() if _po.getOption('exr'): env['OSG_SYSTEM_LIBS'] += ['openexr_vc80'] env.Append(CXXFLAGS=['/Wp64', '/w44258', '/w44996', '/EHsc', '/GR', '/Zm1200', '/Zc:forScope']) #env.Append(LINKFLAGS=['/MANIFEST:NO']) # add msvc80 include and lib paths import SCons.Tool.msvc include_path, lib_path, exe_path = SCons.Tool.msvc._get_msvc8_default_paths("8.0") # HACK #msvc80_path = 'C:/Programme/Microsoft Visual Studio 8/' #mspsdk_path = 'C:/Programme/Microsoft Platform SDK/' #include_path = [msvc80_path + 'VC/include', # msvc80_path + 'VC/PlatformSDK/include', # mspsdk_path + 'Include'] #lib_path = [msvc80_path + 'VC/lib', # msvc80_path + 'SDK/v2.0/lib', # mspsdk_path + 'Lib'] #exe_path = [msvc80_path + 'Common7/IDE', # msvc80_path + 'VC/bin', # msvc80_path + 'Common7/Tools', # msvc80_path + 'SDK/v2.0/bin', # 'C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727', # msvc80_path + 'VC/VCPackages'] env.PrependENVPath('INCLUDE', include_path) env.PrependENVPath('LIB', lib_path) env.PrependENVPath('PATH', exe_path) class win32_msvc80x64(win32_msvc_base): def __init__(self): win32_msvc_base.__init__(self, 'win32-msvc80x64') env = self.get_env() env.Append(CPPDEFINES =['WIN64']) env.Append(CXXFLAGS=['/Wp64', '/w44258', '/w44996', '/EHsc', '/GR', '/bigobj', '/Zm1200', '/Zc:forScope']) # add msvc80 include and lib paths import SCons.Tool.msvc include_path, lib_path, exe_path = SCons.Tool.msvc._get_msvc8_x64_default_paths("8.0") # HACK #vsinstalldir = 'C:/Program Files (x86)/Microsoft Visual Studio 8/' #vcinstalldir = 'C:/Program Files (x86)/Microsoft Visual Studio 8/VC/' #include_path = [vcinstalldir + 'ATLMFC/INCLUDE', # vcinstalldir + 'INCLUDE', # vcinstalldir + 'PlatformSDK/include', # vsinstalldir + 'SDK/v2.0/include'] #lib_path = [vcinstalldir + 'ATLMFC/LIB/amd64', # vcinstalldir + 'LIB/amd64', # vcinstalldir + 'PlatformSDK/lib/amd64', # vsinstalldir + 'SDK/v2.0/LIB/AMD64'] #exe_path = [vcinstalldir + 'BIN/amd64', # vcinstalldir + 'PlatformSDK/bin/win64/amd64', # vcinstalldir + 'PlatformSDK/bin', # vcinstalldir + 'VCPackages', # vsinstalldir + 'Common7/IDE', # vsinstalldir + 'Common7/Tools', # vsinstalldir + 'Common7/Tools/bin', # vsinstalldir + 'SDK/v2.0/bin'] env.PrependENVPath('INCLUDE', include_path) env.PrependENVPath('LIB', lib_path) env.PrependENVPath('PATH', exe_path) env.Append(LIBS = ['bufferoverflowu']) class win32_mspsdkx64(win32_msvc_base): def __init__(self): win32_msvc_base.__init__(self, 'win32-mspsdkx64') env = self.get_env() # this compiler uses the old vc 6.0 header files we need the define # to detect this in OSGConfig.h env.Append(CPPDEFINES =['OSG_PSDK_COMPILER', 'WIN64']) env.Append(CXXFLAGS=['/Wp64', '/w44258', '/w44996', '/EHsc', '/GR', '/Zm1200', '/Zc:forScope']) # add msvc80 platform sdk include and lib paths import SCons.Tool.msvc include_path, lib_path, exe_path = SCons.Tool.msvc._get_mspsdk_x64_default_paths("8.0") # HACK #include_path = ['C:/Program Files/Microsoft Platform SDK/Include', # 'C:/Program Files/Microsoft Platform SDK/Include/crt', # 'C:/Program Files/Microsoft Platform SDK/Include/crt/sys', # 'C:/Program Files/Microsoft Platform SDK/Include/mfc', # 'C:/Program Files/Microsoft Platform SDK/Include/atl'] #lib_path = ['C:/Program Files/Microsoft Platform SDK/Lib/AMD64', # 'C:/Program Files/Microsoft Platform SDK/Lib/AMD64/atlmfc'] #exe_path = ['C:/Program Files/Microsoft Platform SDK/Bin/Win64/x86/AMD64', # 'C:/Program Files/Microsoft Platform SDK/Bin', # 'C:/Program Files/Microsoft Platform SDK/Bin/WinNT', # 'C:/WINDOWS/system32', 'C:/WINDOWS', 'C:/WINDOWS/System32/Wbem'] env.PrependENVPath('INCLUDE', include_path) env.PrependENVPath('LIB', lib_path) env.PrependENVPath('PATH', exe_path) env.Append(LIBS = ['bufferoverflowu']) class cygwin_gcc(win32): def __init__(self): win32.__init__(self, 'cygwin-gcc') env = self.get_env() env.Tool('mingw') env.Tool('mslink') env.Append(CPPDEFINES=win32_defines, CXXFLAGS=['-mno-cygwin', '-ftemplate-depth-100'], LINKFLAGS=['-mno-cygwin'], OSG_BASE_LIBS = ['winmm', 'ws2_32']) class linux_gcc(ToolChain): def __init__(self): ToolChain.__init__(self, 'linux-gcc') def get_env_list(self): env = self.get_env() slibs = [] if _po.getOption('jpg'): slibs.append('libjpeg') if _po.getOption('tif'): slibs.append('libtiff') if _po.getOption('png'): slibs.append('libpng') slibs.append('libz') if _po.getOption('jasper'): slibs.append('jasper') if _po.getOption('exr'): slibs.append('IlmImf') env = env.Copy() env.Append(CXXFLAGS=['-ansi', '-use_readonly_const', '-ftemplate-depth-100', '-fPIC'], CPPDEFINES=['_GNU_SOURCE', '_OSG_HAVE_CONFIGURED_H_'], LINKFLAGS = ['-Wl,-s']) # get gcc version #import commands #dummy, gccversionstr = commands.getstatusoutput('gcc -dumpversion') #gccversion = float(gccversionstr[0:3]) # doesn't work on 64bit machines :-( compiler bug ... #if gccversion >= 4.0: # env.Append(CXXFLAGS=['-fvisibility-inlines-hidden']) env['OSG_BASE_LIBS'] = ['pthread', 'dl'] env['OSG_SYSTEM_LIBS'] = ['GLU', 'GL'] + slibs env['OSG_WINDOW_GLUT_LIBS'] = ['glut', 'GL'] env['OSG_WINDOW_X_LIBS'] = [] env['OSG_OBJDIR'] = 'obj' envs = [] if _po.buildDbg(): dbg = env.Copy() dbg.Append(CXXFLAGS=['-g'], LINKFLAGS=[''], CPPDEFINES=['_DEBUG', 'OSG_DEBUG']) dbg['OSG_OBJDIR'] = 'dbg' dbg['OSG_LIBDIR'] = 'dbg' dbg['OSG_PROGDIR'] = 'dbg' envs.append(dbg) if _po.buildOpt(): opt = env.Copy() opt.Append(CXXFLAGS=['-O2'], LINKFLAGS=['-s'], CPPDEFINES=[]) opt['OSG_OBJDIR'] = 'opt' opt['OSG_LIBDIR'] = 'opt' opt['OSG_PROGDIR'] = 'opt' envs.append(opt) return envs class unknown(ToolChain): "Specific build type is not known. Try defaults." def __init__(self): ToolChain.__init__(self, 'unknown') def hasICL(): f = os.popen('icl -help', 'r') for line in f.xreadlines(): if string.find(line, 'Intel') >= 0: return 1 return 0 def SelectToolChain(): de = DefaultEnvironment() if de.get('PLATFORM') == 'cygwin': return cygwin_gcc() elif de.get('PLATFORM') == 'win32': msvs_version = de.get('MSVS_VERSION') if _po.getOption('compiler') == 'gcc': return cygwin_gcc() elif _po.getOption('compiler') == 'icl': return win32_icl() elif _po.getOption('compiler') == 'msvc70': return win32_msvc70() elif _po.getOption('compiler') == 'msvc71': return win32_msvc71() elif _po.getOption('compiler') == 'msvc80': return win32_msvc80() elif _po.getOption('compiler') == 'msvc80x64': return win32_msvc80x64() elif _po.getOption('compiler') == 'mspsdkx64': return win32_mspsdkx64() else: print "WARNING: Unsupported MSVS version found: %s. Trying defaults." % msvs_version return unknown() else: if sys.platform == 'linux2': return linux_gcc() else: print "WARNING: Build toolchain not autodetected. Trying defaults." return unknown() def createOSGConfig(env, target, source): print "createOSGConfig" print 'defines: ', env['CPPDEFINES'] print 'cflags: ', env['CXXFLAGS'] print 'lflags: ', env['LINKFLAGS'] #print 'libs: ', env['LIBPATH'] #print 'llibs: ', env['LIBS'] #print 'base libs: ', env['OSG_BASE_LIBS'] #print 'system libs: ', env['OSG_SYSTEM_LIBS'] #print 'glut libs: ', env['OSG_WINDOW_GLUT_LIBS'] #print 'windowx libs: ', env['OSG_WINDOW_X_LIBS'] #print 'win32 libs: ', env['OSG_WINDOW_WIN32_LIBS'] #print 'qt libs: ', env['OSG_WINDOW_QT_LIBS'] #print 'qt4 libs: ', env['OSG_WINDOW_QT4_LIBS'] #print 'contrib libs: ', env['OSG_CONTRIB_LIBS'] # Process options. opts = Options('options.cache', ARGUMENTS) opts.AddOptions( BoolOption('distcc', 'Compile using distcc', 0)) _po = PlatformOptions(opts) Export('_po') tc = SelectToolChain() print "Detected environment: %s" % tc.get_name() Export('tc') env = tc.get_env() env['OSG_ROOT_DIR'] = _root_dir env['BUILD_DIR'] = Dir(os.path.join('Build', tc.get_name())) env['PREFIX'] = env['BUILD_DIR'].Dir('installed') Default(env['PREFIX']) opts.Update(env) # Update the environment with the options. opts.Save('options.cache', env) Help(opts.GenerateHelpText(env)) CreateWinHeaders(env) CreateConfiguredHeader(env) if env['distcc']: distcc = WhereIs('distcc') if distcc: print "Found distcc: " + distcc env['CC'] = ['$(', distcc, '$)', env['CC']] env['CXX'] = ['$(', distcc, '$)', env['CXX']] env['ENV']['DISTCC_HOSTS'] = os.environ.get('DISTCC_HOSTS') else: print "Error: distcc not found in PATH" #env.Command('osg-config', 'osg-config.in', createOSGConfig) BuildDir(env['BUILD_DIR'], '.', duplicate=0) Export('env') SConscript(dirs=map( lambda n: env['BUILD_DIR'].Dir(n), ['Source', 'Examples', 'Tools', 'Tutorials'])) Greetings, Johannes ____________ Virus checked by G DATA AntiVirusKit Version: AVK 19.14 from 21.08.2008 Virus news: www.antiviruslab.com ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Opensg-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensg-users
