From c4455b5a1612935a12ec07a06f219bc654975e9a Mon Sep 17 00:00:00 2001 From: Manuel Guenther <manuel.guenther@idiap.ch> Date: Thu, 21 May 2015 13:55:29 +0200 Subject: [PATCH] Included funcitonality for version handling in config.h; use new api for versioning --- bob/io/base/bobskin.h | 2 - bob/io/base/include/bob.io.base/api.h | 26 ++++- bob/io/base/include/bob.io.base/config.h | 21 ++++ bob/io/base/version.cpp | 117 ++--------------------- 4 files changed, 56 insertions(+), 110 deletions(-) diff --git a/bob/io/base/bobskin.h b/bob/io/base/bobskin.h index 7e69132..d18cf6e 100644 --- a/bob/io/base/bobskin.h +++ b/bob/io/base/bobskin.h @@ -13,9 +13,7 @@ #include <bob.io.base/array.h> -extern "C" { #include <bob.blitz/capi.h> -} /** diff --git a/bob/io/base/include/bob.io.base/api.h b/bob/io/base/include/bob.io.base/api.h index 001e8d4..b6858aa 100644 --- a/bob/io/base/include/bob.io.base/api.h +++ b/bob/io/base/include/bob.io.base/api.h @@ -179,7 +179,7 @@ typedef struct { PyBobIoCodec_GetDescription_RET PyBobIoCodec_GetDescription PyBobIoCodec_GetDescription_PROTO; -#else +#else // BOB_IO_BASE_MODULE /* This section is used in modules that use `bob.io.base's' C-API */ @@ -301,4 +301,28 @@ typedef struct { #endif /* BOB_IO_BASE_MODULE */ + +#ifdef BOB_IMPORT_VERSION + + /*************************************** + * Here we define some functions that should be used to build version dictionaries in the version.cpp file + * There will be a compiler warning, when these functions are not used, so use them! + ***************************************/ + + #include <boost/preprocessor/stringize.hpp> + #include <hdf5.h> + + /** + * The version of HDF5 + */ + static PyObject* hdf5_version() { + boost::format f("%s.%s.%s"); + f % BOOST_PP_STRINGIZE(H5_VERS_MAJOR); + f % BOOST_PP_STRINGIZE(H5_VERS_MINOR); + f % BOOST_PP_STRINGIZE(H5_VERS_RELEASE); + return Py_BuildValue("s", f.str().c_str()); + } + +#endif // BOB_IMPORT_VERSION + #endif /* BOB_IO_BASE_H */ diff --git a/bob/io/base/include/bob.io.base/config.h b/bob/io/base/include/bob.io.base/config.h index 76fc73d..24cd8fd 100644 --- a/bob/io/base/include/bob.io.base/config.h +++ b/bob/io/base/include/bob.io.base/config.h @@ -11,4 +11,25 @@ /* Macros that define versions and important names */ #define BOB_IO_BASE_API_VERSION 0x0200 + +#ifdef BOB_IMPORT_VERSION + + /*************************************** + * Here we define some functions that should be used to build version dictionaries in the version.cpp file + * There will be a compiler warning, when these functions are not used, so use them! + ***************************************/ + + #include <Python.h> + #include <boost/preprocessor/stringize.hpp> + + /** + * bob.io.base c/c++ api version + */ + static PyObject* bob_io_base_version() { + return Py_BuildValue("{ss}", "api", BOOST_PP_STRINGIZE(BOB_IO_BASE_API_VERSION)); + } + +#endif // BOB_IMPORT_VERSION + + #endif /* BOB_IO_BASE_CONFIG_H */ diff --git a/bob/io/base/version.cpp b/bob/io/base/version.cpp index 86e5fc5..a252270 100644 --- a/bob/io/base/version.cpp +++ b/bob/io/base/version.cpp @@ -5,114 +5,20 @@ * @brief Binds configuration information available from bob */ -#include <Python.h> +// include config.h without defining the bob_io_base_version function +#include <bob.io.base/config.h> + +#define BOB_IMPORT_VERSION +#define BOB_IO_BASE_MODULE #ifdef NO_IMPORT_ARRAY #undef NO_IMPORT_ARRAY #endif -#define BOB_IO_BASE_MODULE -#include <bob.io.base/config.h> - -#include <string> -#include <cstdlib> -#include <blitz/blitz.h> -#include <boost/preprocessor/stringize.hpp> -#include <boost/version.hpp> -#include <boost/format.hpp> -#include <hdf5.h> #include <bob.blitz/capi.h> -#include <bob.blitz/cleanup.h> -#include <bob.core/config.h> - -static int dict_steal(PyObject* d, const char* key, PyObject* value) { - if (!value) return 0; - auto value_ = make_safe(value); - int retval = PyDict_SetItemString(d, key, value); - if (retval == 0) return 1; //all good - return 0; //a problem occurred -} - - -static int dict_set(PyObject* d, const char* key, const char* value) { - PyObject* v = Py_BuildValue("s", value); - return dict_steal(d, key, v); -} - -/*********************************************************** - * Version number generation - ***********************************************************/ - -static PyObject* hdf5_version() { - boost::format f("%s.%s.%s"); - f % BOOST_PP_STRINGIZE(H5_VERS_MAJOR); - f % BOOST_PP_STRINGIZE(H5_VERS_MINOR); - f % BOOST_PP_STRINGIZE(H5_VERS_RELEASE); - return Py_BuildValue("s", f.str().c_str()); -} - -/** - * Describes the version of Boost libraries installed - */ -static PyObject* boost_version() { - boost::format f("%d.%d.%d"); - f % (BOOST_VERSION / 100000); - f % (BOOST_VERSION / 100 % 1000); - f % (BOOST_VERSION % 100); - return Py_BuildValue("s", f.str().c_str()); -} - -/** - * Describes the compiler version - */ -static PyObject* compiler_version() { -# if defined(__GNUC__) && !defined(__llvm__) - boost::format f("%s.%s.%s"); - f % BOOST_PP_STRINGIZE(__GNUC__); - f % BOOST_PP_STRINGIZE(__GNUC_MINOR__); - f % BOOST_PP_STRINGIZE(__GNUC_PATCHLEVEL__); - return Py_BuildValue("{ssss}", "name", "gcc", "version", f.str().c_str()); -# elif defined(__llvm__) && !defined(__clang__) - return Py_BuildValue("{ssss}", "name", "llvm-gcc", "version", __VERSION__); -# elif defined(__clang__) - return Py_BuildValue("{ssss}", "name", "clang", "version", __clang_version__); -# else - return Py_BuildValue("{ssss}", "name", "unsupported", "version", "unknown"); -# endif -} - -/** - * Python version with which we compiled the extensions - */ -static PyObject* python_version() { - boost::format f("%s.%s.%s"); - f % BOOST_PP_STRINGIZE(PY_MAJOR_VERSION); - f % BOOST_PP_STRINGIZE(PY_MINOR_VERSION); - f % BOOST_PP_STRINGIZE(PY_MICRO_VERSION); - return Py_BuildValue("s", f.str().c_str()); -} - -/** - * Numpy version - */ -static PyObject* numpy_version() { - return Py_BuildValue("{ssss}", "abi", BOOST_PP_STRINGIZE(NPY_VERSION), - "api", BOOST_PP_STRINGIZE(NPY_API_VERSION)); -} - -/** - * bob.blitz c/c++ api version - */ -static PyObject* bob_blitz_version() { - return Py_BuildValue("{ss}", "api", BOOST_PP_STRINGIZE(BOB_BLITZ_API_VERSION)); -} - -/** - * bob.core c/c++ api version - */ -static PyObject* bob_core_version() { - return Py_BuildValue("{ss}", "api", BOOST_PP_STRINGIZE(BOB_CORE_API_VERSION)); -} +#include <bob.core/api.h> +// This will include config.h again, but will not do anything since its header guard is already defined. +#include <bob.io.base/api.h> static PyObject* build_version_dictionary() { @@ -169,11 +75,8 @@ static PyObject* create_module (void) { if (PyModule_AddObject(m, "externals", build_version_dictionary()) < 0) return 0; /* imports dependencies */ - if (import_bob_blitz() < 0) { - PyErr_Print(); - PyErr_Format(PyExc_ImportError, "cannot import `%s'", BOB_EXT_MODULE_NAME); - return 0; - } + if (import_bob_blitz() < 0) return 0; + if (import_bob_core_logging() < 0) return 0; return Py_BuildValue("O", m); -- GitLab