微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 nix 构建 pyobjc 7.3?

如何解决如何使用 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

什么?现在叮当就像一只瞎眼的小猫。

Modules/pyobjc-api.h:19:10: 致命错误: 'objc/objc.h' 文件未找到 #include

-isysroot 选项和 -I 无效。

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

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

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

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

Modules/pyobjc-api.h:21:9: 致命错误:'Foundation/Foundation.h' 文件 未找到

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

clang,换个说法

-iframeworkwithsysroot /System/Library/Frameworks

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

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

  • (NSComparisonResult)compare:(Nsstring *)string options:(NsstringCompareOptions)mask range:(NSR...

解决方法

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

首先是 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 linkder是动态的,找不到ffi libray。 通过 nix 派生提供

    buildInputs = [ pkgs.libffi ];

第四个问题是测试失败

    doCheck = false;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。