macospipmacos-sierraosx-elcapitanm2crypto

Trouble installing m2crypto with pip on OS X / macOS


pip install m2crypto

Generates the following output:

building 'M2Crypto.__m2crypto' extension
swigging SWIG/_m2crypto.i to SWIG/_m2crypto_wrap.c
swig -python -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -I/usr/include -I/usr/include/openssl -includeall -modern -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i
SWIG/_m2crypto.i:30: Error: Unable to find 'openssl/opensslv.h'
SWIG/_m2crypto.i:33: Error: Unable to find 'openssl/safestack.h'
SWIG/_evp.i:12: Error: Unable to find 'openssl/opensslconf.h'
SWIG/_ec.i:7: Error: Unable to find 'openssl/opensslconf.h'
error: command 'swig' failed with exit status 1

I've run:

brew install swig

Solution

  • I wanted a nicer way without installing manually and using only Homebrew (which also does not link openssl by default). Also using pip was a requirement. This seems to work with newest m2crypto 0.22.5. I also tested it once with m2crypto 0.22.3 and seems also to work. The OpenSSL version here is 1.0.2d:

    brew install openssl
    brew install swig
    

    Finally install m2crypto on macOS in your Bash. It is a long command but it changes SWIG and clang environment variables only during pip install so that m2crypto will get all OpenSSL requirements:

    env LDFLAGS="-L$(brew --prefix openssl)/lib" \
    CFLAGS="-I$(brew --prefix openssl)/include" \
    SWIG_FEATURES="-cpperraswarn -includeall -I$(brew --prefix openssl)/include" \
    pip install m2crypto
    

    btw. the last command also works if you use e.g. a requirements.txt.

    Update:
    Additional also the command for fish shell users...

    env LDFLAGS="-L"(brew --prefix openssl)"/lib" \
    CFLAGS="-I"(brew --prefix openssl)"/include" \
    SWIG_FEATURES="-cpperraswarn -includeall -I"(brew --prefix openssl)"/include" \
    pip install m2crypto