Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r68176 - in sandbox/python_extensions: . site_scons site_scons/site_tools
From: talljimbo_at_[hidden]
Date: 2011-01-15 18:31:00


Author: jbosch
Date: 2011-01-15 18:30:56 EST (Sat, 15 Jan 2011)
New Revision: 68176
URL: http://svn.boost.org/trac/boost/changeset/68176

Log:
Boost.Python extensions - cleaning up build system
Added:
   sandbox/python_extensions/SConscript
      - copied, changed from r67766, /sandbox/python_extensions/SConstruct
   sandbox/python_extensions/site_scons/site_tools/
   sandbox/python_extensions/site_scons/site_tools/doxygen.py
      - copied unchanged from r67766, /sandbox/numpy/site_scons/site_tools/doxygen.py
Text files modified:
   sandbox/python_extensions/SConscript | 44 +++++++---
   sandbox/python_extensions/SConstruct | 24 ----
   sandbox/python_extensions/site_scons/scons_tools.py | 162 +++++++++++++++++++++++++++++++++++----
   3 files changed, 178 insertions(+), 52 deletions(-)

Copied: sandbox/python_extensions/SConscript (from r67766, /sandbox/python_extensions/SConstruct)
==============================================================================
--- /sandbox/python_extensions/SConstruct (original)
+++ sandbox/python_extensions/SConscript 2011-01-15 18:30:56 EST (Sat, 15 Jan 2011)
@@ -1,22 +1,40 @@
 import scons_tools
+import os
 
-bp_extensions_env = scons_tools.MakeEnvironment()
-bp_extensions_env.SetupPackages(["boost.python"])
-bp_extensions_env.Append(CPPPATH = "#")
+targets = {"boost.python.extensions":{}}
 
-if ARGUMENTS.get("debug", 0):
- build_dir = "build.debug"
-else:
- build_dir = "build"
-Export("build_dir")
+scons_tools.LocalConfiguration(
+ name="boost.python.extensions",
+ libraries=["boost_python_extensions"],
+ dependencies=("boost.python",)
+ )
 
-Export("bp_extensions_env")
-lib = SConscript("libs/python/src/SConscript", variant_dir="%s/python/src" % build_dir, duplicate=False)
-libpath = os.path.abspath("%s/python/src" % build_dir)
+bp_extensions_env = scons_tools.GetEnvironment().Clone()
+bp_extensions_env.Append(CPPPATH=["#"])
+libpath = os.path.abspath("%s/python/src" % scons_tools.GetBuildDir())
 if os.environ.has_key("LD_LIBRARY_PATH"):
     bp_extensions_env["ENV"]["LD_LIBRARY_PATH"] = "%s:%s" % (libpath, os.environ["LD_LIBRARY_PATH"])
 else:
     bp_extensions_env["ENV"]["LD_LIBRARY_PATH"] = libpath
-bp_extensions_env.Append(LIBPATH=libpath)
+bp_extensions_env.Append(LIBPATH=[libpath])
+bp_extensions_env.SetupPackages(["boost.python"])
+Export("bp_extensions_env")
+
+targets["boost.python.extensions"]["lib"] = (
+ SConscript("libs/python/src/SConscript",
+ variant_dir="%s/python/src" % scons_tools.GetBuildDir(),
+ duplicate=False)
+ )
+targets["boost.python.extensions"]["install"] = (
+ bp_extensions_env.RecursiveInstall(
+ os.path.join(bp_extensions_env["INSTALL_HEADERS"], "boost"),
+ "boost",
+ regex="(.*\.hpp)")
+ + bp_extensions_env.Install(bp_extensions_env["INSTALL_LIB"], targets["boost.python.extensions"]["lib"])
+ )
+targets["boost.python.extensions"]["test"] = (
+ SConscript("libs/python/test/SConscript",
+ variant_dir="%s/python/test" % scons_tools.GetBuildDir())
+ )
 
