【问题标题】:How can I compile Python 3.6.2 on macOS with openSSL from homebrew?如何使用自制软件的 openSSL 在 macOS 上编译 Python 3.6.2?
【发布时间】:2018-03-09 12:06:08
【问题描述】:

我正在尝试根据https://bugs.python.org/issue29095 上的说明在 macOS 10.11 上编译 Python 3.6.2。

我使用自制软件将 openSSL 安装到标准位置,然后将 LDFLAGS、CFLAGS 和 CPPFLAGS 添加到我的环境中:

$ printenv | grep FLAGS
LDFLAGS=/usr/local/Cellar/openssl/1.0.2l/lib/
CFLAGS=-I/usr/local/Cellar/openssl/1.0.2l/include/openssl
CPPFLAGS=-I/usr/local/Cellar/openssl/1.0.2l/include/openssl

然后在同一个 shell 中,我将 Python 编译到我的用例所需的自定义位置:

$ sudo ./configure --prefix=/oebuild/python/python-3.6.1
$ sudo make
$ sudo make install

但是,SSL 模块并未构建。构建日志这样说:

Python 构建成功完成! 未找到构建这些可选模块的必要位: _gdbm _ssl ossaudiodev
spwd
要找到必要的位,请在 setup.py 中的 detect_modules() 中查找模块名称。

【问题讨论】:

标签: python macos compilation openssl


【解决方案1】:

我之前找到的之前的答案都没有对我有用,但我最终还是在之前没有提到的另一个答案的帮助下解决了这个问题。这是实际的修复: https://stackoverflow.com/a/20740964/2934226

CPPFLAGS 和 LDFLAGS 基本上不能在环境中设置;您需要将它们与配置命令一起设置,如下所示:

./configure CPPFLAGS="-I[openSSL install location]/include" LDFLAGS="-L[openSSL install location]/lib" [other flags here]

然后编译安装后就成功了!

$ python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2l  25 May 2017

以下是不起作用的地方,以及原因:

