| """ |
| See BENTO_BUILD.txt. |
| |
| Caveats: |
| |
| - no automatic detection for BLAS/LAPACK/etc... You need to set it up |
| manually for now (except on Mac OS X and Debian/Ubuntu). The upside is |
| that it is extremely easy to do so |
| - bento is still in flux, and some things may changes between releases. |
| """ |
| |
| import os |
| import sys |
| import subprocess |
| |
| # Ugly but necessary hack: import numpy here so that wscript in sub directories |
| # will see this numpy and not an already installed one |
| import __builtin__ |
| __builtin__.__NUMPY_SETUP__ = True |
| |
| import waflib |
| |
| from numpy.distutils.conv_template \ |
| import \ |
| process_str as process_c_str |
| |
| from bento.commands import hooks |
| from bento.utils.utils \ |
| import \ |
| cmd_is_runnable |
| from bento.backends.waf_backend \ |
| import \ |
| WAF_TOOLDIR |
| from bento.backends.waf_tools \ |
| import \ |
| blas_lapack |
| |
| sys.path.insert(0, os.getcwd()) |
| try: |
| _SETUP_PY = __import__("setup") |
| finally: |
| sys.path.pop(0) |
| |
| def compute_git_revision(top_node): |
| git_repo_node = top_node.find_node(".git") |
| if git_repo_node and cmd_is_runnable(["git", "--version"]): |
| s = subprocess.Popen(["git", "rev-parse", "HEAD"], |
| stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=top_node.abspath()) |
| out = s.communicate()[0] |
| return out.decode().strip() |
| else: |
| return "" |
| |
| def _register_metadata(context): |
| git_revision = compute_git_revision(context.top_node) |
| full_version = context.pkg.version |
| if not _SETUP_PY.ISRELEASED: |
| full_version += '.dev-' + git_revision[:7] |
| |
| context.register_metadata("git_revision", git_revision) |
| context.register_metadata("is_released", _SETUP_PY.ISRELEASED) |
| context.register_metadata("full_version", full_version) |
| |
| def _generate_cython(): |
| print("Cythonizing sources") |
| cwd = os.path.abspath(os.path.dirname(__file__)) |
| p = subprocess.call([sys.executable, |
| os.path.join(cwd, 'tools', 'cythonize.py'), |
| 'numpy'], |
| cwd=cwd) |
| if p != 0: |
| raise RuntimeError("Running cythonize failed!") |
| |
| @hooks.post_configure |
| def post_configure(context): |
| conf = context.waf_context |
| if conf.env["CC_NAME"] == "gcc": |
| conf.env.CFLAGS_PYEXT.append("-Wfatal-errors") |
| |
| conf.load("arch", tooldir=[WAF_TOOLDIR]) |
| if sys.platform == "darwin": |
| conf.env["MACOSX_DEPLOYMENT_TARGET"] = "10.4" |
| conf.check_cc_default_arch() |
| archs = [conf.env.DEFAULT_CC_ARCH] |
| conf.env.ARCH = archs |
| |
| blas_lapack.check_blas_lapack(context) |
| |
| _generate_cython() |
| |
| @hooks.pre_build |
| def pre_build(context): |
| _register_metadata(context) |
| |
| @hooks.pre_sdist |
| def pre_sdist(context): |
| _register_metadata(context) |
| |
| @hooks.options |
| def options(global_context): |
| blas_lapack.add_options(global_context) |
| |
| |
| class CTemplateTask(waflib.Task.Task): |
| color = 'BLUE' |
| before = ['c'] |
| def run(self): |
| s = self.inputs[0] |
| cnt = s.read() |
| writestr = process_c_str(cnt) |
| o = self.outputs[0] |
| o.write(writestr) |
| |
| @waflib.TaskGen.extension(".src") |
| def c_template(self, node): |
| outs = [] |
| outs.append(node.change_ext("")) |
| |
| tsk = self.create_task('CTemplateTask', node, outs) |
| if "c" in self.features and not node.name[-6:] == (".h.src"): |
| self.source.append(outs[0]) |