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
|
{
lib,
stdenv,
fetchFromGitHub,
gitUpdater,
buildPackages,
cmake,
pkg-config,
boost,
cairo,
freetype,
gdal,
harfbuzz,
icu,
libjpeg,
libpng,
libtiff,
libwebp,
libxml2,
proj,
python3,
sqlite,
zlib,
catch2,
postgresql,
protozero,
sparsehash,
}:
stdenv.mkDerivation rec {
pname = "mapnik";
version = "4.0.2";
src = fetchFromGitHub {
owner = "mapnik";
repo = "mapnik";
rev = "v${version}";
hash = "sha256-U5QQ7I7ZBNlMm74Vpvv8lvJ4EefM3+jHURFAP03Lmvw=";
fetchSubmodules = true;
};
passthru.updateScript = gitUpdater { rev-prefix = "v"; };
postPatch = ''
substituteInPlace configure \
--replace '$PYTHON scons/scons.py' ${buildPackages.scons}/bin/scons
rm -r scons
# Remove bundled 'sparsehash' directory in favor of 'sparsehash' package
rm -r deps/mapnik/sparsehash
'';
# a distinct dev output makes python-mapnik fail
outputs = [ "out" ];
patches = [
# The lib/cmake/harfbuzz/harfbuzz-config.cmake file in harfbuzz.dev is faulty,
# as it provides the wrong libdir. The workaround is to just rely on
# pkg-config to locate harfbuzz shared object files.
# Upstream HarfBuzz wants to drop CMake support anyway.
# See discussion: https://github.com/mapnik/mapnik/issues/4265
./cmake-harfbuzz.patch
# Account for full paths when generating libmapnik.pc
./export-pkg-config-full-paths.patch
# Use 'sparsehash' package.
./use-sparsehash-package.patch
];
nativeBuildInputs = [
cmake
pkg-config
];
buildInputs = [
boost
cairo
freetype
gdal
harfbuzz
icu
libjpeg
libpng
libtiff
libwebp
proj
python3
sqlite
zlib
(libxml2.override { enableHttp = true; })
postgresql
protozero
sparsehash
];
cmakeFlags = [
# Save time by not building some development-related code.
(lib.cmakeBool "BUILD_BENCHMARK" false)
(lib.cmakeBool "BUILD_DEMO_CPP" false)
## Would require QT otherwise.
(lib.cmakeBool "BUILD_DEMO_VIEWER" false)
# Use 'protozero' package.
(lib.cmakeBool "USE_EXTERNAL_MAPBOX_PROTOZERO" true)
# macOS builds fail when using memory mapped file cache.
(lib.cmakeBool "USE_MEMORY_MAPPED_FILE" (!stdenv.hostPlatform.isDarwin))
# don't try to download sources for catch2, use our own
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_CATCH2" "${catch2.src}")
];
doCheck = true;
# mapnik-config is currently not build with CMake. So we use the SCons for
# this one. We can't add SCons to nativeBuildInputs though, as stdenv would
# then try to build everything with scons. C++17 is the minimum supported
# C++ version.
preBuild = ''
cd ..
env CXX_STD=17 ${buildPackages.scons}/bin/scons utils/mapnik-config
cd build
'';
preInstall = ''
mkdir -p $out/bin
cp ../utils/mapnik-config/mapnik-config $out/bin/mapnik-config
'';
meta = with lib; {
description = "Open source toolkit for developing mapping applications";
homepage = "https://mapnik.org";
maintainers =
with maintainers;
teams.geospatial.members
++ [
hrdinka
hummeltech
];
license = licenses.lgpl21Plus;
platforms = platforms.all;
};
}
|