How do I compile Python 3.4 with custom OpenSSL? 没有帮助,因为您不能在环境中设置 LDFLAGS、CFLAGS 或 CPPFLAGS; setup.py 不会将它们传递给实际的编译步骤。即使设置 LD_LIBRARY_PATH 可能有效,您也不想这样做,因为它很危险(请参阅http://xahlee.info/UnixResource_dir/_/ldpath.html)。最后,--with-ssl 不是有效的配置参数,并且列出的用于添加它的补丁也不能完全应用。

Homebrew refusing to link OpenSSL 不适用于您尝试从源代码构建某些内容,而不是尝试获取已编译的 dylib 以查找重定位的库。此外,在 /usr/local 中创建符号链接是危险的,并且可能导致程序针对较新的标头进行编译,但使用较旧的系统二进制文件。

how to include ssl with python build on MacOS 无法正常工作。编辑 setup.py 以添加 lib 并包含安装我的 openSSL 部分 的目录,并允许您在 SSL 支持中进行编译。唉,它们无法导入,因为旧版本仍在使用中:

Following modules built successfully but were removed because they could not be imported:
_hashlib              _ssl                                    

[...]

building '_ssl' extension
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -I/usr/local/opt/openssl/include/ -I./Include -I/oebuild/python/python-3.6.1/include -I. -I/usr/local/include -I/oebuild/python/src/Python-3.6.1/Include -I/oebuild/python/src/Python-3.6.1 -c /oebuild/python/src/Python-3.6.1/Modules/_ssl.c -o build/temp.macosx-10.11-x86_64-3.6/oebuild/python/src/Python-3.6.1/Modules/_ssl.o
gcc -bundle -undefined dynamic_lookup build/temp.macosx-10.11-x86_64-3.6/oebuild/python/src/Python-3.6.1/Modules/_ssl.o -L/oebuild/python/python-3.6.1/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin.so
building '_hashlib' extension
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -I/usr/local/opt/openssl/include/ -I./Include -I/oebuild/python/python-3.6.1/include -I. -I/usr/local/include -I/oebuild/python/src/Python-3.6.1/Include -I/oebuild/python/src/Python-3.6.1 -c /oebuild/python/src/Python-3.6.1/Modules/_hashopenssl.c -o build/temp.macosx-10.11-x86_64-3.6/oebuild/python/src/Python-3.6.1/Modules/_hashopenssl.o
gcc -bundle -undefined dynamic_lookup build/temp.macosx-10.11-x86_64-3.6/oebuild/python/src/Python-3.6.1/Modules/_hashopenssl.o -L/oebuild/python/python-3.6.1/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.macosx-10.11-x86_64-3.6/_hashlib.cpython-36m-darwin.so
*** WARNING: renaming "_ssl" since importing it failed: dlopen(build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin.so, 2): Symbol not found: _CRYPTO_THREADID_set_callback
  Referenced from: build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin.so
  Expected in: flat namespace
 in build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin.so
*** WARNING: renaming "_hashlib" since importing it failed: dlopen(build/lib.macosx-10.11-x86_64-3.6/_hashlib.cpython-36m-darwin.so, 2): Symbol not found: _HMAC_CTX_copy
  Referenced from: build/lib.macosx-10.11-x86_64-3.6/_hashlib.cpython-36m-darwin.so
  Expected in: flat namespace
 in build/lib.macosx-10.11-x86_64-3.6/_hashlib.cpython-36m-darwin.so

otool -L 显示问题:

$ otool -L build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin_failed.so 
build/lib.macosx-10.11-x86_64-3.6/_ssl.cpython-36m-darwin_failed.so:
    /usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
    /usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

(CRYPTO_THREADID是1.0.0版本引入的,据https://wiki.openssl.org/index.php/Manual:Threads(3)#HISTORY

【讨论】:

  • 注意,你可以用brew --prefix openssl获取“openSSL安装位置”,所以你的命令行可以是./configure CPPFLAGS="-I$(brew --prefix openssl)/include" LDFLAGS="-L$(brew --prefix openssl)/lib"
  • 这不仅适用于 python3 安装,也适用于 python2。 (我用 2.7.6 试过)
  • ./configure 文件在哪里
  • python源码目录内
【解决方案2】:

对于 Python 3.8(目前处于测试阶段),以上没有任何答案对我有用。

相反,什么对我有用(2019 年 7 月):

brew install openssl
./configure --with-openssl=/usr/local/opt/openssl

【讨论】:

    【解决方案3】:

    我就这样成功了。

      brew update
      brew install openssl
    
      # these were suggested by brew itself.
    
      export LDFLAGS="-L/usr/local/opt/openssl/lib"
      export CPPFLAGS="-I/usr/local/opt/openssl/include"
      export PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig"
    
      # vanilla compilation
    
      ./configure
      make
    

    【讨论】:

    • 谢谢 - 只有这个在我的./configure 命令中添加了额外的PKG_CONFIG_PATH 参数后才起作用。我已经为 OSX 编写了一个 shell 包装器来协助我自己的构建,可以在这里找到:github.com/danstreeter/osx-python-builder - 贡献欢迎 =)
    【解决方案4】:

    整天都在努力从 pyenv 构建,所以我想我会在 2020 年贡献实现它的方法:

    brew install rbenv/tap/openssl@1.0
    PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA=openssl@1.0 pyenv install 3.6.2
    

    或者在我的情况下,3.4.10(我测试过的)

    我知道这个问题不是专门针对 pyenv 的,但我发现这个线程正在寻找有关 pyenv 的帮助,我相信其他人也有。

    请注意,此版本的 openssl(当前)是 1.0.2t

    【讨论】:

    • 感谢您的回答,因为对于brewpyenv 的用户来说,这确实是最简单的解决方案。但是,不要忘记在上面第二个命令的开头也检查$CONFIGURE_OPTS 并在必要时取消设置或覆盖(CONFIGURE_OPTS=""CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl@1.0)")。我的设置在.zshrc 以指定openssl@1.1 以引导rbenv 使用openssl@1.1,我需要覆盖它以使用pyenv 构建较旧的Python。
    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 2019-03-08
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2018-02-27
    相关资源
    最近更新 更多