-SConscript("libs/python/test/SConscript", variant_dir="%s/python/test" % build_dir)
+Return("targets")

Modified: sandbox/python_extensions/SConstruct
==============================================================================
--- sandbox/python_extensions/SConstruct (original)
+++ sandbox/python_extensions/SConstruct 2011-01-15 18:30:56 EST (Sat, 15 Jan 2011)
@@ -1,22 +1,6 @@
 import scons_tools
+import os
 
-bp_extensions_env = scons_tools.MakeEnvironment()
-bp_extensions_env.SetupPackages(["boost.python"])
-bp_extensions_env.Append(CPPPATH = "#")
-
-if ARGUMENTS.get("debug", 0):
- build_dir = "build.debug"
-else:
- build_dir = "build"
-Export("build_dir")
-
-Export("bp_extensions_env")
-lib = SConscript("libs/python/src/SConscript", variant_dir="%s/python/src" % build_dir, duplicate=False)
-libpath = os.path.abspath("%s/python/src" % build_dir)
-if os.environ.has_key("LD_LIBRARY_PATH"):
- bp_extensions_env["ENV"]["LD_LIBRARY_PATH"] = "%s:%s" % (libpath, os.environ["LD_LIBRARY_PATH"])
-else:
- bp_extensions_env["ENV"]["LD_LIBRARY_PATH"] = libpath
-bp_extensions_env.Append(LIBPATH=libpath)
-
-SConscript("libs/python/test/SConscript", variant_dir="%s/python/test" % build_dir)
+base_env = scons_tools.MakeEnvironment()
+targets = SConscript("SConscript")
+scons_tools.MakeAliases(targets)

Modified: sandbox/python_extensions/site_scons/scons_tools.py
==============================================================================
--- sandbox/python_extensions/site_scons/scons_tools.py (original)
+++ sandbox/python_extensions/site_scons/scons_tools.py 2011-01-15 18:30:56 EST (Sat, 15 Jan 2011)
@@ -1,9 +1,24 @@
 import SCons.Script as scons
 import re
+import distutils.sysconfig
+import sys
 import os
 
 database = {}
 
+_environment = None
+
+scons.AddOption("--prefix", dest="install_prefix", type="string", nargs=1, action="store", metavar="DIR",
+ help="installation prefix")
+scons.AddOption("--home", dest="install_home", type="string", nargs=1, action="store", metavar="DIR",
+ help="home directory to install under")
+scons.AddOption("--install-lib", dest="install_lib", type="string", nargs=1, action="store", metavar="DIR",
+ help="installation directory for libraries")
+scons.AddOption("--install-headers", dest="install_headers", type="string", nargs=1,
+ action="store", metavar="DIR", help="installation directory for C++ header files")
+scons.AddOption("--install-python", dest="install_python", type="string", nargs=1,
+ action="store", metavar="DIR", help="installation directory for Python modules")
+
 def ApplyFlags(env, flags):
     flags = env.ParseFlags(flags)
     flags["CCFLAGS"] = [opt for opt in flags["CCFLAGS"] if not opt.startswith("-O")]
@@ -65,6 +80,12 @@
         for dependency in self.dependencies:
             database[dependency].apply(environment)
 
+ def require(self):
+ if not all(database[pkg].check() for pkg in self.dependencies):
+ print "Missing dependencies for required package '%s'." % self.name
+ scons.Exit(1)
+
+
 class FlagConfiguration(Configuration):
 
     def _apply(self, environment):
@@ -81,7 +102,7 @@
     dependencies = ()
 
     def _check(self):
- env = MakeEnvironment()
+ env = GetEnvironment().Clone()
         try:
             from distutils.sysconfig import get_config_vars, get_python_inc
         except ImportError:
@@ -112,17 +133,18 @@
     dependencies = ("python",)
 
     def _check(self):
