[notmuch] [PATCH] Add SCons build files.

Jeffrey C. Ollie jeff at ocjtech.us
Sun Nov 22 05:47:10 PST 2009


The SCons build files included here *should* do everything that the
current Makefiles do, plus a little bit of configuration checking.  To
build/install:

scons all emacs
sudo scons install
sudo scons install-emacs
sudo scons install-desktop

Various installation directories can be customized:

sudo scons install DESTDIR=/tmp/buildroot prefix=/opt/notmuch

See the output of 'scons -h' for a complete list of the variables that
can be modified.

Signed-off-by: Jeffrey C. Ollie <jeff at ocjtech.us>
---
 .gitignore     |    3 +
 SConstruct     |  226 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/SConscript |   19 +++++
 3 files changed, 248 insertions(+), 0 deletions(-)
 create mode 100644 SConstruct
 create mode 100644 lib/SConscript

diff --git a/.gitignore b/.gitignore
index 8794354..6661b3b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,6 @@ notmuch.1.gz
 *~
 .*.swp
 *.elc
+.sconsign.dblite
+.sconf_temp
+config.log
diff --git a/SConstruct b/SConstruct
new file mode 100644
index 0000000..8d6960d
--- /dev/null
+++ b/SConstruct
@@ -0,0 +1,226 @@
+# -*- mode: python; coding: utf-8 -*-
+
+import os
+
+variables = Variables('custom.py')
+
+variables.Add('DESTDIR',
+              'Destination directory',
+              '')
+
+variables.Add('prefix',
+              'Installation prefix',
+              '/usr/local')
+
+variables.Add('bindir',
+              'Directory that user binaries go into',
+              '${prefix}/bin')
+
+variables.Add('datadir',
+              'Directory that static data files go into',
+              '${prefix}/share')
+
+variables.Add('mandir',
+              'Directory that manual pages go into',
+              '${datadir}/man')
+
+variables.Add('emacs_lispdir',
+              'Directory that Emacs LISP files go into',
+              '${default_emacs_lispdir}')
+
+variables.Add('sysconfdir',
+              'Directory that system configuration files go into',
+              '/etc')
+
+variables.Add('bash_completion_dir',
+              'Directory that Bash completion files go into',
+              '${sysconfdir}/bash_completion.d')
+
+variables.Add('desktop_dir',
+              'Directory that desktop files go into',
+              '${datadir}/applications')
+
+variables.Add('gzip',
+              'Gzip executable',
+              'gzip')
+
+variables.Add('emacs',
+              'Emacs executable',
+              'emacs')
+
+def InstallPerm(env, dest, files, perm):
+    obj = env.Install(dest, files)
+    for i in obj:
+        env.AddPostAction(i, Chmod(str(i), perm))
+    return dest
+
+def InstallAsPerm(env, dest, files, perm):
+    obj = env.InstallAs(dest, files)
+    for i in obj:
+        env.AddPostAction(i, Chmod(str(i), perm))
+    return dest
+
+topenv = Environment(variables = variables,
+                     BUILDERS = {'InstallPerm': InstallPerm,
+                                 'InstallAsPerm': InstallAsPerm})
+
+topenv.Append(CPPPATH=['#/lib'])
+
+cflags = None
+if os.environ.has_key('CFLAGS'):
+    cflags = topenv.ParseFlags(os.environ['CFLAGS'])
+    topenv.MergeFlags(cflags)
+
+if os.environ.has_key('CXXFLAGS'):
+    cxxflags = topenv.ParseFlags(os.environ['CXXFLAGS'])
+    topenv.MergeFlags(cxxflags)
+
+if cflags is None or cxxflags is None:
+    optflags = topenv.ParseFlags('-O2')
+    topenv.MergeFlags(optflags)
+
+warnflags = topenv.ParseFlags('-Wall -Wextra -Wmissing-declarations -Wwrite-strings -Wswitch-enum')
+topenv.MergeFlags(warnflags)
+
+def CheckPkgConfig(context, version):
+    context.Message('Checking for pkg-config... ')
+    result = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
+    context.Result(result)
+    return result
+ 
+def CheckPkg(context, name):
+    context.Message('Checking for %s... ' % name)
+    result = context.TryAction('pkg-config --exists \'%s\'' % name)[0]
+    context.Result(result)
+    return result
+
+def CheckXapian(context):
+    context.Message('Checking for xapian-core... ')
+    for xapian_config in ['xapian-config-1.1', 'xapian-config']:
+        result, output = context.TryAction('%s --version > $TARGET' % xapian_config)
+        if result:
+            xapian_version = output.strip().split()[-1]
+            context.env['xapian_config'] = xapian_config
+            context.env['xapian_version'] = xapian_version
+            context.Result(xapian_version)
+            return result
+    context.Result(False)
+    return False
+
+def CheckEmacs(context):
+    context.Message('Checking for emacs... ')
+    context.env['default_emacs_lispdir'] = '${prefix}/share/emacs/site-lisp'
+    result = context.TryAction('pkg-config --exists emacs')
+    if result:
+        result, output = context.TryAction('pkg-config emacs --variable sitepkglispdir > $TARGET')
+        if result:
+            context.env['default_emacs_lispdir'] = output.strip()
+        context.Result(True)
+        return True
+    context.Result(False)
+    return False
+
+def CheckDesktopFileInstall(context):
+    context.Message('Checking for desktop-file-install... ')
+    result = context.TryAction('desktop-file-install -h')[0]
+    context.Result(result)
+    return result
+
+conf = Configure(topenv, custom_tests = {'CheckPkgConfig': CheckPkgConfig,
+                                         'CheckPkg': CheckPkg,
+                                         'CheckXapian': CheckXapian,
+                                         'CheckEmacs': CheckEmacs,
+                                         'CheckDesktopFileInstall': CheckDesktopFileInstall})
+
+if not conf.CheckPkgConfig('0.23'):
+    print 'pkg-config >= 0.23 not found.'
+    Exit(1)
+
+if not conf.CheckPkg('glib-2.0 >= 2.22'):
+    print 'glib-2.0 >= 2.22 not found'
+    Exit(1)
+
+if not conf.CheckPkg('gmime-2.4 >= 2.4.0'):
+    print 'gmime-2.4 >= 2.4.0 not found'
+    Exit(1)
+
+if not conf.CheckPkg('talloc >= 2.0.0'):
+    print 'talloc >= 2.0.0 not found'
+    Exit(1)
+
+if not conf.CheckXapian():
+    print 'xapian not found'
+    Exit(1)
+
+emacs = conf.CheckEmacs()
+
+valgrind = conf.CheckPkg('valgrind >= 3.5.0')
+
+desktop = conf.CheckDesktopFileInstall()
+
+if not conf.CheckFunc('strndup'):
+    conf.env.Append(CPPDEFINES = ['NEED_STRNDUP'])
+
+if not conf.CheckFunc('getline'):
+    conf.env.Append(CPPDEFINES = ['NEED_GETLINE'])
+
+topenv = conf.Finish()
+
+topenv.ParseConfig('pkg-config glib-2.0 --cflags --libs')
+topenv.ParseConfig('pkg-config gmime-2.4 --cflags --libs')
+topenv.ParseConfig('pkg-config talloc --cflags --libs')
+topenv.ParseConfig('${xapian_config} --cxxflags --libs')
+if valgrind:
+    topenv.ParseConfig('pkg-config valgrind --cflags')
+    topenv.Append(CPPDEFINES = ['HAVE_VALGRIND'])
+
+Help(variables.GenerateHelpText(topenv))
+
+Export('topenv')
+
+libnotmuch = SConscript(['lib/SConscript'])
+
+env = topenv.Clone()
+
+notmuch = env.Program('notmuch', ['debugger.c',
+                                  'gmime-filter-reply.c',
+                                  'notmuch.c',
+                                  'notmuch-config.c',
+                                  'notmuch-dump.c',
+                                  'notmuch-new.c',
+                                  'notmuch-reply.c',
+                                  'notmuch-restore.c',
+                                  'notmuch-search.c',
+                                  'notmuch-setup.c',
+                                  'notmuch-show.c',
+                                  'notmuch-tag.c',
+                                  'notmuch-time.c',
+                                  'query-string.c',
+                                  'show-message.c',
+                                  libnotmuch])
+env.Alias('all', notmuch)
+
+env.Install('${DESTDIR}${bindir}', notmuch)
+env.Alias('install', '${DESTDIR}${bindir}')
+
+manpage = env.Command('notmuch.1.gz', 'notmuch.1', '${gzip} -9 < $SOURCE > $TARGET')
+env.Alias('all', manpage)
+
+env.InstallPerm('${DESTDIR}${mandir}/man1', manpage, 0644)
+env.Alias('install', '${DESTDIR}${mandir}/man1')
+
+env.InstallAsPerm('${DESTDIR}${bash_completion_dir}/notmuch', 'contrib/notmuch-completion.bash', 0644)
+env.Alias('install', '${DESTDIR}${bash_completion_dir}')
+
+if desktop:
+    env.Command('${DESTDIR}${desktop_dir}/notmuch.desktop', 'notmuch.desktop', 'desktop-file-install --mode 0644 --dir ${DESTDIR}${desktop_dir} ${SOURCE}')
+    env.Alias('install-desktop', '${DESTDIR}${desktop_dir}')
+
+if emacs:
+    elisp = env.Command('notmuch.elc', 'notmuch.el', '${emacs} --no-window-system --no-site-file --no-init-file --no-splash --batch --funcall batch-byte-compile $SOURCE')
+    env.Alias('emacs', elisp)
+    env.InstallPerm('${DESTDIR}${emacs_lispdir}', elisp, 0644)
+    env.InstallPerm('${DESTDIR}${emacs_lispdir}', 'notmuch.el', 0644)
+    env.Alias('install-emacs', '${DESTDIR}${emacs_lispdir}')
+
+Default('all')
diff --git a/lib/SConscript b/lib/SConscript
new file mode 100644
index 0000000..eb38516
--- /dev/null
+++ b/lib/SConscript
@@ -0,0 +1,19 @@
+# -*- mode: python; coding: utf-8 -*-
+
+Import('topenv')
+
+env = topenv.Clone()
+
+libnotmuch = env.Library('notmuch', ['libsha1.c',
+                                     'message-file.c',
+                                     'messages.c',
+                                     'sha1.c',
+                                     'tags.c',
+                                     'xutil.c',
+                                     'database.cc',
+                                     'index.cc',
+                                     'message.cc',
+                                     'query.cc',
+                                     'thread.cc'])
+
+Return('libnotmuch')
-- 
1.6.5.2



More information about the notmuch mailing list