From 02a24ac541df68033d4efd7e2f8a1b92dc49328d Mon Sep 17 00:00:00 2001 From: Li xin Date: Mon, 27 Jul 2015 05:06:20 +0900 Subject: [PATCH] M2Crypto: Error fix. After swig upgrade from 3.0.2 to 3.0.6,build the recipes which depends on python-m2crypto will occur errors like this: SALT_LEN = m2.PKCS5_SALT_LEN AttributeError: 'module' object has no attribute 'PKCS5_SALT_LEN' since python-m2crypto depends on swig-native Ref: https://github.com/martinpaljak/M2Crypto/issues/60#issuecomment-75735489 This patch is from: http://pkgs.fedoraproject.org/cgit/m2crypto.git/tree/m2crypto-0.21.1-swig-3.0.5.patch Upstream-Status: pending Signed-off-by: Li Xin --- M2Crypto/__init__.py | 4 ++-- M2Crypto/m2.py | 2 +- SWIG/_lib.i | 4 ++++ SWIG/_pkcs7.i | 1 + setup.py | 26 +++++++++++++++++++++++++- 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/M2Crypto/__init__.py b/M2Crypto/__init__.py index e7acfe7..02f4d28 100644 --- a/M2Crypto/__init__.py +++ b/M2Crypto/__init__.py @@ -19,7 +19,7 @@ Copyright 2008-2011 Heikki Toivonen. All rights reserved. version_info = (0, 21, 1) version = '.'.join([str(_v) for _v in version_info]) -import __m2crypto +import _m2crypto import m2 import ASN1 import AuthCookie @@ -57,4 +57,4 @@ import util encrypt=1 decrypt=0 -__m2crypto.lib_init() +_m2crypto.lib_init() diff --git a/M2Crypto/m2.py b/M2Crypto/m2.py index e4bb695..822143f 100644 --- a/M2Crypto/m2.py +++ b/M2Crypto/m2.py @@ -25,7 +25,7 @@ Portions created by Open Source Applications Foundation (OSAF) are Copyright (C) 2004 OSAF. All Rights Reserved. """ -from __m2crypto import * +from _m2crypto import * lib_init() diff --git a/SWIG/_lib.i b/SWIG/_lib.i index 42dc180..47a53b8 100644 --- a/SWIG/_lib.i +++ b/SWIG/_lib.i @@ -100,6 +100,7 @@ int ssl_verify_callback(int ok, X509_STORE_CTX *ctx) { int cret; int new_style_callback = 0, warning_raised_exception=0; PyGILState_STATE gilstate; + PyObject *self = NULL; /* bug in SWIG_NewPointerObj as of 3.0.5 */ ssl = (SSL *)X509_STORE_CTX_get_app_data(ctx); @@ -185,6 +186,7 @@ int ssl_verify_callback(int ok, X509_STORE_CTX *ctx) { void ssl_info_callback(const SSL *s, int where, int ret) { PyObject *argv, *retval, *_SSL; PyGILState_STATE gilstate; + PyObject *self = NULL; /* bug in SWIG_NewPointerObj as of 3.0.5 */ gilstate = PyGILState_Ensure(); @@ -204,6 +206,7 @@ DH *ssl_set_tmp_dh_callback(SSL *ssl, int is_export, int keylength) { PyObject *argv, *ret, *_ssl; DH *dh; PyGILState_STATE gilstate; + PyObject *self = NULL; /* bug in SWIG_NewPointerObj as of 3.0.5 */ gilstate = PyGILState_Ensure(); @@ -227,6 +230,7 @@ RSA *ssl_set_tmp_rsa_callback(SSL *ssl, int is_export, int keylength) { PyObject *argv, *ret, *_ssl; RSA *rsa; PyGILState_STATE gilstate; + PyObject *self = NULL; /* bug in SWIG_NewPointerObj as of 3.0.5 */ gilstate = PyGILState_Ensure(); diff --git a/SWIG/_pkcs7.i b/SWIG/_pkcs7.i index 174f40a..7bffbfc 100644 --- a/SWIG/_pkcs7.i +++ b/SWIG/_pkcs7.i @@ -157,6 +157,7 @@ PyObject *smime_read_pkcs7(BIO *bio) { BIO *bcont = NULL; PKCS7 *p7; PyObject *tuple, *_p7, *_BIO; + PyObject *self = NULL; /* bug in SWIG_NewPointerObj as of 3.0.5 */ if (BIO_method_type(bio) == BIO_TYPE_MEM) { /* OpenSSL FAQ explains that this is needed for mem BIO to return EOF, diff --git a/setup.py b/setup.py index e7c49eb..b98abe0 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,7 @@ except ImportError: from distutils.command import build_ext from distutils.core import Extension +from distutils.file_util import copy_file class _M2CryptoBuildExt(build_ext.build_ext): @@ -57,7 +58,17 @@ class _M2CryptoBuildExt(build_ext.build_ext): self.swig_opts.append('-includeall') #self.swig_opts.append('-D__i386__') # Uncomment for early OpenSSL 0.9.7 versions, or on Fedora Core if build fails #self.swig_opts.append('-DOPENSSL_NO_EC') # Try uncommenting if you can't build with EC disabled - + self.swig_opts.append('-modern') + self.swig_opts.append('-builtin') + + # These two lines are a workaround for + # http://bugs.python.org/issue2624 , hard-coding that we are only + # building a single extension with a known path; a proper patch to + # distutils would be in the run phase, when extension name and path are + # known. + self.swig_opts.append('-outdir') + self.swig_opts.append(os.path.join(self.build_lib, 'M2Crypto')) + self.include_dirs += [os.path.join(self.openssl, opensslIncludeDir), os.path.join(os.getcwd(), 'SWIG')] @@ -71,6 +82,19 @@ class _M2CryptoBuildExt(build_ext.build_ext): self.library_dirs += [os.path.join(self.openssl, opensslLibraryDir)] + def run(self): + '''Overloaded build_ext implementation to allow inplace=1 to work, + which is needed for (python setup.py test).''' + # This is another workaround for http://bugs.python.org/issue2624 + the + # corresponding lack of support in setuptools' test command. Note that + # just using self.inplace in finalize_options() above does not work + # because swig is not rerun if the __m2crypto.so extension exists. + # Again, hard-coding our extension name and location. + build_ext.build_ext.run(self) + if self.inplace: + copy_file(os.path.join(self.build_lib, 'M2Crypto', '_m2crypto.py'), + os.path.join('M2Crypto', '_m2crypto.py'), + verbose=self.verbose, dry_run=self.dry_run) if sys.version_info < (2,4): -- 1.8.4.2