Better SENF configuration support (local_config.hh)
[senf.git] / SConstruct
index 22a95af..e723e46 100644 (file)
@@ -1,6 +1,6 @@
 # -*- python -*-
 
-import sys, glob, os.path, datetime, pwd, time
+import sys, glob, os.path, datetime, pwd, time, fnmatch
 sys.path.append('senfscons')
 import SENFSCons
 
@@ -28,6 +28,22 @@ def updateRevision(target, source, env):
         'date': time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()) }
     file('debian/changelog','w').write(changelog)
 
+def nonemptyFile(f):
+    try: return os.stat(f).st_size > 0
+    except OSError: return False
+
+def checkLocalConf(target, source, env):
+    if [ True for f in env['CONFIG_FILES'] if nonemptyFile(f) ]:
+        print
+        print "You have made local modifications to 'SConfig' and/or 'Doxyfile.local'."
+        print "Building a debian package would remove those files."
+        print
+        print "To continue, remove the offending file(s) and try again. Alternatively,"
+        print "build a source package using 'scons debsrc' and may then build debian"
+        print "binary packages from this source-package without disrupting your print local"
+        print "configuration."
+        print
+        return 1
 
 ###########################################################################
 # Load utilities and setup libraries and configure build
@@ -53,6 +69,13 @@ if os.environ.get('debian_build'):
 else:
     rev = 'r' + os.popen("svnversion").read().strip().lower()
 
+logname = os.environ.get('LOGNAME')
+if not logname:
+    logname = pwd.getpwuid(os.getuid()).pw_name
+
+def configFilesOpts(target, source, env, for_signature):
+    return [ '-I%s' % os.path.split(f)[1] for f in env['CONFIG_FILES'] ]
+
 env.Append(
    CPPPATH = [ '#' ],
    LIBS = [ 'iberty', '$BOOSTREGEXLIB' ],
@@ -60,9 +83,13 @@ env.Append(
    DOXY_HTML_XSL = '#/doclib/html-munge.xsl',
    ENV = { 'TODAY' : str(datetime.date.today()),
            'REVISION' : rev,
-           'LOGNAME' : os.environ['LOGNAME'], # needed by the debian build scripts
+           'LOGNAME' : logname, # needed by the debian build scripts
            'CONCURRENCY_LEVEL' : env.GetOption('num_jobs') or "1"
            },
+   CONFIG_FILES = [ 'Doxyfile.local', 'SConfig', 'local_config.hh' ],
+   CONFIG_FILES_OPTS = configFilesOpts,
+   CLEAN_PATTERNS = [ '*.pyc', 'semantic.cache', '.sconsign', '.sconsign.dblite' ],
+   BUILDPACKAGE_COMMAND = "dpkg-buildpackage -us -uc -rfakeroot -I.svn $CONFIG_FILES_OPTS",
 )
 
 Export('env')
@@ -72,6 +99,10 @@ Export('env')
 if not env.GetOption('clean') and not os.path.exists("Doxyfile.local"):
     Execute(Touch("Doxyfile.local"))
 
+# Create local_config.h
+if not env.GetOption('clean') and not os.path.exists("local_config.hh"):
+    Execute(Touch("local_config.hh"))
+
 ###########################################################################
 # Define build targets
 
@@ -84,6 +115,8 @@ SENFSCons.DoxyXRef(env,
                    HTML_HEADER = '#/doclib/doxy-header-overview.html',
                    HTML_FOOTER = '#/doclib/doxy-footer.html')
 
+SENFSCons.InstallIncludeFiles(env, [ 'config.hh' ])
+
 # Build combined library 'libsenf'
 libsenf = env.Library(
     SENFSCons.LibPath('senf'),
@@ -92,13 +125,20 @@ env.Default(libsenf)
 env.Alias('install_all', env.Install('$LIBINSTALLDIR', libsenf))
 
 env.AlwaysBuild(
-    env.Alias('deb', [], [ updateRevision,
-                           "dpkg-buildpackage -us -uc -rfakeroot -I.svn" ]))
+    env.Alias('deb', [], [ checkLocalConf,
+                           updateRevision,
+                           "$BUILDPACKAGE_COMMAND" ]))
 
 env.AlwaysBuild(
     env.Alias('debsrc', [], [ updateRevision,
-                              "dpkg-buildpackage -us -uc -rfakeroot -S -I.svn" ]))
+                              "$BUILDPACKAGE_COMMAND -S" ]))
 
 env.AlwaysBuild(
-    env.Alias('debbin', [], [ updateRevision,
-                              "dpkg-buildpackage -us -uc -rfakeroot -nc" ]))
+    env.Alias('debbin', [], [ checkLocalConf,
+                              updateRevision,
+                              "$BUILDPACKAGE_COMMAND -nc" ]))
+
+env.Clean('all', [ os.path.join(path,f)
+                   for path, subdirs, files in os.walk('.')
+                   for pattern in env['CLEAN_PATTERNS']
+                   for f in fnmatch.filter(files,pattern) ])