- env = MakeEnvironment()
+ env = GetEnvironment().Clone()
         self._apply_dependencies(env)
         try:
             import numpy.distutils.misc_util
             self._variables = {"CPPPATH": numpy.distutils.misc_util.get_numpy_include_dirs()}
         except ImportError:
- context.Finish()
+ print "numpy.distutils.misc_util not found"
             return False
         self._apply(env)
         context = scons.Configure(env)
         if not context.CheckHeader(["Python.h", "numpy/arrayobject.h"]):
+ context.Finish()
             return False
         context.Finish()
         return True
@@ -139,7 +161,7 @@
         return self
 
     def _check(self):
- env = MakeEnvironment()
+ env = GetEnvironment().Clone()
         self._apply_dependencies(env)
         self._apply(env)
         context = scons.Configure(env)
@@ -198,9 +220,12 @@
         env.Execute(scons.Touch(target))
 
 def RunPythonUnitTest(target, source, env):
- path, filename = os.path.split(source[0].abspath)
- if not env.Execute("cd %s; python %s" % (path, filename)):
+ path, filename = os.path.split(target[0].abspath)
+ env["ENV"]["TESTPATH"] = path
+ env["ENV"]["PYTHONPATH"] = ":".join([path] + env["ENV"]["PYTHONPATH"].split(":"))
+ if not env.Execute('%s %s' % (sys.executable, source[0].abspath)):
         env.Execute(scons.Touch(target))
+ env["ENV"]["PYTHONPATH"] = ":".join(env["ENV"]["PYTHONPATH"].split(":")[1:])
 
 def BoostUnitTest(env, name, source):
     try:
@@ -221,21 +246,120 @@
     for package in packages:
         database[package].apply(env)
 
