1PORTNAME?=	postgresql
2DISTVERSION?=	13.21
3# PORTREVISION must be ?= otherwise, all slave ports get this PORTREVISION and
4# not their own.  Probably best to keep it at ?=0 when reset here too.
5PORTREVISION?=	1
6CATEGORIES?=	databases
7MASTER_SITES=	PGSQL/source/v${DISTVERSION}
8PKGNAMESUFFIX?= ${PORTVERSION:R}${COMPONENT}
9
10MAINTAINER?=	ports@MidnightBSD.org
11COMMENT?=	PostgreSQL is the most advanced open-source database available anywhere
12
13LICENSE=	pgsql
14
15.if ${DISTVERSION:C/([0-9]*).*/\1/} >= 10
16CONFLICTS+=	${PORTNAME}9* ${PORTNAME}1[^${PORTVERSION:R:C/.*([0-9]$)/\\1/}]*
17.else
18CONFLICTS+=	${PORTNAME}9[^${PORTVERSION:R:E}]* ${PORTNAME}1[0-9]*
19.endif
20
21WRKSRC=		${WRKDIR}/postgresql-${DISTVERSION}
22DIST_SUBDIR=	postgresql
23
24OPTIONS_SUB=	yes
25
26PKGINSTALL?=	${PKGDIR}/pkg-install${COMPONENT}
27USES+=		tar:bzip2 cpe
28.if !defined(NO_BUILD)
29USES+=		gmake
30GNU_CONFIGURE=	yes
31.endif
32
33PG_USER?=	postgres
34PG_GROUP?=	postgres
35PG_UID?=	770
36
37LDFLAGS+=	-L${LOCALBASE}/lib
38INCLUDES+=	-I${LOCALBASE}/include
39CONFIGURE_ARGS+=--with-libraries=${PREFIX}/lib \
40		--with-includes=${PREFIX}/include \
41		--enable-thread-safety \
42		--with-template=freebsd
43CONFIGURE_ENV+=	INCLUDES="${INCLUDES}" \
44		PTHREAD_LIBS="-lpthread" \
45		LDFLAGS_SL="${LDFLAGS_SL}"
46LDFLAGS+=	-lpthread
47MAKE_ENV=	MAKELEVEL=0
48
49PLIST=		${PKGDIR}/pkg-plist${COMPONENT}
50
51INSTALL_DIRS?=	src/common src/timezone src/backend \
52		src/backend/utils/mb/conversion_procs \
53		src/backend/snowball src/backend/replication/libpqwalreceiver \
54		src/backend/replication/pgoutput \
55		src/bin/initdb src/bin/pg_ctl \
56		src/bin/pg_archivecleanup src/bin/pg_basebackup \
57		src/bin/pg_checksums \
58		src/bin/pg_controldata src/bin/pg_resetwal src/pl \
59		src/bin/pg_rewind \
60		src/bin/pg_test_fsync src/bin/pg_test_timing \
61		src/bin/pg_waldump src/bin/pg_upgrade
62
63BUILD_DIRS?=	src/port ${INSTALL_DIRS}
64INSTALL_TARGET?=install-strip
65
66.if !defined(CLIENT_ONLY) && !defined(SLAVE_ONLY)
67SERVER_ONLY=	yes
68COMPONENT=	-server
69USE_RC_SUBR=	postgresql
70USES+=		pgsql:${DISTVERSION:C/([0-9]\.?[0-9]).*/\1/g}
71USERS=		${PG_USER}
72GROUPS=	${PG_GROUP}
73SUB_FILES+=	502.pgsql
74.endif
75
76OPTIONS_SUB=	yes
77
78.if defined(CLIENT_ONLY)
79OPTIONS_DEFINE+=LIBEDIT DOCS
80LIBEDIT_DESC=	Use non-GPL libedit instead of readline
81.else
82MAKE_ENV+=	PATH=${PREFIX}/bin:${PATH}
83CONFIGURE_ENV+=	PATH=${PREFIX}/bin:${PATH}
84.endif
85
86.if defined(SERVER_ONLY)
87OPTIONS_DEFINE=	DTRACE LDAP INTDATE TZDATA XML DOCS
88LDAP_DESC=	Build with LDAP authentication support
89DTRACE_DESC=	Build with DTrace probes
90TZDATA_DESC=	Use internal timezone database
91XML_DESC=	Build with XML data type
92
93DTRACE_CONFIGURE_ENABLE=dtrace
94DTRACE_LDFLAGS=		-lelf
95DTRACE_INSTALL_TARGET=	install
96
97.if ${DISTVERSION:C/([0-9]*).*/\1/} >= 11
98OPTIONS_DEFINE+=	LLVM
99#OPTIONS_DEFAULT+=	LLVM
100#BROKEN=		llvm support is currently broken
101LLVM_DESC=		Build with support for JIT-compiling expressions
102.endif
103
104.if ${DISTVERSION:C/([0-9]*).*/\1/} < 10
105# See http://people.freebsd.org/~girgen/postgresql-icu/README.html for more info
106OPTIONS_DEFINE+=	ICU
107ICU_DESC=	Use ICU for unicode collation
108.else
109CONFIGURE_ARGS+=--with-icu
110LIB_DEPENDS+=	libicudata.so:devel/icu
111USES+=		pkgconfig
112.endif
113
114# See http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/76999 for more info
115# (requires dump/restore if modified.)
116OPTIONS_DEFINE+=	INTDATE
117INTDATE_DESC=		Builds with 64-bit date/time type
118OPTIONS_DEFAULT+=	INTDATE
119.endif
120
121.if !defined(SLAVE_ONLY)
122OPTIONS_DEFINE+=	NLS PAM GSSAPI OPTIMIZED_CFLAGS DEBUG DOCS
123. if ${DISTVERSION:R} == 9.2 || ${DISTVERSION:R} == 9.3
124  OPTIONS_RADIO=	KRB5
125  OPTIONS_RADIO_KRB5=	MIT_KRB5 HEIMDAL_KRB5
126. endif
127
128KRB5_DESC=		Build with kerberos provider support
129NLS_DESC=		Use internationalized messages
130PAM_DESC=		Build with PAM Support
131MIT_KRB5_DESC=		Build with MIT kerberos support
132HEIMDAL_KRB5_DESC=	Builds with Heimdal kerberos
133GSSAPI_DESC=		Build with GSSAPI support
134OPTIMIZED_CFLAGS_DESC=	Builds with compiler optimizations (-O3)
135
136OPTIONS_DEFINE+=	SSL
137SSL_DESC=		Build with OpenSSL support
138
139OPTIONS_DEFAULT+=	SSL
140
141GSSAPI_CONFIGURE_WITH=	gssapi
142.endif # !SLAVE_ONLY
143
144.if defined(CLIENT_ONLY)
145LIBEDIT_CONFIGURE_ON+=--with-libedit-preferred
146LIBEDIT_USES=		libedit
147LIBEDIT_USES_OFF=	readline
148.endif # CLIENT_ONLY
149
150SSL_USES=		ssl
151SSL_CONFIGURE_WITH=	openssl
152
153PAM_CONFIGURE_WITH=	pam
154
155XML_CONFIGURE_WITH=	libxml
156XML_LIB_DEPENDS=	libxml2.so:textproc/libxml2
157
158TZDATA_CONFIGURE_OFF=	--with-system-tzdata=/usr/share/zoneinfo
159
160INTDATE_CONFIGURE_OFF=	--disable-integer-datetimes
161
162NLS_CONFIGURE_ENABLE=	nls
163NLS_USES=		gettext
164
165LDAP_CONFIGURE_WITH=	ldap
166LDAP_USE=		OPENLDAP=yes
167
168OPTIMIZED_CFLAGS_CFLAGS=-O3 -funroll-loops
169
170DEBUG_CONFIGURE_ENABLE=	debug
171
172PLIST_SUB+=		PG_USER=${PG_USER} \
173			PG_USER_regex=\b${PG_USER}\b \
174			PG_GROUP=${PG_GROUP} \
175			PG_GROUP_regex=\b${PG_GROUP}\b \
176			PG_VERSION=13
177SUB_LIST+=		PG_GROUP=${PG_GROUP} \
178			PG_USER=${PG_USER} \
179			PG_UID=${PG_UID} \
180			PG_VERSION=13
181
182.include <bsd.mport.options.mk>
183
184.if ${ARCH} == "i386"
185USES+=		compiler:gcc-c++11-lib
186.else
187USES+=		compiler
188.endif
189
190.if ${DISTVERSION:C/([0-9]*).*/\1/} < 10
191.  if ( defined(SERVER_ONLY) && ${PORT_OPTIONS:MICU} ) || make(makesum)
192USES+=		autoreconf
193CONFIGURE_ARGS+=--with-icu
194PATCH_SITES+=	http://people.freebsd.org/~girgen/postgresql-icu/:icu
195PATCHFILES+=	${ICU_PATCHFILE}:icu
196LIB_DEPENDS+=	libicudata.so:devel/icu
197.  endif
198.endif # server && version < 10
199
200.if !defined(SLAVE_ONLY)
201
202PATCH_DIST_STRIP=-p1
203
204.if ${PORT_OPTIONS:MGSSAPI}
205.if empty(PORT_OPTIONS:MMIT_KRB5) && empty(PORT_OPTIONS:MHEIMDAL_KRB5)
206# Kerberos libraries will pull the proper GSSAPI library
207# via linker dependencies, but otherwise we must specify
208# it explicitely: ld --as-needed is used for compilation,
209# so configure's -lgssapi_krb5 won't go.
210LDFLAGS+=	-lgssapi
211LDFLAGS_SL+=	-lgssapi
212.endif
213.endif
214
215.  if ${PORT_OPTIONS:MMIT_KRB5}
216.   if defined(IGNORE_WITH_SRC_KRB5) && (exists(/usr/lib/libkrb5.so) || exists(/usr/bin/krb5-config))
217IGNORE=	requires that you remove heimdal\'s /usr/bin/krb5-config and /usr/lib/libkrb5.so*, and set NO_KERBEROS=true in /etc/src.conf to build successfully with MIT-KRB
218.   else
219CONFIGURE_ARGS+=--with-krb5
220# Allow defining a home built MIT Kerberos by setting KRB5_HOME
221.    if defined(KRB5_HOME) && exists(${KRB5_HOME}/lib/libgssapi_krb5.a) && exists(${KRB5_HOME}/bin/krb5-config)
222LIB_DEPENDS+=	libkrb5.so.3:security/krb5
223.    endif
224.   endif
225.  endif
226
227.  if ${PORT_OPTIONS:MHEIMDAL_KRB5}
228CONFIGURE_ARGS+=--with-krb5
229.  endif
230
231.endif # !SLAVE_ONLY
232
233# For testing files in FILESDIR
234.include <bsd.port.pre.mk>
235
236.if ${PORT_OPTIONS:MLLVM}
237CONFIGURE_ARGS+=	--with-llvm
238BUILD_DEPENDS+=		llvm${PG_LLVM_VERSION}>0:devel/llvm${PG_LLVM_VERSION}
239BUILD_DEPENDS+=		llvm-config${PG_LLVM_VERSION}:devel/llvm${PG_LLVM_VERSION}
240RUN_DEPENDS+=		llvm-config${PG_LLVM_VERSION}:devel/llvm${PG_LLVM_VERSION}
241CONFIGURE_ENV+=		LLVM_CONFIG=${LOCALBASE}/bin/llvm-config${PG_LLVM_VERSION}
242.endif
243
244# sync LLVM to the preferred compiler if possible
245# or else use a lower version compiler that is compatible
246.if ${COMPILER_VERSION} > ${LLVM_DEFAULT}
247# Highest LLVM version in ports:
248.  if ${COMPILER_VERSION} <= 11
249PG_LLVM_VERSION=${COMPILER_VERSION}
250PG_COMPILER_VERSION=${COMPILER_VERSION}
251.  else
252PG_LLVM_VERSION=11
253PG_COMPILER_VERSION=11
254.  endif
255.else
256PG_COMPILER_VERSION=${COMPILER_VERSION}
257PG_LLVM_VERSION=${LLVM_DEFAULT}
258.endif
259
260.if ${DISTVERSION:C/([0-9]*).*/\1/} >= 11
261.  if defined(SERVER_ONLY) && ${PORT_OPTIONS:MLLVM}
262INSTALL_DIRS+=		src/backend/jit/llvm
263.    if ${COMPILER_VERSION} != ${PG_COMPILER_VERSION}
264LLVM_CONFIGURE_ARGS?=	CC=${LOCALBASE}/bin/clang${PG_COMPILER_VERSION}
265.    endif
266.  endif
267.endif
268
269.if defined(SERVER_ONLY)
270pre-build:
271	@${SH} ${PKGINSTALL} ${PORTNAME} PRE-INSTALL
272.endif
273
274.if !defined(NO_BUILD) && !target(do-build)
275
276do-build:
277	@ cd ${WRKSRC}/src/backend && ${SETENV} ${MAKE_ENV} ${FAKE_MAKEENV} ${MAKE_CMD} ${FAKE_MAKEARGS} symlinks
278	@ for dir in ${BUILD_DIRS}; do \
279		cd ${WRKSRC}/$${dir} && ${SETENV} ${MAKE_ENV} ${FAKE_MAKEENV} ${MAKE_CMD} ${FAKE_MAKEARGS}; \
280	done
281
282.  if exists(${FILESDIR}/pkg-message${COMPONENT}.in)
283SUB_FILES+=	pkg-message${COMPONENT}
284PKGMESSAGE=	${WRKSRC}/pkg-message${COMPONENT}
285.  endif
286.  if exists(${FILESDIR}/pkg-install${COMPONENT}.in)
287SUB_FILES+=	pkg-install${COMPONENT}
288.  endif
289
290post-patch:
291.  if defined(SERVER_ONLY) && ${PORT_OPTIONS:MICU}
292	@${REINPLACE_CMD} \
293		-e '/m4_PACKAGE_VERSION/s/\[2\.6[0-9]\]/m4_defn([m4_PACKAGE_VERSION])/' \
294		-e '/icu/s/_57//' \
295		${WRKSRC}/configure.in
296.  endif
297
298do-install:
299	@for dir in ${INSTALL_DIRS}; do \
300	    cd ${WRKSRC}/$${dir} && \
301		${SETENV} ${MAKE_ENV} ${FAKE_MAKEENV} ${MAKE_CMD} ${MAKE_ARGS} ${FAKE_MAKEARGS} ${INSTALL_TARGET}; \
302	done
303.  if defined(SERVER_ONLY)
304	@ ${MKDIR} ${PREFIX}/share/postgresql ;\
305	${MKDIR} ${PREFIX}/etc/periodic/daily ;\
306	${INSTALL_SCRIPT} ${WRKDIR}/502.pgsql \
307			${PREFIX}/etc/periodic/daily
308.  endif # SERVER_ONLY
309.  if defined(CLIENT_ONLY)
310	@ cd ${WRKSRC}/src && ${SETENV} ${MAKE_ENV} ${FAKE_MAKEENV} ${MAKE_CMD} ${MAKE_ARGS} ${FAKE_MAKEARGS} install-local
311.  endif
312	@ if [ -r ${PKGMESSAGE} ]; then \
313		${MKDIR} ${DOCSDIR} ;\
314		${INSTALL_DATA} ${PKGMESSAGE} ${DOCSDIR}/README${COMPONENT} ;\
315	fi
316.endif # !NO_BUILD
317
318.if defined(SERVER_ONLY)
319check:
320	@if [ `id -u` != 0 ] ; then \
321	  ${ECHO} "Running postgresql regressions tests" ;\
322	  cd ${WRKSRC}; ${MAKE_CMD} check ;\
323	 else \
324	  ${ECHO} "You cannot run regression tests when postgresql is built as user root." ; \
325	  ${ECHO} "Clean and rebuild the port as a regular user to run the tests." ;\
326	 fi
327.endif
328
329.include <bsd.port.post.mk>
330