From 64b5e307d23894d06c2f37de9c2d2e6094d0e6f4 Mon Sep 17 00:00:00 2001
From: Dan Hirsch <thequux@upstandinghackers.com>
Date: Tue, 29 Oct 2013 17:35:37 -0400
Subject: [PATCH] Added install target

---
 SConstruct     | 32 +++++++++++++++++++++++++++++++-
 src/SConscript | 11 +++++++++--
 2 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/SConstruct b/SConstruct
index 2032613c..2a119d9d 100644
--- a/SConstruct
+++ b/SConstruct
@@ -1,8 +1,36 @@
 # -*- python -*-
 import os
 import os.path
+import sys
+
 env = Environment(ENV = {'PATH' : os.environ['PATH']})
 
+vars = Variables(None, ARGUMENTS)
+vars.Add(PathVariable('DESTDIR', "Root directory to install in (useful for packaging scripts)", None, PathVariable.PathIsDirCreate))
+vars.Add(PathVariable('prefix', "Where to install in the FHS", "/usr/local", PathVariable.PathAccept))
+
+env = Environment(variables=vars)
+
+def calcInstallPath(*elements):
+    path = os.path.abspath(os.path.join(*map(env.subst, elements)))
+    if 'DESTDIR' in env:
+        path = os.path.join(env['DESTDIR'], os.path.relpath(path, start="/"))
+    return path
+
+rel_prefix = not os.path.isabs(env['prefix'])
+env['prefix'] = os.path.abspath(env['prefix'])
+if 'DESTDIR' in env:
+    env['DESTDIR'] = os.path.abspath(env['DESTDIR'])
+    if rel_prefix:
+        print >>sys.stderr, "--!!-- You used a relative prefix with a DESTDIR. This is probably not what you"
+        print >>sys.stderr, "--!!-- you want; files will be installed in"
+        print >>sys.stderr, "--!!--    %s" % (calcInstallPath("$prefix"),)
+
+
+env['libpath'] = calcInstallPath("$prefix", "lib")
+env['incpath'] = calcInstallPath("$prefix", "include", "hammer")
+# TODO: Add pkgconfig
+
 env.MergeFlags("-std=gnu99 -Wall -Wextra -Werror -Wno-unused-parameter -Wno-attributes -lrt")
 
 AddOption("--variant",
@@ -35,8 +63,10 @@ if os.getenv("CC") == "clang":
 
 Export('env')
 
-
 env.SConscript(["src/SConscript"], variant_dir='build/$VARIANT/src')
 env.SConscript(["examples/SConscript"], variant_dir='build/$VARIANT/examples')
 
 env.Command('test', 'build/$VARIANT/src/test_suite', 'env LD_LIBRARY_PATH=build/$VARIANT/src $SOURCE')
+
+env.Alias("install", "$libpath")
+env.Alias("install", "$incpath")
diff --git a/src/SConscript b/src/SConscript
index 86360198..9b5c868c 100644
--- a/src/SConscript
+++ b/src/SConscript
@@ -3,6 +3,12 @@ Import('env')
 
 bindings = []
 
+dist_headers = [
+    "hammer.h",
+    "allocator.h",
+    "glue.h"
+]
+
 parsers = ['parsers/%s.c'%s for s in
            ['action',
             'and',
@@ -55,13 +61,14 @@ tests = ['t_benchmark.c',
 libhammer_shared = env.SharedLibrary('hammer', parsers + backends + misc_hammer_parts)
 libhammer_static = env.StaticLibrary('hammer', parsers + backends + misc_hammer_parts)
 
-
+env.Install("$libpath", [libhammer_static, libhammer_shared])
+env.Install("$incpath", dist_headers)
 
 testenv = env.Clone()
 testenv.ParseConfig('pkg-config --cflags --libs glib-2.0')
 testenv.Append(LIBS=['hammer'], LIBPATH=['.'])
 testenv.Program('test_suite', tests + ['test_suite.c'])
-    
+
 Export("libhammer_static libhammer_shared")
 
 for b in bindings:
-- 
GitLab