-def MakeEnvironment():
- env = scons.Environment(tools = ["default", "doxygen"])
- env.Append(CPPPATH="#include")
- env.Append(LIBPATH="#lib")
- env.AddMethod(RecursiveInstall, "RecursiveInstall")
- env.AddMethod(SetupPackages, "SetupPackages")
- env.AddMethod(BoostUnitTest, "BoostUnitTest")
- env.AddMethod(PythonUnitTest, "PythonUnitTest")
+def MakeAliases(targets):
+ env = GetEnvironment()
+ all_all = []
+ build_all = []
+ install_all = []
+ test_all = []
+ scons.Help("""
+To specify additional directories to add to the include or library paths, specify them
+with colon-separated lists on the command line. For example:
+
+scons CPPPATH="/home/me/include:/opt/include" LIBPATH="/home/me/lib"
+
+Supported variables are CPPPATH, LIBPATH and RPATH.
+
+Global targets: 'all' (builds everything)
+ 'build' (builds headers, libraries, and python wrappers)
+ 'install' (copies files to global bin, include and lib directories)
+ 'test' (runs unit tests; requires install)
+
+These targets can be built for individual packages with the syntax
+'[package]-[target]'. Some packages support additional targets, given below.
+
+Packages:
+
+"""
+ )
+ for pkg_name in sorted(targets.keys()):
+ pkg_targets = targets[pkg_name]
+ extra_targets = tuple(k for k in pkg_targets.keys() if k not in
+ ("all","build","install","test"))
+ if extra_targets:
+ scons.Help("%-25s %s\n" % (pkg_name, ", ".join("'%s'" % k for k in extra_targets)))
+ else:
+ scons.Help("%-25s (none)\n" % pkg_name)
+ pkg_all = pkg_targets.values()
+ pkg_build = [pkg_targets[k] for k in ("headers", "lib", "python") if k in pkg_targets]
+ env.Alias(pkg_name, pkg_all)
+ env.Alias("%s-all" % pkg_name, pkg_all)
+ env.Alias("%s-build" % pkg_name, pkg_build)
+ for target_name in pkg_targets:
+ env.Alias("%s-%s" % (pkg_name, target_name), pkg_targets[target_name])
+ all_all.extend(pkg_all)
+ build_all.extend(pkg_build)
+ install_all.extend(pkg_targets.get("install", pkg_build))
+ test_all.extend(pkg_targets.get("test", pkg_targets.get("install", pkg_build)))
+ env.Alias("all", all_all)
+ env.Alias("build", build_all)
+ env.Alias("install", install_all)
+ env.Alias("test", test_all)
+ env.Default("build")
+
+
+def MakeEnvironment(default_prefix="/usr/local", prefix_is_home=False):
+ global _environment
+ _environment = scons.Environment(tools = ["default", "doxygen"])
+ if scons.ARGUMENTS.has_key('LIBPATH'):
+ _environment.Append(LIBPATH=[os.path.abspath(s) for s in scons.ARGUMENTS['LIBPATH'].split(":")])
+ if scons.ARGUMENTS.has_key('RPATH'):
+ _environment.Append(RPATH=[os.path.abspath(s) for s in scons.ARGUMENTS['RPATH'].split(":")])
+ if scons.ARGUMENTS.has_key('CPPPATH'):
+ _environment.Append(CPPPATH=[os.path.abspath(s) for s in scons.ARGUMENTS['CPPPATH'].split(":")])
+ prefix = scons.GetOption("install_prefix")
+ if prefix is None:
+ prefix = scons.GetOption("install_home")
+ if prefix is None:
+ prefix = default_prefix
+ else:
+ preefix_is_home = True
+ install_lib = scons.GetOption("install_lib")
+ if install_lib is None:
+ install_lib = os.path.join(prefix, "lib")
+ install_headers = scons.GetOption("install_headers")
+ if install_headers is None:
+ install_headers = os.path.join(prefix, "include")
+ install_python = scons.GetOption("install_python")
+ if install_python is None:
+ if prefix_is_home:
+ install_python = os.path.join(install_lib, "python")
+ else:
+ python_lib = distutils.sysconfig.get_python_lib()
+ if python_lib.startswith(distutils.sysconfig.PREFIX):
+ install_python = os.path.join(prefix, python_lib[len(distutils.sysconfig.PREFIX)+1:])
+ else:
+ print "Cannot determine default Python install directory."
+ print "Please specify --install-python on the command line."
+ scons.Exit(1)
+ _environment["INSTALL_LIB"] = install_lib
+ _environment["INSTALL_HEADERS"] = install_headers
+ _environment["INSTALL_PYTHON"] = install_python
+ _environment.AddMethod(RecursiveInstall, "RecursiveInstall")
+ _environment.AddMethod(SetupPackages, "SetupPackages")
+ _environment.AddMethod(BoostUnitTest, "BoostUnitTest")
+ _environment.AddMethod(PythonUnitTest, "PythonUnitTest")
     for var in ("PATH", "LD_LIBRARY_PATH", "PYTHONPATH", "PKG_CONFIG_PATH"):
         if os.environ.has_key(var):
- env["ENV"][var] = os.environ[var]
+ _environment["ENV"][var] = os.environ[var]
+ else:
+ _environment["ENV"][var] = ""
     debug = scons.ARGUMENTS.get('debug', 0)
     if int(debug):
- env.Replace(CCFLAGS=["-Wall","-g","-O0"])
+ _environment.Replace(CCFLAGS=["-Wall","-g","-O0"])
+ else:
+ _environment.Replace(CCFLAGS=["-Wall","-O2"])
+ _environment.Append(CPPDEFINES=["NDEBUG"])
+ return _environment
+
+def GetEnvironment():
+ if _environment is None:
+ raise LogicErrorException("scons_tools error: root environment not initialized")
+ return _environment
+
+def GetBuildDir():
+ if scons.ARGUMENTS.get("debug", 0):
+ return "build.debug"
     else:
- env.Replace(CCFLAGS=["-Wall","-O2"])
- env.Append(CPPDEFINES="NDEBUG")
- return env
+ return "build"
+


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk