Better SENF configuration support (local_config.hh)
[senf.git] / SConstruct
index 8739426..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
@@ -57,6 +73,9 @@ 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' ],
@@ -67,6 +86,10 @@ env.Append(
            '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')
@@ -76,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
 
@@ -88,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'),
@@ -96,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) ])