1PORTNAME=	qgis
2DISTVERSION=	3.44.6
3CATEGORIES=	graphics geography
4MASTER_SITES=	https://qgis.org/downloads/
5
6MAINTAINER=	ports@MidnightBSD.org
7COMMENT=	Free and Open Source Geographic Information System
8WWW=		https://qgis.org/en/site/
9
10LICENSE=	gpl2
11LICENSE_FILE=	${WRKSRC}/doc/LICENSE
12
13BUILD_DEPENDS=	gpsbabel>=1.7.0:astro/gpsbabel \
14		opencl>=0:devel/opencl \
15		${PY_SETUPTOOLS} \
16		${PYTHON_PKGNAMEPREFIX}cycler>=0.11.0:devel/py-cycler@${PY_FLAVOR} \
17		${PYTHON_PKGNAMEPREFIX}python-dateutil>=2.8.2:devel/py-python-dateutil@${PY_FLAVOR} \
18		${PYTHON_PKGNAMEPREFIX}future>=0.18.2:devel/py-future@${PY_FLAVOR} \
19		${PYTHON_PKGNAMEPREFIX}httplib2>=0.20.2:www/py-httplib2@${PY_FLAVOR} \
20		${PYTHON_PKGNAMEPREFIX}jedi>=0.18.1:devel/py-jedi@${PY_FLAVOR} \
21		${PYTHON_PKGNAMEPREFIX}Jinja2>=3.1.2:devel/py-Jinja2@${PY_FLAVOR} \
22		${PYTHON_PKGNAMEPREFIX}markupsafe>=2.1.1:textproc/py-markupsafe@${PY_FLAVOR} \
23		${PYTHON_PKGNAMEPREFIX}matplotlib>=3.4.3:math/py-matplotlib@${PY_FLAVOR} \
24		${PYTHON_PKGNAMEPREFIX}mock>=4.0.3:devel/py-mock@${PY_FLAVOR} \
25		${PYTHON_PKGNAMEPREFIX}OWSLib>=0.27.2:graphics/py-OWSLib@${PY_FLAVOR} \
26		${PYTHON_PKGNAMEPREFIX}pbr>=5.10.0:devel/py-pbr@${PY_FLAVOR} \
27		${PYTHON_PKGNAMEPREFIX}pip>=22.2.2:devel/py-pip@${PY_FLAVOR} \
28		${PYTHON_PKGNAMEPREFIX}plotly>=4.14.3:graphics/py-plotly@${PY_FLAVOR} \
29		${PYTHON_PKGNAMEPREFIX}pygments>=2.13.0:textproc/py-pygments@${PY_FLAVOR} \
30		${PYTHON_PKGNAMEPREFIX}pyproj>=3.4.0:graphics/py-pyproj@${PY_FLAVOR} \
31		${PYTHON_PKGNAMEPREFIX}pytz>=2020.5:devel/py-pytz@${PY_FLAVOR} \
32		${PYTHON_PKGNAMEPREFIX}requests>=2.28.0:www/py-requests@${PY_FLAVOR} \
33		${PYTHON_PKGNAMEPREFIX}six>=1.16.0:devel/py-six@${PY_FLAVOR} \
34		${PYTHON_PKGNAMEPREFIX}sqlite3>=3.7.16:databases/py-sqlite3@${PY_FLAVOR} \
35		${PYTHON_PKGNAMEPREFIX}pyyaml>=5.4.1:devel/py-pyyaml@${PY_FLAVOR}
36LIB_DEPENDS=	libabsl_log_internal_check_op.so:devel/abseil \
37		libdraco.so:archivers/draco \
38		libexiv2.so:graphics/exiv2 \
39		libexpat.so:textproc/expat2 \
40		libfreexl.so:textproc/freexl \
41		libgdal.so:graphics/gdal \
42		libgeos.so:graphics/geos \
43		libgsl.so:math/gsl \
44		libhdf5.so:science/hdf5 \
45		libminizip.so:archivers/minizip \
46		libnetcdf.so:science/netcdf \
47		libOpenCL.so:devel/ocl-icd \
48		libpdalcpp.so:math/pdal \
49		libproj.so:graphics/proj \
50		libprotobuf-lite.so:devel/protobuf \
51		libqca-qt5.so:devel/qca@qt5 \
52		libqjson-qt5.so:devel/qjson \
53		libqscintilla2_qt5.so:devel/qscintilla2@qt5 \
54		libqt5keychain.so:security/qtkeychain@qt5 \
55		libqwt.so:x11-toolkits/qwt6@qt5 \
56		librttopo.so:devel/librttopo \
57		libspatialite.so:databases/spatialite \
58		libsz.so:science/libaec \
59		libxerces-c.so:textproc/xerces-c3 \
60		libzip.so:archivers/libzip \
61		libzstd.so:archivers/zstd
62RUN_DEPENDS=	astyle:devel/astyle \
63		opencl>=0:devel/opencl \
64		${PYTHON_PKGNAMEPREFIX}black>=22.10:devel/py-black@${PY_FLAVOR} \
65		${PYTHON_PKGNAMEPREFIX}cycler>=0.11.0:devel/py-cycler@${PY_FLAVOR} \
66		${PYTHON_PKGNAMEPREFIX}python-dateutil>=2.8.2:devel/py-python-dateutil@${PY_FLAVOR} \
67		${PYTHON_PKGNAMEPREFIX}fiona>=1.8.21:graphics/py-fiona@${PY_FLAVOR} \
68		${PYTHON_PKGNAMEPREFIX}future>=0.18.2:devel/py-future@${PY_FLAVOR} \
69		${PYTHON_PKGNAMEPREFIX}gdal>=3.5.2:graphics/py-gdal@${PY_FLAVOR} \
70		${PYTHON_PKGNAMEPREFIX}geojson>=2.3.0:devel/py-geojson@${PY_FLAVOR} \
71		${PYTHON_PKGNAMEPREFIX}geopandas>=0.11.1:graphics/py-geopandas@${PY_FLAVOR} \
72		${PYTHON_PKGNAMEPREFIX}httplib2>=0.20.2:www/py-httplib2@${PY_FLAVOR} \
73		${PYTHON_PKGNAMEPREFIX}jedi>=0.18.1:devel/py-jedi@${PY_FLAVOR} \
74		${PYTHON_PKGNAMEPREFIX}Jinja2>=3.1.2:devel/py-Jinja2@${PY_FLAVOR} \
75		${PYTHON_PKGNAMEPREFIX}laspy>=2.5.1:misc/py-laspy@${PY_FLAVOR} \
76		${PYTHON_PKGNAMEPREFIX}markupsafe>=2.1.1:textproc/py-markupsafe@${PY_FLAVOR} \
77		${PYTHON_PKGNAMEPREFIX}matplotlib>=3.4.3:math/py-matplotlib@${PY_FLAVOR} \
78		${PYTHON_PKGNAMEPREFIX}mock>=4.0.3:devel/py-mock@${PY_FLAVOR} \
79		${PYTHON_PKGNAMEPREFIX}nbformat>=5.7.0:devel/py-nbformat@${PY_FLAVOR} \
80		${PYTHON_PKGNAMEPREFIX}netCDF4>=1.6.2:science/py-netCDF4@${PY_FLAVOR} \
81		${PYTHON_PKGNAMEPREFIX}networkx>=2.8.8:math/py-networkx@${PY_FLAVOR} \
82		${PYTHON_PKGNAMEPREFIX}nltk>=3.7:textproc/py-nltk@${PY_FLAVOR} \
83		${PYNUMPY} \
84		${PYTHON_PKGNAMEPREFIX}OWSLib>=0.27.2:graphics/py-OWSLib@${PY_FLAVOR} \
85		${PYTHON_PKGNAMEPREFIX}pandas>=1.5.0:math/py-pandas@${PY_FLAVOR} \
86		${PYTHON_PKGNAMEPREFIX}pbr>=5.10.0:devel/py-pbr@${PY_FLAVOR} \
87		${PY_PILLOW} \
88		${PYTHON_PKGNAMEPREFIX}pip>=22.2.2:devel/py-pip@${PY_FLAVOR} \
89		${PYTHON_PKGNAMEPREFIX}plotly>=4.14.3:graphics/py-plotly@${PY_FLAVOR} \
90		${PYTHON_PKGNAMEPREFIX}psutil>=5.9.2:sysutils/py-psutil@${PY_FLAVOR} \
91		${PYTHON_PKGNAMEPREFIX}psycopg2>=2.9.4:databases/py-psycopg2@${PY_FLAVOR} \
92		${PYTHON_PKGNAMEPREFIX}pygments>=2.13.0:textproc/py-pygments@${PY_FLAVOR} \
93		${PYTHON_PKGNAMEPREFIX}pyproj>=3.4.0:graphics/py-pyproj@${PY_FLAVOR} \
94		${PYTHON_PKGNAMEPREFIX}pyrsgis>=0.4.1:graphics/py-pyrsgis@${PY_FLAVOR} \
95		${PYTHON_PKGNAMEPREFIX}pytz>=2020.5:devel/py-pytz@${PY_FLAVOR} \
96		${PYTHON_PKGNAMEPREFIX}rasterio>=1.3.2:graphics/py-rasterio@${PY_FLAVOR} \
97		${PYTHON_PKGNAMEPREFIX}requests>=2.28.0:www/py-requests@${PY_FLAVOR} \
98		${PYTHON_PKGNAMEPREFIX}scikit-image>=0.19.3:graphics/py-scikit-image@${PY_FLAVOR} \
99		${PYTHON_PKGNAMEPREFIX}scikit-learn>=1.1.3:science/py-scikit-learn@${PY_FLAVOR} \
100		${PYTHON_PKGNAMEPREFIX}shapely>=1.8.5:devel/py-shapely@${PY_FLAVOR} \
101		${PYTHON_PKGNAMEPREFIX}six>=1.16.0:devel/py-six@${PY_FLAVOR} \
102		${PYTHON_PKGNAMEPREFIX}sqlite3>=3.7.16:databases/py-sqlite3@${PY_FLAVOR} \
103		${PYTHON_PKGNAMEPREFIX}termcolor>=2.1.0:devel/py-termcolor@${PY_FLAVOR} \
104		${PYTHON_PKGNAMEPREFIX}xcffib>=0.11.1:x11/py-xcffib@${PY_FLAVOR} \
105		${PYTHON_PKGNAMEPREFIX}xlrd>=2.0.1:textproc/py-xlrd@${PY_FLAVOR} \
106		${PYTHON_PKGNAMEPREFIX}pyyaml>=5.4.1:devel/py-pyyaml@${PY_FLAVOR}
107
108### Fortran is needed by numpy, GRASS, etc.
109USES=		bison cmake compiler:features desktop-file-utils \
110		fortran gl gmake gnome iconv pgsql pyqt:5 python qt:5 \
111		shebangfix sqlite:3 tar:bz2
112USE_GL=		gl
113USE_GNOME=	libxml2
114USE_LDCONFIG=	yes
115USE_PYQT=	pyqt5 pysip qscintilla2 qtbuilder:build sip:build webengine
116USE_QT=		3d buildtools:build core concurrent dbus declarative \
117		designer:build qdoc:build gamepad gui linguist:build location \
118		multimedia network printsupport qmake:build script serialport \
119		sql sql-pgsql sql-sqlite3 svg testlib uitools:build \
120		webchannel webengine widgets xml
121
122SHEBANG_FILES=	src/plugins/grass/scripts/*.py
123
124# Python_EXECUTABLE: Use the default version if multiple Pythons are available
125CMAKE_ARGS+=	-DCMAKE_BUILD_TYPE:STRING=Release \
126		-DHAVE_PGCONFIG=1 \
127		-DPYRCC_PROGRAM:FILEPATH=${LOCALBASE}/bin/pyrcc5-${PYTHON_VER} \
128		-DPYUIC_PROGRAM:FILEPATH=${LOCALBASE}/bin/pyuic5-${PYTHON_VER} \
129		-DPython_EXECUTABLE=${PYTHON_CMD} \
130		-DQSCI_SIP_DIR:PATH=${PYQT_SIPDIR}/Qsci \
131		-DQWT_INCLUDE_DIR:PATH=${LOCALBASE}/include/qt5/qwt6 \
132		-DQWT_LIBRARY:FILEPATH=${LOCALBASE}/lib/qt5/libqwt.so \
133		-DQGIS_MANUAL_SUBDIR:PATH=share/man
134# [2025-10-25] Use internal spatialindex, as the one in the ports is too new:
135# -- Found Spatialindex: /usr/local/lib/libspatialindex.so (2.1.0)
136# CMake Error at CMakeLists.txt:460 (message):
137#   Cannot build QGIS using libspatialindex >= 2.1, see
138#   https://github.com/libspatialindex/libspatialindex/issues/276
139CMAKE_ON=	USE_OPENCL WITH_ASTYLE WITH_BINDINGS WITH_COPC \
140		WITH_CUSTOM_WIDGETS WITH_DRACO WITH_EPT \
141		WITH_INTERNAL_LAZPERF WITH_INTERNAL_MDAL \
142		WITH_POSTGRESQL WITH_QTWEBENGINE WITH_INTERNAL_SPATIALINDEX
143CMAKE_OFF=	BUILD_WITH_QT6 ENABLE_TESTS USE_CCACHE WITH_QTWEBKIT \
144		WITH_QWTPOLAR
145
146CONFLICTS_INSTALL=	qgis-ltr
147
148PLIST_SUB=	DISTVERSION=${PORTVERSION}
149
150.if !defined(MAINTAINER_MODE)
151CMAKE_ARGS+=	-Wno-dev
152CMAKE_OFF+=	SUPPRESS_QT_WARNINGS
153.endif
154
155OPTIONS_DEFINE=		SERVER GRASS
156OPTIONS_DEFAULT=	SERVER GRASS
157NO_OPTIONS_SORT=	yes
158OPTIONS_SUB=		yes
159
160GRASS_DESC=		Add GRASS GIS to processing tools
161SERVER_DESC=		Enable QGIS server
162
163GRASS_BUILD_DEPENDS=	grass8:databases/grass8
164GRASS_RUN_DEPENDS=	${GRASS_BUILD_DEPENDS}
165GRASS_CMAKE_BOOL=	WITH_GRASS8
166SERVER_LIB_DEPENDS=	libfcgi.so:www/fcgi
167SERVER_CMAKE_BOOL=	WITH_SERVER WITH_SERVER_PLUGINS WITH_QSPATIALITE
168
169.include <bsd.port.pre.mk>
170
171pre-patch:
172	# Only PostgreSQL Client headers, not Server
173	@${REINPLACE_CMD} -e 's|set(POSTGRES_INCLUDE_DIR \$${PostgreSQL_INCLUDE_DIRS})|set(POSTGRES_INCLUDE ${LOCALBASE}/include)|g' \
174		${WRKSRC}/cmake/FindPostgres.cmake
175
176post-patch:
177	@${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \
178		${WRKSRC}/cmake/FindGRASS.cmake
179# On i386, '-mllvm -inline-threshold=128' does not build under all circumstances
180# See bugs 242557 and 241687.
181.if ${OPSYS} == FreeBSD && ${ARCH} == "i386"
182	@${REINPLACE_CMD} -e 's|"-mllvm -inline-threshold=128"|"-O1"|g' \
183		${WRKSRC}/src/core/CMakeLists.txt
184.endif
185
186pre-configure:
187	${MKDIR} ${CONFIGURE_WRKSRC}/bin && ${LN} -s ${PYTHON_CMD} ${CONFIGURE_WRKSRC}/bin/python3
188
189post-install:
190	@${RM} ${DATADIR}/python/pytz/tzfile.py.bak
191	@${FIND} ${LOCALBASE} -name "__pycache__" -delete
192	@${RM} /tmp/srs.db
193
194check:
195	@cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${MAKE_CMD} check
196
197.include <bsd.port.post.mk>
198