如何为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
相关产品推荐
相关产品推荐

