python - 如何用 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 ...
解决方案
经过几天的尝试,我找到了解决方案。有几个错误导致问题:
首先是 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;
推荐阅读
- php - 使用 PHP 从软件中读取加密的 XML 文件
- python-3.x - 从嘈杂的数据python中自动检测最高峰
- javascript - 按 Enter 提交表格
- debian - 为什么 Yubikey U2F 在全新安装的 Debian 10 (buster) 上不起作用?
- linux - +-- 在 vimdiff 输出文件中是什么意思?如何关闭它?
- oracle - Kubernetes 秘密被破坏
- javascript - 如何将这个大型 json 文件转换为 Python 对象?
- c# - 如何在 C# 中登录谷歌帐户?需要样品
- c# - 如何在 C# 列表对象中检查父 ID 是否存在多次
- c - 如何从结构数组中删除字符串