1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
{
stdenv,
lib,
buildPythonPackage,
pythonOlder,
fetchFromGitHub,
fetchpatch2,
cmake,
ninja,
setuptools,
boost,
eigen,
python,
catch,
numpy,
pytestCheckHook,
libxcrypt,
makeSetupHook,
}:
let
setupHook = makeSetupHook {
name = "pybind11-setup-hook";
substitutions = {
out = placeholder "out";
pythonInterpreter = python.pythonOnBuildForHost.interpreter;
pythonIncludeDir = "${python}/include/python${python.pythonVersion}";
pythonSitePackages = "${python}/${python.sitePackages}";
};
} ./setup-hook.sh;
# clang 16 defaults to C++17, which results in the use of aligned allocations by pybind11.
# libc++ supports aligned allocations via `posix_memalign`, which is available since 10.6,
# but clang has a check hard-coded requiring 10.13 because that’s when Apple first shipped a
# support for C++17 aligned allocations on macOS.
# Tell clang we’re targeting 10.13 on x86_64-darwin while continuing to use the default SDK.
stdenv' =
if stdenv.isDarwin && stdenv.isx86_64 then
python.stdenv.override (oldStdenv: {
buildPlatform = oldStdenv.buildPlatform // {
darwinMinVersion = "10.13";
};
targetPlatform = oldStdenv.targetPlatform // {
darwinMinVersion = "10.13";
};
hostPlatform = oldStdenv.hostPlatform // {
darwinMinVersion = "10.13";
};
})
else
python.stdenv;
in
buildPythonPackage rec {
pname = "pybind11";
version = "2.12.0";
pyproject = true;
src = fetchFromGitHub {
owner = "pybind";
repo = "pybind11";
rev = "v${version}";
hash = "sha256-DVkI5NxM5uME9m3PFYVpJOOa2j+yjL6AJn76fCTv2nE=";
};
patches = [
(fetchpatch2 {
# https://github.com/pybind/pybind11/pull/5127
url = "https://github.com/pybind/pybind11/commit/540bef2d2c9fb54fa7c1474ee1af959ce90f2b32.patch";
hash = "sha256-0ZWlH/5kQ3An/tu6ulOXO2k32asATrr1mlI4nGjIqaI=";
})
];
postPatch = ''
substituteInPlace pyproject.toml \
--replace-fail "timeout=300" ""
'';
build-system = [
cmake
ninja
setuptools
];
buildInputs = lib.optionals (pythonOlder "3.9") [ libxcrypt ];
propagatedNativeBuildInputs = [ setupHook ];
stdenv = stdenv';
dontUseCmakeBuildDir = true;
# Don't build tests if not needed, read the doInstallCheck value at runtime
preConfigure = ''
if [ -n "$doInstallCheck" ]; then
cmakeFlagsArray+=("-DBUILD_TESTING=ON")
fi
'';
cmakeFlags = [
"-DBoost_INCLUDE_DIR=${lib.getDev boost}/include"
"-DEIGEN3_INCLUDE_DIR=${lib.getDev eigen}/include/eigen3"
] ++ lib.optionals (python.isPy3k && !stdenv.cc.isClang) [ "-DPYBIND11_CXX_STANDARD=-std=c++17" ];
postBuild = ''
# build tests
make -j $NIX_BUILD_CORES
'';
postInstall = ''
make install
# Symlink the CMake-installed headers to the location expected by setuptools
mkdir -p $out/include/${python.libPrefix}
ln -sf $out/include/pybind11 $out/include/${python.libPrefix}/pybind11
'';
nativeCheckInputs = [
catch
numpy
pytestCheckHook
];
disabledTestPaths = [
# require dependencies not available in nixpkgs
"tests/test_embed/test_trampoline.py"
"tests/test_embed/test_interpreter.py"
# numpy changed __repr__ output of numpy dtypes
"tests/test_numpy_dtypes.py"
# no need to test internal packaging
"tests/extra_python_package/test_files.py"
# tests that try to parse setuptools stdout
"tests/extra_setuptools/test_setuphelper.py"
];
disabledTests = lib.optionals stdenv.isDarwin [
# expects KeyError, gets RuntimeError
# https://github.com/pybind/pybind11/issues/4243
"test_cross_module_exception_translator"
];
hardeningDisable = lib.optional stdenv.hostPlatform.isMusl "fortify";
meta = with lib; {
homepage = "https://github.com/pybind/pybind11";
changelog = "https://github.com/pybind/pybind11/blob/${src.rev}/docs/changelog.rst";
description = "Seamless operability between C++11 and Python";
mainProgram = "pybind11-config";
longDescription = ''
Pybind11 is a lightweight header-only library that exposes
C++ types in Python and vice versa, mainly to create Python
bindings of existing C++ code.
'';
license = licenses.bsd3;
maintainers = with maintainers; [
yuriaisaka
dotlambda
];
};
}
|