Blob Blame History Raw
# -*- python -*-
#
# Copyright (c) 2016 Stefan Seefeld
# All rights reserved.
#
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)

from faber.feature import set
from faber.types import cxx
from faber.tools.compiler import cxxflags, define, include
from faber.tools.python import python
from faber.config import report, cxx_checks
from faber.config.try_run import try_run

features += include('include')
features += define('BOOST_ALL_NO_LIB')  # disable auto-linking
boost_include = options.get_with('boost-include')
if boost_include:
    features += include(boost_include)
python = python.instance()
features |= set(python.include, python.linkpath, python.libs)

class has_numpy(try_run):

    src = r"""
// If defined, enforces linking against PythonXXd.lib, which
// is usually not included in Python environments.
#undef _DEBUG
#include "Python.h"
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "numpy/arrayobject.h"

#if PY_VERSION_HEX >= 0x03000000
void *initialize() { import_array();}
#else
void initialize() { import_array();}
#endif

int main()
{
  int result = 0;
  Py_Initialize();
  initialize();
  if (PyErr_Occurred())
  {
    result = 1;
  }
  else
  {
    npy_intp dims = 2;
    PyObject * a = PyArray_SimpleNew(1, &dims, NPY_INT);
    if (!a) result = 1;
    Py_DECREF(a);
  }
  Py_Finalize();
  return result;
}
"""
    def __init__(self, features=()):

        inc = ''
        try:
            inc = python.check_python('import numpy; print(numpy.get_include())')
            features |= include(inc)
        except Exception:
            # ignore errors, the check will fail during compilation...
            pass
        try_run.__init__(self, 'has_numpy', has_numpy.src, cxx, features,
                         if_=(include(inc), define('HAS_NUMPY')))

checks = [cxx_checks.has_cxx11(features, define('HAS_CXX11')),
          has_numpy(features)]
config = report('config', checks)

src = module('src', features=config.use)
test = module('test', features=config.use)

default = src.default