如何解决如何使用 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)')
解决方法
经过几天的尝试,我找到了解决方案。 有一些错误导致了问题:
首先是 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 举报,一经查实,本站将立刻删除。