diff --git a/.gitignore b/.gitignore
index 16fdda1c0ee58cafef1cb33951c3afabd31d138c..721dcf9377a334d6d4f75617ea31df6f7c2ee639 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,4 +21,5 @@ Session.vim
 cscope.out
 build/
 .sconsign.dblite
+*.os
 *.pyc
diff --git a/SConstruct b/SConstruct
index b53947fa5fe242aff54f622777d6bff261e089ba..50c185be815a8777c72f9cd550d00a70e6d0744e 100644
--- a/SConstruct
+++ b/SConstruct
@@ -54,7 +54,12 @@ AddOption("--coverage",
           action="store_true",
           help="Build with coverage instrumentation")
 
-env['BUILDDIR'] = 'build/$VARIANT'
+AddOption("--in-place",
+          dest="in_place",
+          default=False,
+          action="store_true",
+          help="Build in-place, rather than in the build/<variant> tree")
+
 
 dbg = env.Clone(VARIANT='debug')
 dbg.Append(CCFLAGS=['-g'])
@@ -87,10 +92,16 @@ env["ENV"].update(x for x in os.environ.items() if x[0].startswith("CCC_"))
 
 Export('env')
 
-env.SConscript(["src/SConscript"], variant_dir='build/$VARIANT/src')
-env.SConscript(["examples/SConscript"], variant_dir='build/$VARIANT/examples')
+if not GetOption("in_place"):
+    env['BUILD_BASE'] = 'build/$VARIANT'
+    env.SConscript(["src/SConscript"], variant_dir='$BUILD_BASE/src')
+    env.SConscript(["examples/SConscript"], variant_dir='$BUILD_BASE/examples')
+else:
+    env['BUILD_BASE'] = '.'
+    env.SConscript(["src/SConscript"])
+    env.SConscript(["examples/SConscript"])
 
-env.Command('test', 'build/$VARIANT/src/test_suite', 'env LD_LIBRARY_PATH=build/$VARIANT/src $SOURCE')
+env.Command('test', '$BUILD_BASE/src/test_suite', 'env LD_LIBRARY_PATH=$BUILD_BASE/src $SOURCE')
 
 env.Alias("install", "$libpath")
 env.Alias("install", "$incpath")