You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Python调用的CMake添加命令行选项?

在setup.py中给CMake调用添加自定义OpenSSL编译选项

嘿,我来帮你搞定这个问题!你需要把指定的OpenSSL相关-D参数传递给Python setup.py里调用的CMake命令,下面分两种方法来实现:

方法一:扩展CMakeExtension类(更灵活的长期方案)

首先,修改你现有的CMakeExtension类,让它支持接收额外的CMake命令参数:

class CMakeExtension(Extension):
    def __init__(self, name, sourcedir='', cmake_args=None):
        Extension.__init__(self, name, sources=[])
        self.sourcedir = os.path.abspath(sourcedir)
        # 初始化额外的CMake参数,默认是空列表
        self.cmake_args = cmake_args or []

接下来找到setup.py中负责执行CMake的CMakeBuild类(继承自build_ext的类),在它的build_extension方法里,把自定义参数合并到CMake命令参数中:

class CMakeBuild(build_ext):
    def build_extension(self, ext):
        # 保留原有的初始化代码(比如创建构建目录等)
        # ...

        # 构建CMake命令参数,加入自定义选项
        cmake_args = [
            f'-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={self.build_lib}',
            f'-DPYTHON_EXECUTABLE={sys.executable}',
            # 把扩展类中传入的自定义参数加进来
            *ext.cmake_args
        ]

        # 保留原有的CMake命令执行逻辑(比如调用subprocess.run)
        # ...

最后,在setup函数声明扩展时,把你的OpenSSL参数传进去:

setup(
    # 保留原有的其他配置(如name、version等)
    # ...
    ext_modules=[CMakeExtension('blocksci', cmake_args=[
        '-DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2k',
        '-DOPENSSL_LIBRARIES=/usr/local/Cellar/openssl/1.0.2k/lib'
    ])],
    cmdclass={'build_ext': CMakeBuild},
    # ... 其他配置 ...
)

方法二:直接硬编码参数(快速临时方案)

如果只是临时需要添加这两个参数,不想修改CMakeExtension类的话,可以直接在CMakeBuild的build_extension方法里,把参数直接加到cmake_args列表中:

class CMakeBuild(build_ext):
    def build_extension(self, ext):
        # 保留原有的初始化代码
        # ...

        cmake_args = [
            f'-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={self.build_lib}',
            f'-DPYTHON_EXECUTABLE={sys.executable}',
            # 直接添加OpenSSL相关参数
            '-DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2k',
            '-DOPENSSL_LIBRARIES=/usr/local/Cellar/openssl/1.0.2k/lib'
        ]

        # 保留原有的CMake命令执行逻辑
        # ...

这样不管用哪种方法,当你运行python setup.py build或其他安装命令时,CMake都会带上你指定的这两个OpenSSL相关参数啦~

内容的提问来源于stack exchange,提问作者timothyylim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:34:11