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

的过度严格的lint
CFLAGS = "-iwithsysroot /usr/include -Wno-unused-argument";

第三个问题big sur linkder是动态的,没有找到ffi库。通过nix派生

提供
buildInputs = [ pkgs.libffi ];

第四个问题是测试被打破

doCheck = false;

最新更新