我想构建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: error:编译时未使用的参数'-fno-strict-overflow' [-Werror,-Wunused-command-lin e-argument]
ok。没什么大不了的。让我们禁用警告。
CFLAGS="-Wno-unused-argument" python3 setup.py build
什么?现在clang就像一只失明的小猫。
Modules/pyobjc-api.h:19:10:致命错误:'objc/objc.h'文件未找到# include & lt; objc/objc.h>
-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: fatal error: 'Foundation/Foundation.h' file没有找到
为什么? !哦,还有一种特殊的头文件——框架。轮改造…
clang,取另一个参数
-iframeworkwithsysroot /System/Library/Frameworks
在这里,我得到了大量的输入错误,我不知道下一步该怎么做:
/图书馆/开发/CommandLineTools/sdk/MacOSX11.3.sdk/系统/图书馆/框架/Foundation.framework/头/NSString.h: 138:1:错误:函数不能返回函数类型'NSComparisonResult'(又名'int (int)')
- (nscompisonresult)比较:(NSString *)字符串选项:(NSStringCompareOptions)掩码范围:(NSR…
经过几天的努力,我找到了解决办法。有几个bug导致了这些问题:
首先是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
的过度严格的lintCFLAGS = "-iwithsysroot /usr/include -Wno-unused-argument";
第三个问题big sur linkder是动态的,没有找到ffi库。通过nix派生
提供buildInputs = [ pkgs.libffi ];
第四个问题是测试被打破
doCheck = false;