首页 > 解决方案 > 如何用 nix 构建 pyobjc 7.3?

问题描述

我想构建 pyobjc-7.3,因为它修复了 send2trash。BigSur 20.5.0 上的经典建筑是海峡前进的。

cd pyobjc-7.3/pyobjc-framework-Cocoa
python3 setup.py build

虽然一旦我在 nix-shell 中运行相同的构建,魔法就会发生。

nix-shell -p pkgs.python39Packages.setuptools
python3 setup.py build

clang-7:错误:编译期间未使用的参数:'-fno-strict-overflow' [-Werror,-Wunused-command-lin\ e-argument]

好的。没什么大不了。让我们禁用警告。

CFLAGS="-Wno-unused-argument" python3 setup.py build

什么?现在clang就像一只瞎了眼的小猫。

模块/pyobjc-api.h:19:10:致命错误:找不到“objc/objc.h”文件#include <objc/objc.h>

-isysroot选项并且-I没有效果。

-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk

我注意到-I在 clang 中添加了很多标志,例如:

-iwithprefix /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include

它有助于 clang 找到 objc 头文件,尽管这还不是故事的结尾。

模块/pyobjc-api.h:21:9:致命错误:找不到“Foundation/Foundation.h”文件

怎么来的?!哦,还有另一个特殊类型的头文件 - 框架。车轮改造...

叮当,换个说法

-iframeworkwithsysroot /System/Library/Frameworks

在这里,我遇到了大量的类型错误,我想不出下一步该尝试什么:

/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSString.h:138:1:错误:函数不能返回函数类型'NSComparisonResult'(又名'int(诠释)')

  • (NSComparisonResult)比较:(NSString *)字符串选项:(NSStringCompareOptions)掩码范围:(NSR ...

标签: pythonmacoscocoanix

解决方案


经过几天的尝试,我找到了解决方案。有几个错误导致问题:

首先是 nix 提供较旧的 (10.12) sdk,而 setup.py 认为是 10.15。这会为不受支持的 SDK API 启用 CPP 部分,因此会出现类型错误。hack 使 pyobjc 认为 SDK 比它旧。

with pkgs;
with pkgs.lib;
with pkgs.python39Packages;

let
  pyobjc-core = buildPythonPackage rec {
    pname = "pyobjc-core";
    version = "7.3";
    name = "${pname}-${version}";
    src = pkgs.python39Packages.fetchPypi {
      pname = "pyobjc-core";
      inherit version;
      sha256 = "0x3msrzvcszlmladdpl64s48l52fwk4xlnnri8daq2mliggsx0ah";
    };
    preBuild=''                                                                                                               
         export SDKROOT="/Library/Developer/CommandLineTools/SDKs/MacOSX10.12.sdk"

第二个问题是来自 python nix 的标头发现和过度严格的 lint

CFLAGS = "-iwithsysroot /usr/include -Wno-unused-argument";

第三个问题 big sur 链接器是动态的,找不到 ffi 库。通过 nix 推导提供

    buildInputs = [ pkgs.libffi ];

第四个问题是测试被破坏

    doCheck = false;

推荐阅读