【问题标题】:How build pyobjc 7.3 with nix?如何用 nix 构建 pyobjc 7.3?
【发布时间】:2021-10-01 23:57:11
【问题描述】:

我想构建 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

-isysroot 选项和-I 无效。

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

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

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

它有助于 clang 找到 objc 头文件,尽管这还没有结束。

模块/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)比较:(NSString *)字符串选项:(NSStringCompareOptions)掩码范围:(NSR...

【问题讨论】:

  • Nix 是一个“封闭式”构建系统,这意味着您必须指定所有依赖项。没有这些,构建将无法重现。如果你想打包 pyobjc,你可以在 Nixpkgs 中查看类似的包。如果您只想在nix-shell 中构建它,我建议您像打包它一样编写一个文件,这样您就可以在该文件中使用nix-shellnix-shell -p 只能设置buildInputs,限制太多了。

标签: python macos cocoa nix


【解决方案1】:

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

首先是 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2017-01-24
    • 2018-08-24
    • 2017-01-25
    相关资源
    最近更新 更多