title: Why can't I install m2crypto in pipenv on OSX?
body: <p>Anyone know what I could be doing wrong. I'm trying to switch from pip3 to pipenv I keep getting this error on osx when trying to install uwsgi and m2crpyot: <a href="https://pastebin.com/FZZUpcwa" rel="nofollow noreferrer">https://pastebin.com/FZZUpcwa</a> </p>
  
  <pre><code>pipenv install -r requirements2.txt
  Requirements file provided! Importing into Pipfile…
  Pipfile.lock (6adb91) out of date, updating to (10e36a)…
  Locking [dev-packages] dependencies…
  Locking [packages] dependencies…
  Updated Pipfile.lock (10e36a)!
  Installing dependencies from Pipfile.lock (10e36a)…
  An error occurred while installing https://gitlab.com/m2crypto/m2crypto/-/archive/0.27.0/m2crypto-0.27.0.zip#egg=4dd1b7f! Will try again.
  An error occurred while installing lxml==3.6.1! Will try again.
       ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 95/95 — 00:03:30
  An error occurred while installing uwsgi==2.0.14! Will try again.
  Installing initially–failed dependencies…
  Collecting 4dd1b7f from https://gitlab.com/m2crypto/m2crypto/-/archive/0.27.0/m2crypto-0.27.0.zip#egg=4dd1b7f
  Installing collected packages: 4dd1b7f
  
  Exception:
  Traceback (most recent call last):
    File "/Users/timo/.local/share/virtualenvs/jm-web-G18c0xlX/lib/python3.6/site-packages/pip/_internal/basecommand.py", line 228, in main
      status = self.run(options, args)
    File "/Users/timo/.local/share/virtualenvs/jm-web-G18c0xlX/lib/python3.6/site-packages/pip/_internal/commands/install.py", line 335, in run
      use_user_site=options.use_user_site,
    File "/Users/timo/.local/share/virtualenvs/jm-web-G18c0xlX/lib/python3.6/site-packages/pip/_internal/req/__init__.py", line 49, in install_given_reqs
      **kwargs
    File "/Users/timo/.local/share/virtualenvs/jm-web-G18c0xlX/lib/python3.6/site-packages/pip/_internal/req/req_install.py", line 748, in install
      use_user_site=use_user_site, pycompile=pycompile,
    File "/Users/timo/.local/share/virtualenvs/jm-web-G18c0xlX/lib/python3.6/site-packages/pip/_internal/req/req_install.py", line 961, in move_wheel_files
      warn_script_location=warn_script_location,
    File "/Users/timo/.local/share/virtualenvs/jm-web-G18c0xlX/lib/python3.6/site-packages/pip/_internal/wheel.py", line 316, in move_wheel_files
      assert info_dir, "%s .dist-info directory not found" % req
  AssertionError: 4dd1b7f .dist-info directory not found
  
    ☤  ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/3 — 00:00:00
  </code></pre>
  
  <p>and I've run into similar issues before with pip on mac that I could fix
  is the previous fixes I used when using pip: <a href="https://yoirtuts.com/index.php?title=M2Crypto_Issue_Mac_OSX" rel="nofollow noreferrer">https://yoirtuts.com/index.php?title=M2Crypto_Issue_Mac_OSX</a> and <a href="https://yoirtuts.com/index.php?title=Compile_Issue_With_UWSGI_On_OSX" rel="nofollow noreferrer">https://yoirtuts.com/index.php?title=Compile_Issue_With_UWSGI_On_OSX</a></p>
  
  <p>I've tried doing this in docker, outside docker just with plain pipenv. I don't know what I could be doing wrong. It seems the issue is with m2crypto. In the past I had to install m2crypto with pip like this:(when using plain pip3 and virtualenv on OSX:</p>
  
  <pre><code>pip3 install m2crypto --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include"
  </code></pre>
  
  <p>and with uwsgi I also would run into issues occasionally that I could solve with:(in a virtualenv using pip3 )</p>
  
  <pre><code>CFLAGS="-Wno-error=varargs" pip3 install -r requirements.txt
  </code></pre>
  
  <p>Just an update to question:</p>
  
  <p>I've tried installing m2crypto in a docker container without using a requirements.txt and using a Pipfile instead. So in other words using this command to install from Pipfile:(So this is in the dockerfile for installing the dependencies when the image is built)</p>
  
  <pre><code>RUN pipenv install --system --deploy
  </code></pre>
  
  <p>This is what I put in my Pipfile for m2crypto </p>
  
  <pre><code>m2crypto = "==0.27.0"
  </code></pre>
  
  <p>This is the error that I keep getting:</p>
  
  <pre><code>    copying M2Crypto/BN.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto
      creating build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/cb.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/ssl_dispatcher.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/timeout.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/SSLServer.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/Cipher.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/TwistedProtocolWrapper.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/Context.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/__init__.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/Session.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/Connection.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      copying M2Crypto/SSL/Checker.py -&gt; build/lib.linux-x86_64-3.6/M2Crypto/SSL
      warning: build_py: byte-compiling is disabled, skipping.
  
      running build_ext
      building 'M2Crypto._m2crypto' extension
      creating build/temp.linux-x86_64-3.6
      creating build/temp.linux-x86_64-3.6/SWIG
      gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/include/python3.6m -I/tmp/pip-install-qdabh1md/m2crypto/SWIG -c SWIG/_m2crypto_wrap.c -o build/temp.linux-x86_64-3.6/SWIG/_m2crypto_wrap.o -DTHREADING
   -Wno-deprecated-declarations
      SWIG/_m2crypto_wrap.c: In function ‘_wrap__STACK_num_set’:
      SWIG/_m2crypto_wrap.c:9493:19: error: dereferencing pointer to incomplete type ‘struct stack_st’
         if (arg1) (arg1)-&gt;num = arg2;
                         ^~
      SWIG/_m2crypto_wrap.c: In function ‘_wrap_new__STACK’:
      SWIG/_m2crypto_wrap.c:9720:48: error: invalid application of ‘sizeof’ to incomplete type ‘struct stack_st’
         result = (struct stack_st *)calloc(1, sizeof(struct stack_st));
                                                      ^~~~~~
      SWIG/_m2crypto_wrap.c:9723:1: warning: label ‘fail’ defined but not used [-Wunused-label]
       fail:
       ^~~~
      SWIG/_m2crypto_wrap.c: In function ‘_wrap_sk_new_null’:
      SWIG/_m2crypto_wrap.c:9866:1: warning: label ‘fail’ defined but not used [-Wunused-label]
       fail:
       ^~~~
      SWIG/_m2crypto_wrap.c: In function ‘_wrap_sk_deep_copy’:
      SWIG/_m2crypto_wrap.c:9951:40: warning: passing argument 2 of ‘OPENSSL_sk_deep_copy’ from incompatible pointer type [-Wincompatible-pointer-types]
         result = (_STACK *)sk_deep_copy(arg1,arg2,arg3);
                                              ^~~~
      In file included from /usr/include/openssl/crypto.h:28:0,
                       from /usr/include/openssl/bio.h:20,
                       from /usr/include/openssl/err.h:21,
                       from SWIG/_m2crypto_wrap.c:3557:
      /usr/include/openssl/stack.h:32:16: note: expected ‘OPENSSL_sk_copyfunc {aka void * (*)(const void *)}’ but argument is of type ‘void * (*)(void *)’
       OPENSSL_STACK *OPENSSL_sk_deep_copy(const OPENSSL_STACK *, OPENSSL_sk_copyfunc c, OPENSSL_sk_freefunc f);
                      ^~~~~~~~~~~~~~~~~~~~
      SWIG/_m2crypto_wrap.c: In function ‘_wrap_stack_st_OPENSSL_STRING_stack_set’:
      SWIG/_m2crypto_wrap.c:10354:19: error: dereferencing pointer to incomplete type ‘struct stack_st_OPENSSL_STRING’
         if (arg1) (arg1)-&gt;stack = *arg2;
                         ^~
      SWIG/_m2crypto_wrap.c:10354:29: error: dereferencing pointer to incomplete type ‘OPENSSL_STACK {aka struct stack_st}’
         if (arg1) (arg1)-&gt;stack = *arg2;
                                   ^~~~~
      SWIG/_m2crypto_wrap.c: In function ‘_wrap_new_stack_st_OPENSSL_STRING’:
      SWIG/_m2crypto_wrap.c:10386:63: error: invalid application of ‘sizeof’ to incomplete type ‘struct stack_st_OPENSSL_STRING’
         result = (struct stack_st_OPENSSL_STRING *)calloc(1, sizeof(struct stack_st_OPENSSL_STRING));
  </code></pre>