Clean up DOXYGEN build var setting
[senf.git] / site_scons / senfutil.py
index 55665dc..2c88b64 100644 (file)
@@ -31,6 +31,13 @@ class BuildTypeOptions:
         type = env['final'] and "final" or env['debug'] and "debug" or "normal"
         return env[self._var + "_" + type]
 
+def loadTools(env):
+    global senfutildir
+    tooldir = os.path.join(senfutildir, 'site_tools')
+    for tool in os.listdir(tooldir):
+        name, ext = os.path.splitext(tool)
+        if ext == '.py' and name != "__init__" : env.Tool(name, [ tooldir ])
+
 def parseArguments(env, *defs):
     vars = Variables(args=ARGUMENTS)
     for d in defs : vars.Add(d)
@@ -61,25 +68,16 @@ Special command line parameters:
 # b) parse the LOGLEVELS parameter into the correct SENF_LOG_CONF syntax
 # c) check for a local SENF, set options accordingly and update that SENF if needed
 
-def SetupForSENF(env, senf_paths = []):
+def SetupForSENF(env, senf_path = []):
     global senfutildir
-    senf_paths.extend(('senf', '../senf', os.path.dirname(senfutildir), '/usr/local', '/usr'))
-    tooldir = os.path.join(senfutildir, 'site_tools')
+    senf_path.extend(('senf', os.path.dirname(senfutildir), '/usr/local', '/usr'))
 
-    env.Tool('Boost',       [ tooldir ])
-    env.Tool('PhonyTarget', [ tooldir ])
-    env.Tool('Yaptu',       [ tooldir ])
-    env.Tool('CopyToDir',   [ tooldir ])
-    env.Tool('Doxygen',     [ tooldir ])
+    loadTools(env)
 
     env.Append(
         LIBS              = [ 'senf', 'rt', '$BOOSTREGEXLIB',
                               '$BOOSTIOSTREAMSLIB', '$BOOSTSIGNALSLIB',
                               '$BOOSTFSLIB' ],
-        BOOSTREGEXLIB     = 'boost_regex',
-        BOOSTIOSTREAMSLIB = 'boost_iostreams',
-        BOOSTSIGNALSLIB   = 'boost_signals',
-        BOOSTFSLIB        = 'boost_filesystem',
         
         CXXFLAGS          = [ '-Wno-long-long', '$CXXFLAGS_' ],
         CXXFLAGS_         = BuildTypeOptions('CXXFLAGS'),
@@ -95,11 +93,6 @@ def SetupForSENF(env, senf_paths = []):
         LOGLEVELS_        = BuildTypeOptions('LOGLEVELS'),
         )
 
-    rev = 'unknown'
-    if os.path.isdir('.svn'):
-        rev = 'r'+os.popen('svnversion').read().strip().lower()
-    elif os.path.isdir('.git'):
-        rev = 'r'+os.popen('gitsvnversion').read().strip().lower()
     env.SetDefault( 
         CXXFLAGS_final    = [],
         CXXFLAGS_normal   = [],
@@ -121,7 +114,7 @@ def SetupForSENF(env, senf_paths = []):
         DOCLINKS          = [],
         PROJECTEMAIL      = "nobody@nowhere.org",
         COPYRIGHT         = "nobody",
-        REVISION          = rev,
+        REVISION          = "unknown",
         )
 
     # Interpret command line options
@@ -133,27 +126,37 @@ def SetupForSENF(env, senf_paths = []):
 
     # If we have a symbolic link (or directory) 'senf', we use it as our
     # senf repository
-    for path in senf_paths:
+    for path in senf_path:
         if not path.startswith('/') : sconspath = '#/%s' % path
         else                        : sconspath = path
         if os.path.exists(os.path.join(path,"senf/config.hh")):
-            print "\nUsing SENF in '%s'\n" \
-                % ('/..' in sconspath and os.path.abspath(path) or sconspath)
+            if not env.GetOption('no_progress'):
+                print "\nUsing SENF in '%s'\n" \
+                    % ('/..' in sconspath and os.path.abspath(path) or sconspath)
             env.Append( LIBPATH = [ sconspath ],
                         CPPPATH = [ sconspath ],
-                        BUNDLEDIR = sconspath )
+                        BUNDLEDIR = sconspath,
+                        SENFDIR = sconspath,
+                        SENFSYSLAYOUT = False)
             try:
                 env.MergeFlags(file(os.path.join(path,"senf.conf")).read())
             except IOError:
-                print "(SENF configuration file 'senf.conf' not found, assuming non-final SENF)"
+                if not env.GetOption('no_progress'):
+                    print "(SENF configuration file 'senf.conf' not found, assuming non-final SENF)"
                 env.Append(CPPDEFINES = [ 'SENF_DEBUG' ])
             break
         elif os.path.exists(os.path.join(path,"include/senf/config.hh")):
-            print "\nUsing system SENF in '%s/'\n" % sconspath
-            env.Append(BUNDLEDIR = os.path.join(sconspath,"lib/senf"))
+            if not env.GetOption('no_progress'):
+                print "\nUsing system SENF in '%s/'\n" % sconspath
+            env.Append(BUNDLEDIR = os.path.join(sconspath,"lib/senf"),
+                       SENFDIR = sconspath,
+                       SENFSYSLAYOUT = True)
             break
     else:
-        print "\nSENF library not found .. trying build anyway !!\n"
+        if not env.GetOption('no_progress'):
+            print "\nSENF library not found .. trying build anyway !!\n"
+
+    env.Alias('all', '#')
 
 
 def DefaultOptions(env):
@@ -168,20 +171,52 @@ def DefaultOptions(env):
     )
 
 def Glob(env, exclude=[], subdirs=[]):
-    testSources = glob.glob("*.test.cc")
-    sources = [ x for x in glob.glob("*.cc") if x not in testSources and x not in exclude ]
+    testSources = env.Glob("*.test.cc", strings=True)
+    sources = [ x 
+                for x in env.Glob("*.cc", strings=True) 
+                if x not in testSources and x not in exclude ]
     for subdir in subdirs:
-        testSources += glob.glob(os.path.join(subdir,"*.test.cc"))
-        sources += [ x for x in glob.glob(os.path.join(subdir,"*.cc"))
+        testSources += env.Glob(os.path.join(subdir,"*.test.cc"), strings=True)
+        sources += [ x 
+                     for x in env.Glob(os.path.join(subdir,"*.cc"), strings=True)
                      if x not in testSources and x not in exclude ]
+    sources.sort()
+    testSources.sort()
     return (sources, testSources)
 
-def Doxygen(env, doxyheader=None, doxyfooter=None, doxycss=None, mydoxyfile=False, **kw):
+tagfiles = None
+
+def Doxygen(env, doxyheader=None, doxyfooter=None, doxycss=None, mydoxyfile=False, senfdoc_path=[],
+            **kw):
     # Additional interesting keyword arguments or environment variables:
-    #    PROJECTNAME, DOCLINKS, PROJECTEMAIL, COPYRIGHT
+    #    PROJECTNAME, DOCLINKS, PROJECTEMAIL, COPYRIGHT, REVISION
 
+    global senfutildir
+    global tagfiles
     libdir=os.path.join(senfutildir, 'lib')
     
+    if tagfiles is None:
+        senfdocdir = None
+        senfdoc_path.extend(('senfdoc', '$SENFDIR', '$SENFDIR/manual',
+                             '$SENFDIR/share/doc/senf', '$SENFDIR/share/doc/libsenf-doc/html'))
+        for path in senfdoc_path:
+            path = env.Dir(path).get_path()
+            if os.path.exists(os.path.join(path, "doc/doclib.tag")):
+                senfdocdir = path
+                break
+        tagfiles = []
+        if senfdocdir is None:
+            if not env.GetOption('no_progress'):
+                print "(SENF documentation not found)"
+        else:
+            for dir, dirs, files in os.walk(senfdocdir):
+                tagfiles.extend([ os.path.join(dir,f) for f in files if f.endswith('.tag') ])
+                if dir.endswith('/doc') : 
+                    try: dirs.remove('html')
+                    except ValueError: pass
+                for d in dirs: 
+                    if d.startswith('.') : dirs.remove(d)
+    
     if env.GetOption('clean'):
         env.Clean('doc', env.Dir('doc'))
         if not mydoxyfile:
@@ -193,27 +228,39 @@ def Doxygen(env, doxyheader=None, doxyfooter=None, doxycss=None, mydoxyfile=Fals
                                      os.path.join(libdir, "Doxyfile.yap"),
                                      env)
 
+    envvalues = [ env.Value('$PROJECTNAME'),
+                  env.Value('$DOCLINKS'),
+                  env.Value('$PROJECTEMAIL'),
+                  env.Value('$COPYRIGHT'),
+                  env.Value('$REVISION') ]
+
     # The other files are created using dependencies
     if doxyheader: 
         doxyheader = env.CopyToDir(env.Dir("doc"), doxyheader)
     else:
         doxyheader = env.Yaptu("doc/doxyheader.html", os.path.join(libdir, "doxyheader.yap"), **kw)
+        env.Depends(doxyheader, envvalues)
     if doxyfooter:
         doxyfooter = env.CopyToDir(env.Dir("doc"), doxyfooter)
     else:
         doxyfooter = env.Yaptu("doc/doxyfooter.html", os.path.join(libdir, "doxyfooter.yap"), **kw)
+        env.Depends(doxyfooter, envvalues)
     if doxycss:
         doxycss = env.CopyToDir(env.Dir("doc"), doxycss)
     else:
         doxycss    = env.CopyToDir(env.Dir("doc"), os.path.join(libdir, "doxy.css"))
 
     doc = env.Doxygen("Doxyfile",
-                      DOXYOPTS   = [ '--html' ],
+                      DOXYOPTS   = [ '--html', '--tagfiles', '"$TAGFILES"' ],
                       DOXYENV    = { 'TOPDIR'     : env.Dir('#').abspath,
                                      'LIBDIR'     : libdir,
+                                     'REVISION'   : '$REVISION',
+                                     'tagfiles'   : '$TAGFILES',
                                      'output_dir' : 'doc',
                                      'html_dir'   : 'html',
-                                     'html'       : 'YES' },
+                                     'html'       : 'YES',
+                                     'DOXYGEN'    : '$DOXYGEN' },
+                      TAGFILES   = tagfiles, 
                       DOCLIBDIR  = libdir,
                       DOXYGENCOM = "$DOCLIBDIR/doxygen.sh $DOXYOPTS $SOURCE")