如何有条件地更改setuptools编译器?

How to conditionally change setuptools compiler?

提问人:Fergus Rooney 提问时间:7/25/2023 更新时间:8/17/2023 访问量:43

问:

我正在使用 CFFI 包构建 C 绑定。我的项目是为 pypi 打包的,因此需要涵盖不同的操作系统。默认情况下,setuptools 使用适用于 Windows 的编译器和适用于 Linux 的 gnu gcc 编译器。我想有条件地将编译器更改为操作系统是否为 windows。这是因为 C 代码库的某些部分使用了 MSVC 不支持的 VLA,我宁愿只更改编译器而不是整个代码库。MSVCmingw32

我能够成功更改编译器的唯一方法是使用如下所示的文件:setup.cfg

[build]
compiler=mingw32

[build_ext]
compiler=mingw32

但是我不想使用安装程序.cfg因为它已经过时了,而且我需要根据操作系统更改编译器选项,这是您在 cfg 文件中无法做到的

有谁知道我如何将其移动到以便我可以使其成为有条件的?setup.py

python setuptools python-cffi

评论

1赞 AKX 7/25/2023
如果您使用的是 CFFI,您不是与预编译的 C 代码交互吗?您能提供更多有关您的软件包现在如何构建的细节吗?
0赞 Fergus Rooney 7/25/2023
@AKX 我有一个 C 库,正在被 CFFI + Setuptools 编译成 C 扩展(所谓的“API 模式”。没有预编译的库)。当我运行时,setuptools 与一个 python 文件交互,该文件使用 CFFI 为我的库设置编译。您可以看到项目 github.com/auto-optimization/eafpypy -m build

答:

0赞 Zenthm 8/17/2023 #1

您可以使用选项(即 )在命令行中设置 。compiler--compilerpython setup.py build --compiler

有条件地执行此操作,您可以在参数中覆盖命令类以设置 to use,如下所示:buildcmdclasssetuptools.setup()compiler

from setuptools.command.build import build as _build

class build(_build):
    def finalize_options(self):
        super().finalize_options()

        if (...):
            self.compiler = "mingw32"

这将是:setup

setup(
    ...
    cmdclass={"build": build},
    ...
)

你也会对 .build_ext